Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

тъпа checksum_16
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=16325
Страница 1 от 2

Автор:  TheWizard [ Сря Яну 23, 2019 8:22 am ]
Заглавие:  тъпа checksum_16

нящо се омотах...
някой срещал ли е подобна калкулация, така ми е показва IDA-та,
а ми трябва да я транслирам на питон...
бях я направил: сбора на всички байтове в масива - работеше, ся не :)

Код:
uint16_t checksum(uint8_t * data, int len){
    uint16_t hi = 0, lo = 0, r = 0;
    int i = 0;
    if (len >= 2) {
        for(i; i < len; i += 2) {
            lo += *data++;
            hi += *data++;
        }
    }
    if (len > i)
        r = *data;
    return r + hi + lo;
}

Автор:  ps66 [ Сря Яну 23, 2019 9:22 am ]
Заглавие:  Re: тъпа checksum_16

виж колко е 'i' в началото

Автор:  TheWizard [ Сря Яну 23, 2019 9:38 am ]
Заглавие:  Re: тъпа checksum_16

i = 0 ... преписал съм я грешно
всъщност май е сума на буфера align 16
сега ще я имитирам в питона

Автор:  Н'бабане Гт'муан'га [ Сря Яну 23, 2019 2:39 pm ]
Заглавие:  Re: тъпа checksum_16

CRC16 не е сбора на всички байтове. Малко по-сложно е от това

Автор:  TheWizard [ Сря Яну 23, 2019 3:40 pm ]
Заглавие:  Re: тъпа checksum_16

не е CRC16, просто няква Mediatek тъпа чексума

всъщност функцията ми в питона е верна ... проблема е друг да го е ...

Автор:  bateAz [ Сря Яну 23, 2019 8:16 pm ]
Заглавие:  Re: тъпа checksum_16

Това по какъв алгоритъм трябва да го сметне? Каква е машината, що за индианец е? Процесорът поддържа ли работа с неподравнен int ?

Автор:  TheWizard [ Сря Яну 23, 2019 9:29 pm ]
Заглавие:  Re: тъпа checksum_16

firmware uploader - за GSM модул - Mediatek чипсет....
праща firmware на части [4096] .... за всяка част, чек-сумата е SUM_16 на байтовете ... туй ОК
и накрая тая чек сума SUM_16, която обхваща всички изпратени данни, която разрешава изтриването и началото на запис

обаче проблема е че, на чипсета му е чекната "write-protection" - прави чек сума на старата първа част, която се явява начална стойност на новата SUM_16
с не"protection" модули работи ... дмек тръгва от нула
но със - незнам кой е флага че е протектнат, и някакси трябва да намеря как смята старата страница

уплоадера го писах на питон за интеграцията в PlatformIO IDE, така сичко работи на "всички" OS
https://github.com/Wiz-IO/Mediatek-MT26 ... 25.py#L330

Автор:  palavrov [ Сря Яну 23, 2019 11:23 pm ]
Заглавие:  Re: тъпа checksum_16

Кода който си постнал въобще не е sum16 ами си е sum8 - само, че пишман оптимизирано да чете по 16 битови думи - пишман защото требваше първо да подравни поне на 16 или 32 бита адреса.

Автор:  TheWizard [ Сря Яну 23, 2019 11:45 pm ]
Заглавие:  Re: тъпа checksum_16

така ми го даде IDA-та (дезасемблирах DLL-a да видя командите), аз го "пооправих" като за форума
те са подравнени на 4096 на входа, което е кратно на uint16, само изравнява края...

Код:
__int16 __cdecl CHECK_SUM_WRITE(signed int len)
{
  int v1; // ecx
  unsigned int LEN; // edx
  unsigned int i; // eax
  int R; // ebx
  __int16 HI; // di
  __int16 LO; // si
  __int16 hi; // bp
  int H; // [esp+4h] [ebp-8h]
  int L; // [esp+8h] [ebp-4h]

  LEN = len;
  i = 0;
  R = 0;
  L = 0;
  H = 0;
  if ( len >= 2 )
  {
    HI = 0;
    LO = 0;
    do
    {
      LO += *(unsigned __int8 *)(v1 + i);
      hi = *(unsigned __int8 *)(v1 + i + 1);
      i += 2;
      HI += hi;
    }
    while ( i < len - 1 );
    LEN = len;
    LOWORD(H) = HI;
    LOWORD(L) = LO;
  }
  if ( i < LEN )
    R = *(unsigned __int8 *)(i + v1);
  return R + L + H;
}

Автор:  palavrov [ Сря Яну 23, 2019 11:59 pm ]
Заглавие:  Re: тъпа checksum_16

Пак същото - sum8 - щом връща L+H

Обаче ако можеш да го постнеш дизасемблирано на асемблер, че нещо ми намирисва C сорса ....

Автор:  TheWizard [ Чет Яну 24, 2019 12:10 am ]
Заглавие:  Re: тъпа checksum_16

Код:
.text:1001F860 CHECK_SUM_WRITE proc near               ; CODE XREF: CMD_WriteData+8ED↓p
.text:1001F860
.text:1001F860 H               = dword ptr -8
.text:1001F860 L               = dword ptr -4
.text:1001F860 len             = dword ptr  4
.text:1001F860 dat             = dword ptr  8
.text:1001F860
.text:1001F860                 sub     esp, 8
.text:1001F863                 mov     edx, [esp+8+len]
.text:1001F867                 xor     eax, eax
.text:1001F869                 push    ebx
.text:1001F86A                 xor     ebx, ebx
.text:1001F86C                 mov     [esp+0Ch+L], eax
.text:1001F870                 mov     [esp+0Ch+H], eax
.text:1001F874                 cmp     edx, 2
.text:1001F877                 jl      short loc_1001F8AA
.text:1001F879                 push    ebp
.text:1001F87A                 push    esi
.text:1001F87B                 push    edi
.text:1001F87C                 dec     edx
.text:1001F87D                 mov     di, ax
.text:1001F880                 mov     si, ax
.text:1001F883
.text:1001F883 loc_1001F883:                           ; CODE XREF: CHECK_SUM_WRITE+37↓j
.text:1001F883                 movzx   ebp, byte ptr [ecx+eax]
.text:1001F887                 add     si, bp
.text:1001F88A                 movzx   ebp, byte ptr [ecx+eax+1]
.text:1001F88F                 add     eax, 2
.text:1001F892                 add     di, bp
.text:1001F895                 cmp     eax, edx
.text:1001F897                 jb      short loc_1001F883
.text:1001F899                 mov     edx, [esp+18h+len]
.text:1001F89D                 mov     word ptr [esp+18h+H], di
.text:1001F8A2                 pop     edi
.text:1001F8A3                 mov     word ptr [esp+14h+L], si
.text:1001F8A8                 pop     esi
.text:1001F8A9                 pop     ebp
.text:1001F8AA
.text:1001F8AA loc_1001F8AA:                           ; CODE XREF: CHECK_SUM_WRITE+17↑j
.text:1001F8AA                 cmp     eax, edx
.text:1001F8AC                 jnb     short loc_1001F8B2
.text:1001F8AE                 movzx   ebx, byte ptr [eax+ecx]
.text:1001F8B2
.text:1001F8B2 loc_1001F8B2:                           ; CODE XREF: CHECK_SUM_WRITE+4C↑j
.text:1001F8B2                 mov     eax, [esp+0Ch+H]
.text:1001F8B6                 add     eax, [esp+0Ch+L]
.text:1001F8BA                 add     eax, ebx
.text:1001F8BC                 pop     ebx
.text:1001F8BD                 add     esp, 8
.text:1001F8C0                 retn
.text:1001F8C0 CHECK_SUM_WRITE endp
.text:1001F8C0
.text:1001F8C0 ; ---------------------------------------------------------------------------
.text:1001F8C1                 align 10h

Автор:  TheWizard [ Чет Яну 24, 2019 12:16 am ]
Заглавие:  Re: тъпа checksum_16

зае.и ...
тва се изясни, ще търся "протекшъна" ... до тогава -викам EXE-то в конзолата,
не можах да намеря на Медиятека линукс варианта

Автор:  TheWizard [ Чет Яну 24, 2019 12:34 pm ]
Заглавие:  Re: тъпа checksum_16

голям съм чайник...
няма никва защита (има AES криптиране но, не е реализирано от джикитайците)
опитвам се да запиша първия блок данни, който по адрес не е подравнен с flash erase page :)
бут-лоадера си мери чека(SUM) и реве
това го правя за последния блок данни, но за първия кой да се сети...

Автор:  palavrov [ Чет Яну 24, 2019 1:06 pm ]
Заглавие:  Re: тъпа checksum_16

... мдам ... това което ме съмняваше е разликата между C сорса и дизасемблира:
  • в C сорса v1 се ползва без да е декларирано и присвоено каквото и да е
  • интересно, че в дизасемблера len се подава като параметър в стека, а dat е в регистър ECX - малко странно ми идва компилаторската конвенция - първи параметър в регистър, втори в стека - обикновенно поне 2-3 са в регистри
та затова исках да го видя - общо взето наистина е пишман оптимизиран на ръка C сорс който върти в цикъл sum16 и накрая връща като резултат sum8 - което пък от своя страна говори много за програмиста дето го е писал :D

Автор:  TheWizard [ Чет Яну 24, 2019 2:44 pm ]
Заглавие:  Re: тъпа checksum_16

... може и да съм бърникал из асемблера ... всъщност чексумата e сума на всички байтове закръглено на uint16


да го еа .....
Код:
............................................ /бут
--> B2082770000000400000001000 /cmd write to address, size
<-- 5A5A / ok
--> 4096 байта
--> 794E /част 1 сума
<-- 69 /ok
............................................/части, части..
--> 4096 байта
--> 6694 /част послена сума
<-- 69 /ok
<-- 5A /ок
--> 273D // тотал сума
<-- 5A /ok
--> A5 /ok
<-- 5A /ok
Application sent

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/