Используя SEH патчу drX, че-то не пойму в чем бага, может подскажете?

Тема в разделе "WASM.WIN32", создана пользователем EvilsInterrupt, 18 авг 2006.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Кратко:

    1. регистрирую новый обработчик
    2. вызываю багу
    3. мне дали CONTEXT
    4. Меняю как мне надо регистры drX
    5. правлю команду которая предамерено вызвала исключение
    6. делаю попытку выполнить

    результат: прога падает, почему?
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    ну мот ты регистры, которые надо сохранять не сохранил, может не вернул 0 короче покажи код
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    nobodyzzz
    Ты скажи вызвав исключение и попрвив CONTEXT и сказав return ExceptionContinueExecution;

    система поправит под тот CONTEXT что я попрвил, а я его я взял от сюда:
    Код (Text):
    1. EXCEPTION_DISPOSITION
    2. __cdecl
    3. _except_handler(
    4.     struct _EXCEPTION_RECORD *ExceptionRecord,
    5.     void * EstablisherFrame,
    6.     struct _CONTEXT *ContextRecord,
    7.     void * DispatcherContext )
    или она не поправит?
     
  4. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    да по идее должна востановить
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    nobodyzzz
    Раз уж коснулся SEH, не буду создавать еще одну тему и задам касательно него здесь:
    Код (Text):
    1.     xor eax,eax
    2.     call    $+5
    3.     add dword[esp],Protect-$
    4.     push dword[fs:eax]
    5.     mov [fs:eax],esp
    6.     inc dword[eax]
    7. Protect:
    8.     mov ebx,[esp+0x0C]
    9.     mov esi,Protect
    10.     mov edi,OutProgramm
    11.     mov ecx,SizeProtect / 4
    12. @@:
    13.     lodsd
    14.     xor eax,0x3ABC3291
    15.     not eax
    16.     xor eax,[ebx+0x04]      ; dr0
    17.     ror eax,0x3
    18.     sub eax,[ebx+0x08]      ; dr1
    19.     not eax
    20.     add eax,[ebx+0x0C]      ; dr2
    21.     xor eax,0xF7B93CDF
    22.     xor eax,[ebx+0x10]      ; dr3
    23.     stosd
    24.     dec ecx
    25.     jnz @B
    26.     add esp,0x14
    27.     mov eax,[esp]
    28.     mov [fs:0],eax
    29.     add esp,0x8
    30.     mov edi,OutProgramm
    31.     push edi
    32.     retn
    как ты думаешь под включенным DEP будет ли какая бага? По идее не должно причем тут он?! :)
     
  6. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    не знаю=))
    по коду:
    востанавливай значения ebx, esi, edi при выходе из обработчика
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Не зачем!
     
  8. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Вот тебе цитата из Разработка больших проектов на ассемблере (http://wasm.ru/article.php?article=biprjasm) :
    Так что возми за правило в тех функция, которые вызываються системой сохранять регистры ebx, esi, edi
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    nobodyzzz
    Имеет смысл если в обычном коде, а у меня esi,ebx,edi все равно обычный расшированный код сделает так как надо!
     
  10. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    Код (Text):
    1. push edi
    2. retn
    Это callback-функция. Куда из неё управление должно передаваться? На васме много статей про SEH.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    EvilsInterrupt
    Если память по адресу OutProgram разрешена для исполнения, то DEP отдыхает

    Но "бага" может быть в другом - непонятно, что ты хочешь сделать после add esp,0x14. Если восстановить стек и предыдущий SEH, то mov eax,[esp] это неправильно, т.к. на момент вызова твоего обработчика в стеке содержится куча "мусора", оставленная виндовыми функциями (в т.ч. и структура CONTEXT тоже сидит в стеке). Поэтому значение esp на момент вызова исключения нужно брать либо из [esp+8] либо из контекста [ebx+0xС4]
    И вообще не возвращать управление винде после обработки исключения - это дурной "червивый" тон ;)
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    когда-то этот код постился здесь

    Код (Text):
    1. ;; debug registers clearing example by dr.golova
    2. ;; mailto: dr_golova#pisem.net
    3. ;; fully multihreaded and position-independent code
    4. ;; compile it with netwide assembler
    5. ;; e.g. nasmw.exe -o drx_clr.bin -f bin -O4 drx_clr.asm
    6.  
    7. bits 32
    8. section .text
    9. global  _start
    10.  
    11. _start:
    12. ;;         int    3
    13.          call   .pbase                           ;; push code address
    14. .pbase:
    15.          xor    eax, eax
    16.          add    dword [esp], (.x_hnd - .pbase)   ;; update handler offset
    17.          push   dword [fs:eax]                   ;; save old exception handler
    18.          mov    dword [fs:eax], esp              ;; setup new handler frame
    19.          mov    eax,  [eax]                      ;; exception here
    20.          pop    dword [fs:eax]                   ;; restore old frame
    21.          pop    eax
    22.          retn
    23. .x_hnd:
    24.          xor    eax, eax
    25.          mov    ecx,  [esp+00Ch]                 ;; context ptr
    26.          mov    dword [ecx], 010017h             ;; set context flags
    27.          add    dword [ecx+0B8h], 02h            ;; exception address
    28.          mov    dword [ecx+018h], 0101h          ;; setup dr7 flags
    29.          mov    [ecx+04h], eax                   ;; clear dr0-dr3
    30.          mov    [ecx+08h], eax
    31.          mov    [ecx+0Ch], eax
    32.          mov    [ecx+10h], eax
    33.          retn                                    ;; return to host
    34. end
     
  13. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Dimson
    Я писал выше, что это расшифровщик, следовательно push edi/retn это переход на расшифрованный код!

    К тому же обработчики можно не только поставить, но и убрать, а также попачить любое значение другого обработчика на себя, была бы фанатазия :)
     
  14. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Asterix
    Мне тут в голову пришло:


    sub [esp],eax ; eax is CONTEXT.dr0

    т.е. взять значение из дубужных и если они в нуле, то стек они не попортят! :)
     
  15. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    Это понятно. Но после обработчика исключения у тебя выход должен быть обратно в ntdll в ExecuteHandler и выше по цепочке. Т.е., если хочешь вернуться из обработчика исключения прямо в код то esp надо увеличивать не на 0x14, а гораздо на больше (не забыв при этом убрать обработчик исключения, который ExecuteHandler ставит) или, как вариант, в расшифрованном коде должно учитываться всё то, что в данный момент на стеке лежит (включая адреса возврата в функции ntdll и весь остальной хлам). А так, можно предположить, что у тебя указатель стека не туда указывает на выходе, поэтому и валится всё.
     
  16. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    В коде выше:
    Код (Text):
    1. Protect:
    2.     mov    ebx,[esp+0x0C]
    берем адрес на CONTEXT, блин, самое интересное dr0,dr1 etc находятся! :) Находятся и сегментные регистры :)) А вот между ними eax,ebx,ecx etc не фига! :))) Че за дурь?

    или в результате mov [0],1(псевдо) не сохраняются РОНы ?
     
  17. afw2004

    afw2004 New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2006
    Сообщения:
    14
    Рабочий пример использования SEH (правда на flat асме и с использованием _except_handler2). Может пригодится...


    format PE GUI 4.0
    entry WinMain
    include 'c:\windows\fasm\fixes.inc'
    include 'c:\windows\fasm\win32.inc'

    section '.data' data readable
    szFilter db 'Filter',0
    szExcept db 'Except',0

    section '.code' readable executable

    install_handler:
    pop ecx
    pop eax
    push 0
    push ebp
    push -1
    push eax
    push [_except_handler2]
    mov eax,[fs:00]
    push eax
    mov DWORD [fs:00],esp
    jmp ecx


    LABEL test_seh_scope_table
    dd -1, test_seh_filter1, test_seh_except1

    proc test_seh
    use_seh
    stdcall install_handler, test_seh_scope_table
    local .var1:lDWORD, .var2:lDWORD, .stack_frame:EXCEPTION_REGISTRATION
    push ebx edi esi
    mov [.stack_frame.m_esp],esp

    mov DWORD [.var1],1
    mov DWORD [.var2],2
    .try1:
    mov [.stack_frame.try_level],0

    sub eax,eax
    mov eax,[eax]

    mov DWORD [.stack_frame.try_level],-1
    jmp test_seh_end_except1

    test_seh_filter1:
    invoke MessageBox, 0,szFilter,szFilter,0
    mov eax,1
    retn

    test_seh_except1:
    mov esp,[.stack_frame.m_esp]
    invoke MessageBox, 0,szExcept,szExcept,0
    cmp DWORD [.var1],1
    jz .check_var2
    invoke MessageBox, 0,szExcept,szExcept,0
    .check_var2:
    cmp DWORD [.var2],2
    jz test_seh_end_except1
    invoke MessageBox, 0,szExcept,szExcept,0
    jmp test_seh_end_except1
    test_seh_end_except1:
    pop esi edi ebx

    mov ecx,[.stack_frame.hPrev]
    mov [fs:00],ecx
    ret
    endp

    WinMain:
    call test_seh
    invoke MessageBox, 0,szFilter,szFilter,0
    invoke ExitProcess, 0

    section '.idata' import data readable
    library \
    user,'USER32.DLL', \
    kernel,'KERNEL32.DLL', \
    crtdll,'crtdll.dll'
    import user, \
    MessageBox,'MessageBoxA'
    import kernel, \
    ExitProcess,'ExitProcess'
    import crtdll, \
    _except_handler2,'_except_handler2'