начало http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=11205 Код (Text): proc lvCompare, lParam1, lParam2, lParamSort [b]int 3[/b] ... endp Без int 3 в процедуре, OLLY начала останавливать в непонятных местах, выдавая сообщения 'INT 3 command at ntdll.DbgBreakPoint'. При наличии int 3 ситуация таже самая. В настройках OLLY выставляю 'ignore INT 3 breaks' и ставлю int 3 как в коде выше. OLLY останавливает на int 3 внутри процедуры и пишет 'Debugged program was unable to process exception'. Программа работает правильно, но процесс отладки почти невозможен. До первой попытки вставки int 3 в код ничего подобного на происходило. Cижу на 2Ksp4, на ХР таже проблема. Никогда с подобным не встречался, подскажите как вылечить.
Не надо так делать, 'Debugged program was unable to process exception' и возникает из-за того, что ты отключил обработчик int3, твоя программа ведь сама не обрабатывает исключения ... & Это как? поставил int3 начались глюки, убрал int3 - глюки остались? бр... давай подробно в чем выражается и код желательно Попробовал на Listview.exe из папки MASM\Examle7 в процедуре ListViewSort с int3 - все нормально отлаживается
удали соответсвующие .udd и .bak файлы из директории проектов OllyDbg, чтобы при следубщей загрузке файла OllyDbg заново проанализировал файл + см. ответ bogrus про
В аттаче результаты olly и gobug, красными стрелками показано проблемное место (и таких мест во время отладки появляется много). Под 98se при трейсе этих мест оба дебаггера не пошли на следующую команду, а просто запустили прогу, а под 2k olly выдала 'INT 3 command at ntdll.DbgBreakPoint'. Может это FASM так код генерит (или оптимизирует), т.к. подобное я увидел даже в самых простейших приложения. _212693597__1.gif
В olly можно трассировать пошагово, нажав F7 при call мы попадем внутрь ф-ции, а можно пропускать вызовы ф-ций (жать F8, иначе задолбаемся лазить по системным библиотекам), olly для этого ставит бряк на следующую за call инструкцию и мы останавливаемся при её выполнении В твоем случае после call (где красная стрелка) идет не код, а lpWindowName для CreateWindowEx
Обычно передача параметров идет так: Код (Text): ;===================================================================== invoke CreateWindowEx,0,class,title,WS_VISIBLE+WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,[wc.hInsta nce],0 ;===================================================================== 0040107A |. 6A 00 PUSH 0 ; /lParam = NULL 0040107C |. FF35 10104000 PUSH DWORD PTR [401010] ; |hInst = 00400000 00401082 |. 6A 00 PUSH 0 ; |hMenu = NULL 00401084 |. 6A 00 PUSH 0 ; |hParent = NULL 00401086 |. 68 00800000 PUSH 8000 ; |Height = 8000 (32768.) 0040108B |. 68 00800000 PUSH 8000 ; |Width = 8000 (32768.) 00401090 |. 68 00800000 PUSH 8000 ; |Y = 8000 (32768.) 00401095 |. 68 00800000 PUSH 8000 ; |X = 8000 (32768.) 0040109A |. 68 0000CF10 PUSH 10CF0000 ; |Style = WS_OVERLAPPED| 0040109F |. 68 44104000 PUSH 00401044 ; |WindowName = "title" 004010A4 |. 68 4A104000 PUSH 0040104A ; |Class = "class" 004010A9 |. 6A 00 PUSH 0 ; |ExtStyle = 0 004010AB |. FF15 C6114000 CALL [<&user32.CreateWindowExA>] ; \CreateWindowExA ;===================================================================== А у тебя, судя по картинке, вообще черти чшо Код (Text): ;===================================================================== ... call @f db ...'0.01' ; что за имя ??? @@: db 0 ; почему сюда ??? push class push 0 call CreateWindowExA ;=====================================================================
Вот по-этому то я и спрашиваю. В общем попробуйте сами. Прога - создание меню, компилирована fasm console v1.60. Засуньте аттач в olly и посмотрите что она вам выдаст.
Код (Text): invoke CreateWindowEx,WS_EX_TOOLWINDOW,_class,[b]''[/b],\ WS_OVERLAPPEDWINDOW,200,200,300,200,0,0,[hinstance],0 Ну, и что это у тебя за скобки? Где ты видел такой пример, ты MSDN вообще смотрел?
Я понимаю, тогда что тебе не нравится в твоем 1754462494__menu.rar, на что жалуетесь? Он ведь совсем не совпадает с _212693597__1.gif, надо было тот код показать
Вот всё вместе, скриншот от дебага именно menu.exe, только вот проблема таже самая что и на первом скриншоте, и на втором, и во многих других прогах.
Все равно аттач не от первой картинки (где черти чшо), тут нормально (только db 0, указатель на пустой lpWindowName), ну не в этом дело ... Прога абсолютно обычная и отлаживается как все, ты не можешь нажать F7 чтобы пройти по стрелке или ты не знаешь почему '' компилится в call @f \ db 0 \ @@: push 401000?
Забудь про первую картинку, она из проги под 50кб, не думаю что кто-то захочет в ней копаться, факт в том что проблема аналогичная. По F7 переходит по адресу (или если такого адреса нет, то на следующую строку), а по F8 сообщает 'it looks like you`re trying to set breakpoind on the data'. Разве это нормально? В общем да, интересно узнать откуда эта бредятина берётся.
Видимо это прибамбас fasm 1.60(?), т.к. 1.56 пушит lpWindowName = '' просто как push 0. А тут получается именно как указатель на нулевой байт. Хоть и хитро и непривычно, но правильно, т.к. call пушит указатель на следующий за ним нулевой байт и идет на следующую инструкцию push Код (Text): call @F ;пушит "адрес возврата" = lpWindowName = '' db 0 ;<- это и есть lpWindowName = '' @@: push 401000 PS: передавай указатель на пустую строку как 0 или NULL и не парься
Ещё как нормально, так олли предупреждает по F8, что за call будет установлен бряк, но там данные а не код, по-этому он не сработает - прога запустится, только не говори что Ollydbg.hlp не при чем Там где ты скобки взял, и фасм возможно старый в шоке от них, последний скомпилил в push 0, leo уже сказал
Понял вот что: FASM генерит странный код если передавать строковые переметры прямо в функцию. Код (Text): странно, но правильно: invoke CreateWindowEx,WS_EX_TOOLWINDOW,_class, 'prog1',\ WS_OVERLAPPEDWINDOW,200,200,300,200,0,0,[hinst],0 абсолютно правильно: progname db 'prog1',0 invoke CreateWindowEx,WS_EX_TOOLWINDOW,_class, progname,\ WS_OVERLAPPEDWINDOW,200,200,300,200,0,0,[hinst],0 Причём это относится ко всем функциям. Спасибо всем за объяснения!
Если подключать win32a.inc, то новый фасм не даст такое скомпилить, только при win32ax.inc (там макрос для этого)
Если кому-то ещё интересно, настройки OLLY: debugging options -> analysis1 -> decode tricky code sequences. из Код (Text): invoke CreateWindowEx,WS_EX_TOOLWINDOW,_class, 'prog1',\ WS_OVERLAPPEDWINDOW,200,200,300,200,0,0,[hinst],0 004030B4 .>PUSH 0 004030B6 .>PUSH [DWORD 40114C] 004030BC .>PUSH 0 004030BE .>PUSH 0 004030C0 .>PUSH 190 004030C5 .>PUSH 190 004030CA .>PUSH EAX 004030CB .>PUSH EBX 004030CC .>PUSH 0CF0000 004030D1 .>CALL prog.004030DC 004030D6 .>JO SHORT prog.0040314A 004030D8 .>OUTSD ; I/O command 004030D9 .>XOR [DWORD BX+SI],EAX 004030DC /$>PUSH prog.004011BC ; |Class = "win32class" 004030E1 |.>PUSH 0 ; |ExtStyle = 0 004030E3 |.>CALL [DWORD <&USER32.CreateWindowExA>] ; \CreateWindowExA делает Код (Text): 004030B4 |.>PUSH 0 004030B6 |.>PUSH [DWORD 40114C] 004030BC |.>PUSH 0 004030BE |.>PUSH 0 004030C0 |.>PUSH 190 004030C5 |.>PUSH 190 004030CA |.>PUSH EAX 004030CB |.>PUSH EBX 004030CC |.>PUSH 0CF0000 004030D1 |.>CALL prog.004030DC ; PUSH ASCII "prog1" 004030D6 |.>ASCII "prog1",0 004030DC |>>PUSH prog.004011BC ; |Class = "win32class" 004030E1 |.>PUSH 0 ; |ExtStyle = 0 004030E3 |.>CALL [DWORD <&USER32.CreateWindowExA>] ; \CreateWindowExA