Привет всем. Задался идей сделать хеш строки Прогульнулся по msdn и погулил. Вроде кое-как что-то написал Но... не работает Что-то я явно не понял. Вот что написал на FASM: Код (Text): format PE GUI 4.0 entry main include 'win32a.inc' section '.data' data readable writeable hProv dd ? hHash dd ? hello db 'hello', 0 temp db 64 dup(?) tempLen dd ? eBuffer rb 20 eMask db 'Error code: %d', 0 section '.code' code readable executable main: invoke lstrlen, hello mov [tempLen], eax invoke CryptAcquireContext, hProv, 0, 0, 1, 0 test eax, eax jz error invoke CryptCreateHash, [hProv], 32771, 0, 0, hHash test eax, eax jz error invoke CryptHashData, [hHash], hello, 5, 0 test eax, eax jz error invoke CryptGetHashParam, [hHash], 2, temp, tempLen, 0 test eax, eax jz error invoke CryptDestroyHash, [hHash] invoke CryptReleaseContext, [hProv] invoke MessageBox, 0, temp, hello, MB_OK invoke ExitProcess, 0 error: invoke GetLastError invoke wsprintf, eBuffer, eMask, eax invoke MessageBox, 0, eBuffer, hello, MB_OK invoke ExitProcess, 0 section '.idata' import data readable writeable library kernel32, 'kernel32.dll',\ user32, 'user32.dll',\ advapi32, 'advapi32.dll' include 'api\kernel32.inc' include 'api\user32.inc' include 'api\advapi32.inc' Оно кидает 234 ошибку: Но увеличение размера буфера ничего не дает. Спасибо
А должно ? Надо не напрямую выводить temp в MessageBox как строку, а через wsprintf преобразовать int64 в HEX и сравнить с HashCalc'ом, например
Ну это я в принципе понял. Только не понял как... Попробовал вот так: Код (Text): invoke wsprintf, hash, hashMask, temp invoke MessageBox, 0, hash, hello, MB_OK Код (Text): hash db 32 dup(?) hashMask db 'Hash: %08x%08x%08x%08x', 0 Но показывает всегда одно и то же число при любой строке
Ес-но, т.к. ты передаешь temp - постоянный адрес, а нужно значение [temp] Код (Text): hash db 40 dup(?) ;!!! 32 не хватает для заверш.0 hashMask db 'Hash: %08x %08x %08x %08x', 0 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
Ну вроде функция wsprintf требует указатели на строки, а не их значения. Я уже пробовал так подставить в скобках - "invalid operand".
Работает с уточенением - dword [temp]. Но хеш получается немного не тот Точнее совсем не тот (не совпадает не стем, что ты указал, ни который показывают онлайн-сервисы).
Ну как же не тот, если у тебя на картинке в #7 та же самая строка, что и я привел в #10 Я ж те толкую, что если в wsprintf передавать 4 dword'а, то порядок байтов будет другим, т.е. Код (Text): вместо 5d41402a bc4b2a76 b9719d91 1017c592 будет 2A40415D 762A4BBC 919D71B9 92C51710 <- каждая 4-ка байт зеркально перевернута
Ну я понял о чем ты Просто строка получается: 1dc6f4aa a2e8c5dc 0fdebeda d92c483b Code: Код (Text): format PE GUI 4.0 entry main include 'win32a.inc' section '.data' data readable writeable hProv dd ? hHash dd ? hello db 'hello', 0 temp db 64 dup(?) tempLen dd ? eBuffer rb 20 eMask db 'Error code: %d', 0 hash db 40 dup(?) hashMask db 'Hash: %08x %08x %08x %08x', 0 section '.code' code readable executable main: mov [tempLen], 64 invoke CryptAcquireContext, hProv, 0, 0, 1, 0 test eax, eax jz error invoke CryptCreateHash, [hProv], 32768 or 0 or 4, 0, 0, hHash test eax, eax jz error invoke lstrlen, hello invoke CryptHashData, [hHash], hello, eax, 0 test eax, eax jz error invoke CryptGetHashParam, [hHash], 2, temp, tempLen, 0 test eax, eax jz error invoke CryptDestroyHash, [hHash] invoke CryptReleaseContext, [hProv], 0 invoke wsprintf, hash,\ hashMask,\ dword [temp],\ dword [temp + 4],\ dword [temp + 8],\ dword [temp + 12] invoke MessageBox, 0, hash, hello, MB_OK invoke ExitProcess, 0 error: invoke GetLastError invoke wsprintf, eBuffer, eMask, eax invoke MessageBox, 0, eBuffer, hello, MB_OK invoke ExitProcess, 0 section '.idata' import data readable writeable library kernel32, 'kernel32.dll',\ user32, 'user32.dll',\ advapi32, 'advapi32.dll' include 'api\kernel32.inc' include 'api\user32.inc' include 'api\advapi32.inc'