продолжение дебага сообщения LVM_SORTITEMS

Тема в разделе "WASM.BEGINNERS", создана пользователем veach1, 19 авг 2005.

  1. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
    начало

    http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=11205


    Код (Text):
    1.  
    2. proc lvCompare, lParam1, lParam2, lParamSort
    3.      [b]int 3[/b]
    4.      ...
    5. endp
    6.  




    Без 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, на ХР таже проблема. Никогда с подобным не встречался, подскажите как вылечить.
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Не надо так делать, 'Debugged program was unable to process exception' и возникает из-за того, что ты отключил обработчик int3, твоя программа ведь сама не обрабатывает исключения ...



    &




    Это как? поставил int3 начались глюки, убрал int3 - глюки остались? бр... давай подробно в чем выражается и код желательно







    Попробовал на Listview.exe из папки MASM\Examle7 в процедуре ListViewSort с int3 - все нормально отлаживается
     
  3. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia


    удали соответсвующие .udd и .bak файлы из директории проектов OllyDbg, чтобы при следубщей загрузке файла OllyDbg заново проанализировал файл

    + см. ответ bogrus про
     
  4. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
    В аттаче результаты olly и gobug, красными стрелками показано проблемное место (и таких мест во время отладки появляется много). Под 98se при трейсе этих мест оба дебаггера не пошли на следующую команду, а просто запустили прогу, а под 2k olly выдала 'INT 3 command at ntdll.DbgBreakPoint'.



    Может это FASM так код генерит (или оптимизирует), т.к. подобное я увидел даже в самых простейших приложения.

    [​IMG] _212693597__1.gif
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    В olly можно трассировать пошагово, нажав F7 при call мы попадем внутрь ф-ции, а можно пропускать вызовы ф-ций (жать F8, иначе задолбаемся лазить по системным библиотекам), olly для этого ставит бряк на следующую за call инструкцию и мы останавливаемся при её выполнении



    В твоем случае после call (где красная стрелка) идет не код, а lpWindowName для CreateWindowEx
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Обычно передача параметров идет так:
    Код (Text):
    1. ;=====================================================================
    2. invoke   CreateWindowEx,0,class,title,WS_VISIBLE+WS_OVERLAPPEDWINDOW,\
    3.          CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,[wc.hInsta nce],0
    4. ;=====================================================================
    5. 0040107A |.  6A 00          PUSH    0                           ; /lParam = NULL
    6. 0040107C |.  FF35 10104000  PUSH    DWORD PTR [401010]          ; |hInst = 00400000
    7. 00401082 |.  6A 00          PUSH    0                           ; |hMenu = NULL
    8. 00401084 |.  6A 00          PUSH    0                           ; |hParent = NULL
    9. 00401086 |.  68 00800000    PUSH    8000                        ; |Height = 8000 (32768.)
    10. 0040108B |.  68 00800000    PUSH    8000                        ; |Width = 8000 (32768.)
    11. 00401090 |.  68 00800000    PUSH    8000                        ; |Y = 8000 (32768.)
    12. 00401095 |.  68 00800000    PUSH    8000                        ; |X = 8000 (32768.)
    13. 0040109A |.  68 0000CF10    PUSH    10CF0000                    ; |Style = WS_OVERLAPPED|
    14. 0040109F |.  68 44104000    PUSH    00401044                    ; |WindowName = "title"
    15. 004010A4 |.  68 4A104000    PUSH    0040104A                    ; |Class = "class"
    16. 004010A9 |.  6A 00          PUSH    0                           ; |ExtStyle = 0
    17. 004010AB |.  FF15 C6114000  CALL    [<&user32.CreateWindowExA>] ; \CreateWindowExA
    18. ;=====================================================================
    А у тебя, судя по картинке, вообще черти чшо
    Код (Text):
    1. ;=====================================================================
    2.             ...
    3.             call    @f
    4.             db      ...'0.01' ; что за имя ???
    5. @@:         db      0         ; почему сюда ???
    6.             push    class
    7.             push    0
    8.             call    CreateWindowExA
    9. ;=====================================================================
     
  7. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40




    Вот по-этому то я и спрашиваю.

    В общем попробуйте сами. Прога - создание меню, компилирована fasm console v1.60. Засуньте аттач в olly и посмотрите что она вам выдаст.
     
  8. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Код (Text):
    1. invoke  CreateWindowEx,WS_EX_TOOLWINDOW,_class,[b]''[/b],\
    2.         WS_OVERLAPPEDWINDOW,200,200,300,200,0,0,[hinstance],0
    Ну, и что это у тебя за скобки? Где ты видел такой пример, ты MSDN вообще смотрел?
     
  10. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
    А при чём тут MSDN и скобки?

    Я проги на FASMе пишу, там такой синтаксис.
     
  11. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Я понимаю, тогда что тебе не нравится в твоем 1754462494__menu.rar, на что жалуетесь? Он ведь совсем не совпадает с _212693597__1.gif, надо было тот код показать
     
  12. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
    Вот всё вместе, скриншот от дебага именно menu.exe, только вот проблема таже самая что и на первом скриншоте, и на втором, и во многих других прогах.
     
  13. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
  14. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Все равно аттач не от первой картинки (где черти чшо), тут нормально (только db 0, указатель на пустой lpWindowName), ну не в этом дело ...



    Прога абсолютно обычная и отлаживается как все, ты не можешь нажать F7 чтобы пройти по стрелке или ты не знаешь почему '' компилится в call @f \ db 0 \ @@: push 401000?
     
  15. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
    Забудь про первую картинку, она из проги под 50кб, не думаю что кто-то захочет в ней копаться, факт в том что проблема аналогичная.



    По F7 переходит по адресу (или если такого адреса нет, то на следующую строку), а по F8 сообщает 'it looks like you`re trying to set breakpoind on the data'. Разве это нормально?





    В общем да, интересно узнать откуда эта бредятина берётся.
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Видимо это прибамбас fasm 1.60(?), т.к. 1.56 пушит lpWindowName = '' просто как push 0.

    А тут получается именно как указатель на нулевой байт. Хоть и хитро и непривычно, но правильно, т.к. call пушит указатель на следующий за ним нулевой байт и идет на следующую инструкцию push
    Код (Text):
    1. call @F  ;пушит "адрес возврата" = lpWindowName = ''
    2. db 0    ;<- это и есть lpWindowName = ''
    3. @@: push 401000
    PS: передавай указатель на пустую строку как 0 или NULL и не парься ;)
     
  17. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Ещё как нормально, так олли предупреждает по F8, что за call будет установлен бряк, но там данные а не код, по-этому он не сработает - прога запустится, только не говори что Ollydbg.hlp не при чем







    Там где ты скобки взял, и фасм возможно старый в шоке от них, последний скомпилил в push 0, leo уже сказал
     
  18. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
    Понял вот что: FASM генерит странный код если передавать строковые переметры прямо в функцию.
    Код (Text):
    1.  
    2. странно, но правильно:
    3. invoke CreateWindowEx,WS_EX_TOOLWINDOW,_class, 'prog1',\
    4.        WS_OVERLAPPEDWINDOW,200,200,300,200,0,0,[hinst],0
    5.  
    6. абсолютно правильно:
    7. progname db 'prog1',0
    8. invoke CreateWindowEx,WS_EX_TOOLWINDOW,_class, progname,\
    9.        WS_OVERLAPPEDWINDOW,200,200,300,200,0,0,[hinst],0
    10.  


    Причём это относится ко всем функциям.



    Спасибо всем за объяснения!
     
  19. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Если подключать win32a.inc, то новый фасм не даст такое скомпилить, только при win32ax.inc (там макрос для этого)
     
  20. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
    Если кому-то ещё интересно, настройки OLLY:



    debugging options -> analysis1 -> decode tricky code sequences.



    из
    Код (Text):
    1.  
    2. invoke CreateWindowEx,WS_EX_TOOLWINDOW,_class, 'prog1',\
    3.        WS_OVERLAPPEDWINDOW,200,200,300,200,0,0,[hinst],0
    4.  
    5. 004030B4   .>PUSH 0
    6. 004030B6   .>PUSH [DWORD 40114C]
    7. 004030BC   .>PUSH 0
    8. 004030BE   .>PUSH 0
    9. 004030C0   .>PUSH 190
    10. 004030C5   .>PUSH 190
    11. 004030CA   .>PUSH EAX
    12. 004030CB   .>PUSH EBX
    13. 004030CC   .>PUSH 0CF0000
    14. 004030D1   .>CALL prog.004030DC
    15. 004030D6   .>JO SHORT prog.0040314A
    16. 004030D8   .>OUTSD                                     ;  I/O command
    17. 004030D9   .>XOR [DWORD BX+SI],EAX
    18. 004030DC  /$>PUSH prog.004011BC                        ; |Class = "win32class"
    19. 004030E1  |.>PUSH 0                                    ; |ExtStyle = 0
    20. 004030E3  |.>CALL [DWORD <&USER32.CreateWindowExA>]    ; \CreateWindowExA
    21.  


    делает
    Код (Text):
    1.  
    2. 004030B4  |.>PUSH 0
    3. 004030B6  |.>PUSH [DWORD 40114C]
    4. 004030BC  |.>PUSH 0
    5. 004030BE  |.>PUSH 0
    6. 004030C0  |.>PUSH 190
    7. 004030C5  |.>PUSH 190
    8. 004030CA  |.>PUSH EAX
    9. 004030CB  |.>PUSH EBX
    10. 004030CC  |.>PUSH 0CF0000
    11. 004030D1  |.>CALL prog.004030DC                        ;  PUSH ASCII "prog1"
    12. 004030D6  |.>ASCII "prog1",0
    13. 004030DC  |>>PUSH prog.004011BC                        ; |Class = "win32class"
    14. 004030E1  |.>PUSH 0                                    ; |ExtStyle = 0
    15. 004030E3  |.>CALL [DWORD <&USER32.CreateWindowExA>]    ; \CreateWindowExA
    16.