подсчет md5 суммы строки

Тема в разделе "WASM.BEGINNERS", создана пользователем e4key, 15 сен 2009.

  1. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Привет всем. Задался идей сделать хеш строки :)

    Прогульнулся по msdn и погулил. Вроде кое-как что-то написал :) Но... не работает :) Что-то я явно не понял.

    Вот что написал на FASM:

    Код (Text):
    1. format PE GUI 4.0
    2. entry main
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.   hProv         dd ?
    8.   hHash         dd ?
    9.   hello         db 'hello', 0
    10.   temp          db 64 dup(?)
    11.   tempLen       dd ?
    12.  
    13.   eBuffer       rb 20
    14.   eMask         db 'Error code: %d', 0
    15.  
    16. section '.code' code readable executable
    17.   main:
    18.         invoke  lstrlen, hello
    19.         mov     [tempLen], eax
    20.  
    21.         invoke  CryptAcquireContext, hProv, 0, 0, 1, 0
    22.         test    eax, eax
    23.         jz      error
    24.  
    25.         invoke  CryptCreateHash, [hProv], 32771, 0, 0, hHash
    26.         test    eax, eax
    27.         jz      error
    28.  
    29.         invoke  CryptHashData, [hHash], hello, 5, 0
    30.         test    eax, eax
    31.         jz      error
    32.  
    33.         invoke  CryptGetHashParam, [hHash], 2, temp, tempLen, 0
    34.         test    eax, eax
    35.         jz      error
    36.  
    37.         invoke  CryptDestroyHash, [hHash]
    38.         invoke  CryptReleaseContext, [hProv]
    39.         invoke  MessageBox, 0, temp, hello, MB_OK
    40.         invoke  ExitProcess, 0
    41.  
    42.   error:
    43.         invoke  GetLastError
    44.         invoke  wsprintf, eBuffer, eMask, eax
    45.         invoke  MessageBox, 0, eBuffer, hello, MB_OK
    46.         invoke  ExitProcess, 0
    47.  
    48. section '.idata' import data readable writeable
    49.   library kernel32, 'kernel32.dll',\
    50.           user32, 'user32.dll',\
    51.           advapi32, 'advapi32.dll'
    52.  
    53.  
    54.   include 'api\kernel32.inc'
    55.   include 'api\user32.inc'
    56.   include 'api\advapi32.inc'
    Оно кидает 234 ошибку:
    Но увеличение размера буфера ничего не дает. Спасибо :)
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а посмотреть сколько она просит (
    )
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Надо не размер буфера увеличивать, а установить templen = 64 перед вызовом CryptGetHashParam
     
  4. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    А точно :) Посмотрел - 4199438 байт. А почему так много?
     
  5. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    leo, а вроде tempLen и содержит значение 64:

    Код (Text):
    1. invoke  lstrlen, hello
    2. mov     [tempLen], eax
     
  6. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Упс перепутал маленько переменные :)
     
  7. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Сейчас работает, но на md5-хеш это ну уж никак не похоже... [​IMG]
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А должно ? Надо не напрямую выводить temp в MessageBox как строку, а через wsprintf преобразовать int64 в HEX и сравнить с HashCalc'ом, например
     
  9. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Ну это я в принципе понял. Только не понял как... Попробовал вот так:

    Код (Text):
    1. invoke  wsprintf, hash, hashMask, temp
    2. invoke  MessageBox, 0, hash, hello, MB_OK
    Код (Text):
    1. hash          db 32 dup(?)
    2. hashMask      db 'Hash: %08x%08x%08x%08x', 0
    Но показывает всегда одно и то же число при любой строке :)
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ес-но, т.к. ты передаешь temp - постоянный адрес, а нужно значение [temp]
    Код (Text):
    1. hash          db 40 dup(?)   ;!!! 32 не хватает для заверш.0
    2. hashMask      db 'Hash: %08x %08x %08x %08x', 0
    3.  
    4. invoke wsprintf, hash, hashMask, [temp],[temp+4],[temp+8],[temp+12]
    Правда при этом хэш будет выведен не в качестве сплошной строки, а в виде 4-х двордов (с обратным порядком байт в каждом дворде). Для получения сплошной Hex-строки можно заюзать CryptBinaryToStringA (разделяет байты пробелами), ну или в wsprintf по байту выводить, или свой простенький цикл преобразования замутить - большой простор для творчества ;)

    PS: Да похоже правильное значение у тебя получилось. Для 'hello' должно быть:
    строка: ]A@*јK*v№qќ‘Е’
    HEX: 5d 41 40 2a bc 4b 2a 76 b9 71 9d 91 10 17 c5 92
     
  11. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Ну вроде функция wsprintf требует указатели на строки, а не их значения. Я уже пробовал так подставить в скобках - "invalid operand".
     
  12. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Упс, ошибся: invalid size of operand.

    ps. спасибо)
     
  13. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Работает с уточенением - dword [temp]. Но хеш получается немного не тот :) Точнее совсем не тот (не совпадает не стем, что ты указал, ни который показывают онлайн-сервисы).
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ну как же не тот, если у тебя на картинке в #7 та же самая строка, что и я привел в #10
    Я ж те толкую, что если в wsprintf передавать 4 dword'а, то порядок байтов будет другим, т.е.
    Код (Text):
    1. вместо 5d41402a bc4b2a76  b9719d91 1017c592
    2. будет 2A40415D 762A4BBC 919D71B9 92C51710 <- каждая 4-ка байт зеркально перевернута
     
  15. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Ну я понял о чем ты :) Просто строка получается: 1dc6f4aa a2e8c5dc 0fdebeda d92c483b

    Code:
    Код (Text):
    1. format PE GUI 4.0
    2. entry main
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.   hProv         dd ?
    8.   hHash         dd ?
    9.   hello         db 'hello', 0
    10.   temp          db 64 dup(?)
    11.   tempLen       dd ?
    12.  
    13.   eBuffer       rb 20
    14.   eMask         db 'Error code: %d', 0
    15.  
    16.   hash          db 40 dup(?)
    17.   hashMask      db 'Hash: %08x %08x %08x %08x', 0
    18.  
    19. section '.code' code readable executable
    20.   main:
    21.         mov     [tempLen], 64
    22.  
    23.         invoke  CryptAcquireContext, hProv, 0, 0, 1, 0
    24.         test    eax, eax
    25.         jz      error
    26.  
    27.         invoke  CryptCreateHash, [hProv], 32768 or 0 or 4, 0, 0, hHash
    28.         test    eax, eax
    29.         jz      error
    30.  
    31.         invoke  lstrlen, hello
    32.         invoke  CryptHashData, [hHash], hello, eax, 0
    33.         test    eax, eax
    34.         jz      error
    35.  
    36.         invoke  CryptGetHashParam, [hHash], 2, temp, tempLen, 0
    37.         test    eax, eax
    38.         jz      error
    39.  
    40.         invoke  CryptDestroyHash, [hHash]
    41.         invoke  CryptReleaseContext, [hProv], 0
    42.  
    43.         invoke  wsprintf, hash,\
    44.                           hashMask,\
    45.                           dword [temp],\
    46.                           dword [temp + 4],\
    47.                           dword [temp + 8],\
    48.                           dword [temp + 12]
    49.         invoke  MessageBox, 0, hash, hello, MB_OK
    50.         invoke  ExitProcess, 0
    51.  
    52.   error:
    53.         invoke  GetLastError
    54.         invoke  wsprintf, eBuffer, eMask, eax
    55.         invoke  MessageBox, 0, eBuffer, hello, MB_OK
    56.         invoke  ExitProcess, 0
    57.  
    58. section '.idata' import data readable writeable
    59.   library kernel32, 'kernel32.dll',\
    60.           user32, 'user32.dll',\
    61.           advapi32, 'advapi32.dll'
    62.  
    63.  
    64.   include 'api\kernel32.inc'
    65.   include 'api\user32.inc'
    66.   include 'api\advapi32.inc'
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А откуда 32758 взялось, если нужно 32771 = 8003h ?!
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    32756 or 4 = 8004h = CALG_SHA1
     
  18. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Ах да точно :) Это я пытался получить sha1. Теперь все отлично!

    Спасибо огромное тебе!)