SEH. укажите ошибку

Тема в разделе "WASM.ASSEMBLER", создана пользователем nadge, 10 мар 2005.

  1. nadge

    nadge New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    4
    Хочу установить SEH. Пишу:



    mov eax,fs:[0];

    mov fs:[0],ecx; //в ecx адрес восьмибайтового буфера

    mov [ecx],eax;

    mov eax,handler; //в handler адрес обработчика

    mov [ecx+4],eax;



    Обработчик должен выдавать сообщение. А вместо этого процесс просто убивается. Причем, вот такой вариант работает правильно:



    mov ecx,fs:[0];

    mov eax,handler;

    mov [ecx+4],eax;



    Т.е. простая подмена адреса обработчика в "чужой" структуре работает нормально. А "по инструкции" (первый вариант) - нет.



    В чем ошибка в первом варианте?
     
  2. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    че та я не понял, что ты намутил в первом варианте, но seh устанавливается так:



    push offset handler

    push dword ptr fs:[0]

    mov fs:[0],esp



    восстанавливаешь так:



    pop dword ptr fs:[0]

    add esp,4
     
  3. nadge

    nadge New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    4
    стек не годится, нужно где-то в другом месте хранить структуру.



    Полностью функция моя выглядит так:



    void _stdcall sehInstall(){

    DWORD handler = (DWORD)sehExceptHandler;

    _asm{

    push 8;

    call funcGetMem; //упрощенный VirtualAlloc

    xchg eax,ecx;

    jecxz lexit;

    mov eax,fs:[0];

    mov fs:[0],ecx;

    mov [ecx],eax;

    mov eax,handler;

    mov [ecx+4],eax;

    lexit:

    }

    }
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    nadge



    Попробуй добывить где-то в начале программы:
    Код (Text):
    1. mov fs:[4],0x7ffd0000
     
  5. nadge

    nadge New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    4
    Добавил, результат тот же.
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    nadge

    Дело в том, что ОС предполагает, что SEH-фрейм расположен на стеке - делается проверка указателя фрейма на принадлежность [stackMin; stackMax], а также много других проверок: при возникновении исключения есть вероятность что фрейм может быть испорчен.

    Если что-то не так, процесс прибивается.
     
  7. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    А я вот так использую:



    WorkThred proc uses edi esi ebx pDatar:dword





    LOCAL lcBff[300]:byte

    LOCAL hsoket:dword

    LOCAL outSes:dword





    push offset @@SehHandler

    push fs:[0]

    mov fs:[0], esp

    ;-----------------------------------------------------------------

    xor eax, eax

    mov [eax], eax

    ;-----------------------------------------------------------------

    @@BadExit:

    add esp, 8

    xor eax, eax

    ret

    @@SehHandler:

    push ebp

    mov ebp, esp

    mov eax, [ebp+10h]

    lea ecx, @@BadExit

    mov [eax+0B8h], ecx

    mov eax, 1

    leave

    jmp dword ptr [esp]



    WorkThred endp
     
  8. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    1) Почему jmp [esp] а не retn ?

    2) Обработчик должен возвращать ноль в еах, иначе исключение считается необработанным и вызывается следующий обработчик из цепочки.
     
  9. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    Все нориально, вот этого не хватает:



    MainThred proc uses edi esi ebx pArv:dword



    mov esi, pArv

    lea eax, SEH

    mov (sSEH ptr [eax]).OrgEsp, esp

    mov (sSEH ptr [eax]).OrgEbp, ebp

    mov (sSEH ptr [eax]).OrgEbx, ebx

    mov (sSEH ptr [eax]).SaveEip, offset @@BadExit

    invoke SetUnhandledExceptionFilter, offset UnhandledExceptionFilter

    .while dword ptr [esi] != 0

    lea eax, SEH

    mov (sSEH ptr [eax]).OrgEsi, esi

    invoke CreateThread, 0, 0, addr WorkThred, esi, 0, 0

    invoke CloseHandle, eax

    @@BadExit:

    inc esi

    .endw

    invoke SetUnhandledExceptionFilter, 0

    xor eax, eax

    ret



    MainThred endp
     
  10. nadge

    nadge New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    4
    green

    Понял. Значит придется как-то извращаться, т.к. программа на С.

    Спасибо