Опознать алгоритм

Тема в разделе "WASM.CRYPTO", создана пользователем reverser, 11 окт 2007.

  1. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Нужно разреверсить проверку целостности. К сожалению, отладка недоступна, так что есть только догадки.

    Код примерно такой.
    Код (Text):
    1. crypt_1 BAB28FA5A3582BC95E463D0E7D8CABF9
    2. iv_1    8EE8A2C9F308FB91264B993F8DFDA5EC
    3.  
    4. hash = do_hash(header[0:0x40])
    5. buf1 = crypt_1
    6. buf2 = hash[0:0x10]
    7.  
    8. crypt(buf1, size=0x10, type=1, key=0, iv=iv_1)
    9. reset_key()
    10. crypt(buf2, size=0x10, type=0, key=buf1, iv=[0]*16)
    11. reset_key()
    12.  
    13. if (memcmp(header[0x40:0x50], buf2)) fail ("bad header")
    То есть:
    1) вычислить хэш первых 0x40 байт header
    2) зашифровать crypt_1 с IV=iv_1 и key=0
    3) зашифровать 16 байт хэша из (1) с key=результат (2) и IV=все нули
    4) результат (3) должен совпасть с байтами по адресу header+0x40

    Размеры buf1, buf2, iv, key - 16 байт, hash - 20 байт.
    С вероятностью 99% do_hash() - это SHA1. crypt() - это скорее всего AES-128. Параметр key используется только для type==0.

    Примеры блока header:

    Код (Text):
    1. 00: 38 39 30 30 31 2E 30 03 00 00 00 00 00 70 EF 00
    2. 10: 00 70 EF 00 80 70 EF 00 0A 0C 00 00 DC 76 C6 77
    3. 20: BB EA 47 2D 86 57 60 87 41 35 59 21 AC 15 5E 17
    4. 30: 59 23 4D 76 93 96 63 D0 26 B0 A0 EB 00 00 02 00
    5. 40: 84 1B EC 18 20 0D C6 4E F3 85 8E 7A A0 EE 0C 63
    6.  
    7. 00: 38 39 30 30 31 2E 30 03 00 00 00 00 70 A6 32 00
    8. 10: 70 A6 32 00 F0 A6 32 00 0A 0C 00 00 94 F0 9E 14
    9. 20: E4 C6 4A 15 9B 89 18 8C 25 00 43 44 2B 3B 17 5A
    10. 30: AE 8E 45 6D B1 58 55 CB A2 B4 37 62 00 00 02 00
    11. 40: B3 00 2A 61 22 09 7E F8 2B 59 27 F0 BE 49 87 E0