Программа "подвисает" при работе в ОС.

Тема в разделе "WASM.BEGINNERS", создана пользователем lust, 26 июн 2008.

  1. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Добрый день.
    Столкнулся с непонятной проблемой, а именно какое-то странное залипание.
    Программа:
    Код (Text):
    1.     .386
    2.       .model flat, stdcall  ; 32 bit memory model
    3.       option casemap :none  ; case sensitive
    4.  
    5.       include c:\masm32\include\windows.inc
    6.       include c:\masm32\include\kernel32.inc
    7.       include c:\masm32\include\shell32.inc
    8.       include c:\masm32\include\user32.inc
    9.       include c:\masm32\include\GDI32.inc
    10.       include c:\masm32\include\comdlg32.inc
    11.       include c:\masm32\include\COMCTL32.inc
    12.       include c:\masm32\include\cryptohash.inc
    13.       include c:\masm32\include\ole32.inc
    14.       include c:\masm32\include\wininet.inc
    15.       include c:\masm32\include\url.inc
    16.       include c:\masm32\include\masm32.inc
    17.       include c:\masm32\include\wsock32.inc
    18.       include c:\masm32\include\mpr.inc
    19.  
    20.       includelib c:\masm32\lib\mpr.lib
    21.       includelib c:\masm32\lib\wsock32.lib
    22.       includelib c:\masm32\lib\url.lib
    23.       includelib c:\masm32\lib\wininet.lib
    24.       includelib c:\masm32\lib\ole32.lib
    25.       includelib c:\masm32\lib\GDI32.lib
    26.       includelib c:\masm32\lib\comdlg32.lib
    27.       includelib c:\masm32\lib\COMCTL32.lib
    28.       includelib c:\masm32\lib\cryptohash.lib
    29.       includelib c:\masm32\lib\user32.lib
    30.       includelib c:\masm32\lib\kernel32.lib
    31.       includelib c:\masm32\lib\shell32.lib
    32.       includelib c:\masm32\lib\masm32.lib
    33. ;#########################################################################
    34. ZeroMemory equ <RtlZeroMemory>
    35. ;####################################Объявляем  переменные#######################
    36.  
    37. ;;;;;;;;;;;;;константы;;;;;;;;;;;;;;;
    38.    
    39. .data
    40. FileName db "md5.txt",0
    41. FileNameASCII db "md5ASCII.txt",0
    42. string  db "test",0
    43. stringSize = ($-string)
    44.  
    45. integ dword 96
    46. integB  db 3 DUP(0)
    47.  
    48. pmd5 dd ?
    49. pmd5Size dd ?
    50.  
    51. hFile dd ?
    52. bWritten dd ?
    53.  
    54.  
    55. pmd5ASCII   dd ?
    56. pmd5ASCIISize   dd ?
    57. mHandle     dd ?
    58.  
    59. PBrutemd5   dd ?
    60. PBrute      dd ?
    61. BruteSize   dd 4
    62. BruteMemH   dd ?
    63.  
    64. flag        dd 0
    65.  
    66.  
    67. pForhash    dd ?
    68. ForhashSize dd ?
    69.  
    70. EXTERNDEF hex_table :DWORD
    71. ;===========================НАЧИНАЕТСЯ КОД=======================================
    72. .code
    73.  
    74.  
    75.  
    76.  
    77. start:
    78.  
    79. ; Выделяем память для буфера  считываемых данных
    80. ;invoke GlobalAlloc,GMEM_FIXED,17  
    81. ;mov mHandle,eax
    82. ;invoke GlobalLock,eax
    83. ;mov pmd5ASCII, eax
    84. ;invoke ZeroMemory,pmd5ASCII,17
    85.  
    86.  
    87.  
    88.  
    89.  
    90. invoke GlobalAlloc,GMEM_FIXED,BruteSize  
    91. invoke GlobalLock,eax
    92. push eax
    93. invoke ZeroMemory,eax,BruteSize
    94. pop eax
    95. mov dl,19h
    96. mov [eax],dl
    97. mov PBrute, eax
    98. mov ecx,1h
    99.  
    100. .while ecx<=BruteSize
    101.  
    102.  
    103.  
    104.     current:
    105.  
    106.         mov dl,[eax]
    107.         inc dl
    108.         mov [eax],dl
    109.         .IF dl>=7Fh
    110.             jmp next
    111.         .ENDIF
    112.         sub eax,flag
    113.         push eax
    114.         push ecx
    115.         ;invoke  MessageBox, NULL,eax, addr string, MB_OK + MB_ICONSTOP
    116.    
    117.     mov pForhash,eax
    118.     invoke lstrlen, eax
    119.     mov ForhashSize, eax
    120.     invoke MD5Init
    121.     invoke MD5Update, pForhash, ForhashSize
    122.     invoke MD5Final
    123.     mov PBrutemd5,eax
    124.  
    125.     invoke ZeroMemory,PBrutemd5,16
    126.     ;invoke ZeroMemory,pmd5ASCII,16
    127.    
    128.        
    129.    
    130.        
    131.  
    132.         pop ecx
    133.         pop eax
    134.         mov flag,0
    135.         jmp current
    136.     next:
    137.         inc flag
    138.        
    139.         mov dl,20h
    140.         mov [eax],dl
    141.        
    142.         inc eax
    143.        
    144.         mov dl,[eax]
    145.         .IF dl==0      
    146.             .IF ecx==4
    147.                 jmp finish
    148.             .ENDIF
    149.             mov dl,19h
    150.             mov [eax],dl
    151.             inc ecx
    152.  
    153.         .ENDIF
    154.        
    155.            
    156.  
    157. .endw
    158.  
    159. finish:
    160.  
    161. invoke GlobalUnlock,PBrute
    162. invoke GlobalFree,BruteMemH
    163. ret
    164. end start
    Программа перебирая ASCII символы генерит строчку и считает от строки md5 хеш. Процесс генерации строки и вычисления хеша зациклен. Наращивание строки идёт через инкрементирование кода ASCII. Максимальное колличество символов в строке - 4.

    Суть проблемы в том, что программы при выполнении в ОС залипает оставляя загруженным процессор и что с ней происходит не очень понятно, а когда я запускаю программу в OllyDbg, то всё работает штатно, программа перебирает все символы, наращивает строку до 4 символов и завершается. У меня нет никаких идей о том, что могло пойти не так. Если есть каки-нибудь соображения - пишите.
    Заранее спасибо =)
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну пока читал начало были такие соображения оптимизации
    Код (Text):
    1. invoke GlobalAlloc,GMEM_FIXED,BruteSize  
    2. invoke GlobalLock,eax
    3. push eax
    4. invoke ZeroMemory,eax,BruteSize
    5. pop eax
    меняем на
    Код (Text):
    1. invoke GlobalAlloc,64,BruteSize+1
    Код (Text):
    1. mov dl,19h
    2. mov [eax],dl
    меняем на
    Код (Text):
    1. mov byte [eax], 19h
    и соответственно
    Код (Text):
    1.     mov dl,[eax]
    2. inc dl
    3. mov [eax],dl
    4. .IF dl>=7Fh
    5. jmp next
    6. .ENDIF
    на
    Код (Text):
    1. inc byte [eax]
    2. cmp byte [eax], 7Fh
    3. jae next
    переменная флаг запросто влезает допустим в edi или esi
    Код (Text):
    1.             .IF ecx==4
    2.                 jmp finish
    3.             .ENDIF
    проще надо быть. здесь вы опять себя заставили писать лишнего.
    Код (Text):
    1. cmp ecx, 4
    2. jz finish
    в заключение хочу сказать - смотрите макросы т.к. до конца я не дочитал. не хватило терпения...
    P.S. мне казалось MD5 надо не менее 16 байт данных и увеличьте буфер выделяемый под перебор
    Код (Text):
    1. invoke GlobalAlloc,64,BruteSize+1
     
  3. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Я понимаю, что код очень далёк от оптимального, но я специально выложил такой вариант,тк по-моему так он проще для восприятия. С обращением к памяти проблем нет. Я по шагам через отладчик прогонял и визуально наблюдал как всё заносится в память. Там всё нормально. Только про макросы не очень понял.
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    lust
    1. С макросами ты себя обманываешь и машину.
    Код (Text):
    1. .if ecx==0
    2.   jmp metka
    3. .endif
    будет длиннее для написания чем
    Код (Text):
    1. and ecx, ecx
    2. jz metka
    и чуть сложнее для машины
    Код (Text):
    1. cmp ecx, 0
    2. jnz loc_endif
    3. jmp metka
    4. loc_endif:
    2. Но по шагам ты наверное не успел перебрать все варианты (их всего-то 102^4=108243216) и не заметил, что длина 4х значной строки в буфере в 4 байта будет подсчитана как "немного" большая. функции требуется завершающий 0, которого нет.
    3. md5 не считает хэш на буферы такого объема. Мин. размер 16 байт (хотя это зависит от реализации).
     
  5. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Там колличество символов хранится в ecx и когда ecx больше или равно 4, то мы вылетаем из цикла. Я в отладчике делал брейкпойнт на команду инкрементирования ecx и наблюдал что всё работает штатно. В отладчике я проходил через все значения. Это кстати на очень долго.

    Я не очень понял, что ты имел ввиду здесь

    Какую функцию ты имел ввиду? Если хеширование, то там нужно задавать отдельным параметром длину строки, и ноль в конце строки там не нужен.

    Насколько я знаю md5 можно посчитать от какого угодно числа. Я проверял с подсчётом md5 от одного байта и всё считалось корректно.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    lust
    Но проверка if ecx == 4 делается только при dl == 0, но при ecx=4 у тебя dl соответсвует пятому символу PBrute[5], в котором может быть мусор, т.к. ты зануляешь только 4 символа, а нужно 5. В итоге условие не срабатывает и происходит зацикливание
    В режиме отладки винда увеличивает величину выделяемого блока памяти и дописывает в конец блока контрольную сигнатуру, добавляя в PBrute[5] ноль, поэтому при отладке все работает. А в "свободном полете" в конце блока остается мусор и код зацикливается
    Вывод: под строку всегда выделяеют на 1 символ больше под замыкающий 0
     
  7. lust

    lust New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2007
    Сообщения:
    72
    Всем огромное спасибо!
    Я нашёл где был засада
    Код (Text):
    1. mov [eax],dl
    2. mov PBrute, eax
    Вот в этом месте указателе становился второй байт массива, а не первый. А дальше всё происходило так, как описывает leo.
    leo, спасибо, твоя подсказака тоже очень полезной оказалась.