Добрый день. Столкнулся с непонятной проблемой, а именно какое-то странное залипание. Программа: Код (Text): .386 .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include c:\masm32\include\windows.inc include c:\masm32\include\kernel32.inc include c:\masm32\include\shell32.inc include c:\masm32\include\user32.inc include c:\masm32\include\GDI32.inc include c:\masm32\include\comdlg32.inc include c:\masm32\include\COMCTL32.inc include c:\masm32\include\cryptohash.inc include c:\masm32\include\ole32.inc include c:\masm32\include\wininet.inc include c:\masm32\include\url.inc include c:\masm32\include\masm32.inc include c:\masm32\include\wsock32.inc include c:\masm32\include\mpr.inc includelib c:\masm32\lib\mpr.lib includelib c:\masm32\lib\wsock32.lib includelib c:\masm32\lib\url.lib includelib c:\masm32\lib\wininet.lib includelib c:\masm32\lib\ole32.lib includelib c:\masm32\lib\GDI32.lib includelib c:\masm32\lib\comdlg32.lib includelib c:\masm32\lib\COMCTL32.lib includelib c:\masm32\lib\cryptohash.lib includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib includelib c:\masm32\lib\shell32.lib includelib c:\masm32\lib\masm32.lib ;######################################################################### ZeroMemory equ <RtlZeroMemory> ;####################################Объявляем переменные####################### ;;;;;;;;;;;;;константы;;;;;;;;;;;;;;; .data FileName db "md5.txt",0 FileNameASCII db "md5ASCII.txt",0 string db "test",0 stringSize = ($-string) integ dword 96 integB db 3 DUP(0) pmd5 dd ? pmd5Size dd ? hFile dd ? bWritten dd ? pmd5ASCII dd ? pmd5ASCIISize dd ? mHandle dd ? PBrutemd5 dd ? PBrute dd ? BruteSize dd 4 BruteMemH dd ? flag dd 0 pForhash dd ? ForhashSize dd ? EXTERNDEF hex_table :DWORD ;===========================НАЧИНАЕТСЯ КОД======================================= .code start: ; Выделяем память для буфера считываемых данных ;invoke GlobalAlloc,GMEM_FIXED,17 ;mov mHandle,eax ;invoke GlobalLock,eax ;mov pmd5ASCII, eax ;invoke ZeroMemory,pmd5ASCII,17 invoke GlobalAlloc,GMEM_FIXED,BruteSize invoke GlobalLock,eax push eax invoke ZeroMemory,eax,BruteSize pop eax mov dl,19h mov [eax],dl mov PBrute, eax mov ecx,1h .while ecx<=BruteSize current: mov dl,[eax] inc dl mov [eax],dl .IF dl>=7Fh jmp next .ENDIF sub eax,flag push eax push ecx ;invoke MessageBox, NULL,eax, addr string, MB_OK + MB_ICONSTOP mov pForhash,eax invoke lstrlen, eax mov ForhashSize, eax invoke MD5Init invoke MD5Update, pForhash, ForhashSize invoke MD5Final mov PBrutemd5,eax invoke ZeroMemory,PBrutemd5,16 ;invoke ZeroMemory,pmd5ASCII,16 pop ecx pop eax mov flag,0 jmp current next: inc flag mov dl,20h mov [eax],dl inc eax mov dl,[eax] .IF dl==0 .IF ecx==4 jmp finish .ENDIF mov dl,19h mov [eax],dl inc ecx .ENDIF .endw finish: invoke GlobalUnlock,PBrute invoke GlobalFree,BruteMemH ret end start Программа перебирая ASCII символы генерит строчку и считает от строки md5 хеш. Процесс генерации строки и вычисления хеша зациклен. Наращивание строки идёт через инкрементирование кода ASCII. Максимальное колличество символов в строке - 4. Суть проблемы в том, что программы при выполнении в ОС залипает оставляя загруженным процессор и что с ней происходит не очень понятно, а когда я запускаю программу в OllyDbg, то всё работает штатно, программа перебирает все символы, наращивает строку до 4 символов и завершается. У меня нет никаких идей о том, что могло пойти не так. Если есть каки-нибудь соображения - пишите. Заранее спасибо =)
ну пока читал начало были такие соображения оптимизации Код (Text): invoke GlobalAlloc,GMEM_FIXED,BruteSize invoke GlobalLock,eax push eax invoke ZeroMemory,eax,BruteSize pop eax меняем на Код (Text): invoke GlobalAlloc,64,BruteSize+1 Код (Text): mov dl,19h mov [eax],dl меняем на Код (Text): mov byte [eax], 19h и соответственно Код (Text): mov dl,[eax] inc dl mov [eax],dl .IF dl>=7Fh jmp next .ENDIF на Код (Text): inc byte [eax] cmp byte [eax], 7Fh jae next переменная флаг запросто влезает допустим в edi или esi Код (Text): .IF ecx==4 jmp finish .ENDIF проще надо быть. здесь вы опять себя заставили писать лишнего. Код (Text): cmp ecx, 4 jz finish в заключение хочу сказать - смотрите макросы т.к. до конца я не дочитал. не хватило терпения... P.S. мне казалось MD5 надо не менее 16 байт данных и увеличьте буфер выделяемый под перебор Код (Text): invoke GlobalAlloc,64,BruteSize+1
Я понимаю, что код очень далёк от оптимального, но я специально выложил такой вариант,тк по-моему так он проще для восприятия. С обращением к памяти проблем нет. Я по шагам через отладчик прогонял и визуально наблюдал как всё заносится в память. Там всё нормально. Только про макросы не очень понял.
lust 1. С макросами ты себя обманываешь и машину. Код (Text): .if ecx==0 jmp metka .endif будет длиннее для написания чем Код (Text): and ecx, ecx jz metka и чуть сложнее для машины Код (Text): cmp ecx, 0 jnz loc_endif jmp metka loc_endif: 2. Но по шагам ты наверное не успел перебрать все варианты (их всего-то 102^4=108243216) и не заметил, что длина 4х значной строки в буфере в 4 байта будет подсчитана как "немного" большая. функции требуется завершающий 0, которого нет. 3. md5 не считает хэш на буферы такого объема. Мин. размер 16 байт (хотя это зависит от реализации).
Там колличество символов хранится в ecx и когда ecx больше или равно 4, то мы вылетаем из цикла. Я в отладчике делал брейкпойнт на команду инкрементирования ecx и наблюдал что всё работает штатно. В отладчике я проходил через все значения. Это кстати на очень долго. Я не очень понял, что ты имел ввиду здесь Какую функцию ты имел ввиду? Если хеширование, то там нужно задавать отдельным параметром длину строки, и ноль в конце строки там не нужен. Насколько я знаю md5 можно посчитать от какого угодно числа. Я проверял с подсчётом md5 от одного байта и всё считалось корректно.
lust Но проверка if ecx == 4 делается только при dl == 0, но при ecx=4 у тебя dl соответсвует пятому символу PBrute[5], в котором может быть мусор, т.к. ты зануляешь только 4 символа, а нужно 5. В итоге условие не срабатывает и происходит зацикливание В режиме отладки винда увеличивает величину выделяемого блока памяти и дописывает в конец блока контрольную сигнатуру, добавляя в PBrute[5] ноль, поэтому при отладке все работает. А в "свободном полете" в конце блока остается мусор и код зацикливается Вывод: под строку всегда выделяеют на 1 символ больше под замыкающий 0
Всем огромное спасибо! Я нашёл где был засада Код (Text): mov [eax],dl mov PBrute, eax Вот в этом месте указателе становился второй байт массива, а не первый. А дальше всё происходило так, как описывает leo. leo, спасибо, твоя подсказака тоже очень полезной оказалась.