помогите с SEH

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

  1. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Проблема в следующем:пытаюсь встроить обработчик ошибо в код своей программы но передачи управления на отладич не происходит.
    Вот код:
    jmp YU9
    SAH:
    arg_8 dd 10h

    push ebp
    mov ebp, esp
    mov eax, [ebp+arg_8]
    mov dword ptr [eax+0A4h], 1
    xor eax, eax
    pop ebp
    ret
    YU9:


    push dword ptr [ebp+SAH]
    push dword ptr fs:[0]
    mov fs:[0],esp
    xor eax,eax
    xor ebx,ebx
    div ebx
    mov eax,[esp]
    mov fs:[0],eax
    add esp, 8

    Подскажите пожалуйста,что сдесь не верно.
    Заранее благодарен.С уважением hawk.
     
  2. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Попробуй вместо "push dword ptr [ebp+SAH]" просто "push dword ptr [SAH]"

    ps. Это какой пакет ассемблера?
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    судя по dword ptr - МАСМ. но чото мне кажецо топикстартер не понимает что делоет и не умеет обращацо с отладчиком, код зверский...
     
  4. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    нет push dword ptr [SAH] не подходит,у меня адресная привязка к ebp.
    Возможно код и зверский....поэтому и прошу помощи-умелбы обращаться и не спрашивал бы.Так как тогда надо сделать?
     
  5. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    в самом простом случае
    вот статья
    https://www.wasm.ru/article.php?article=vgw10

    листинг 1
    очень просто и наглядно

    А вот в подробностях
    http://www.wasm.ru/article.php?article=green2red03#_Toc106866994
    вторая глава статьи
     
  6. Nero_n

    Nero_n New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2008
    Сообщения:
    33
    покажи больше кода. впрочем, можешь попробовать "push dword ptr [SAH+4]" ;)
     
  7. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    я на tasm компилю.
     
  8. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    и использование каких либо библиотек не возможно.Примеры посмотрел,но без библиотек не пошло.Может кто нибудь пример показать?
     
  9. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Рано в сех лезешь
    разберись сперва с компилятором
    иначе мы всем форумом будем тебе код отлаживать
    Код (Text):
    1. start:
    2.         call    setupSEH
    3.  
    4. exceptionhandler:
    5.         mov     esp,[esp+8]                     ; Ошибка дает нам старый ESP
    6.                                                         ; в [ESP+8]
    7.  
    8.        ;...тут твой код обработчика
    9.  
    10.  
    11. setupSEH:
    12.         push    dword ptr fs:[0]        ; Push'им оригинальный
    13.                                                 ; обработчик SEH
    14.         mov     fs:[0],esp                ; И помещаем новый (который
    15.                                                 ; находится после первого
    16.                                                 ; call)
    17.  
    18.         mov     ebx,0BFF70000h                  ; Пытаемся писать в ядро (что
    19.         mov     eax,012345678h                  ; вызовет исключение)
    20.         xchg    eax,[ebx]
     
  10. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    спосибо,с этим я разобрался.Только возник еще вопрос, строка assume fs:nothing акак нибудь отражается на pe заголовке?Просто если вписать в какую нибудь программу (например по средствам HIEW) элементарный SEH,то он отказывается работать.
     
  11. Wolfgang

    Wolfgang New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    82
    Адрес:
    Russia
    fs:nothing отражается только на том, проверяет ли транслятор использование этого сегментного регистра, соответственно в готовом коде этого нет. Правильно вставленный SEH работать должен. Не модифицируй чужие программки, пиши свои :)
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    hawk
    assume это просто директива, не имеющая непосредственного опкода.
    а насчет модификации - смотря как модифицировать..
     
  13. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    скорее всего проблема с флагом - его указал в подобной созданной тобой теме
     
  14. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Magnum а можно подробнее насщет

    ; Ошибка дает нам старый ESP в [ESP+8]

    Откуда берётся старый ESP в [ESP+8] ?
     
  15. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Вот небольшой пример того как реализовывал на С
    Код (Text):
    1. typedef struct _SEH_RECORD
    2. {
    3.     DWORD Prev;
    4.     DWORD Handler;
    5.     DWORD Safe;
    6.     DWORD ESP;
    7.     DWORD EBP;
    8. }SEH_RECORD,
    9. *PSEH_RECORD;
    10.  
    11. typedef EXCEPTION_DISPOSITION (__cdecl *EXCEPTION_HANDLER) (__in PEXCEPTION_RECORD ExceptionRecord,
    12.                                                             __in LPVOID EstablisherFrame,
    13.                                                             __inout PCONTEXT ContextRecord,
    14.                                                             __inout LPVOID DispatcherContext);
    15.  
    16. typedef struct _EXCEPTION_REGISTRATION
    17. {
    18.     struct _EXCEPTION_REGISTRATION *PreviousChain;
    19.     EXCEPTION_HANDLER ExceptHandler;
    20. }
    21. EXCEPTION_REGISTRATION,
    22. *PEXCEPTION_REGISTRATION;
    23.  
    24. /*
    25.         ___try
    26.         {
    27.         // unsafe code
    28.         }
    29.         ___except
    30.         {
    31.                 // SAFE:
    32.         // safe offset
    33.         }
    34. */
    35.  
    36. #define ___try                                  \
    37.     DWORD addr;                                 \
    38.     __asm { mov eax,SAFE }                      \
    39.     __asm {mov dword ptr[addr], eax}            \
    40.     __try_set((LPVOID)addr);
    41.  
    42. #define ___except                               \
    43. SAFE:                                           \
    44.     __try_release();
    45.  
    46. EXCEPTION_DISPOSITION
    47. __cdecl
    48. except_handler(__in PEXCEPTION_RECORD ExceptionRecord,
    49.                __in LPVOID EstablisherFrame,
    50.                __inout PCONTEXT ContextRecord,
    51.                __inout LPVOID DispatcherContext)
    52. //Exception handling routine
    53. {  
    54.     PSEH_RECORD SehRec = EstablisherFrame;
    55.     ContextRecord->Eip = SehRec->Safe;
    56.     ContextRecord->Ebp = SehRec->EBP;
    57.     ContextRecord->Esp = SehRec->ESP;
    58.     return ExceptionContinueExecution;
    59. }
    60.  
    61. void
    62. __forceinline
    63. __try_set(LPVOID safeoffset)
    64. //Adds new SEH frame
    65. {
    66.     __asm
    67.     {
    68.         push ebp
    69.         push esp
    70.         push dword ptr[safeoffset]
    71.         push dword ptr[except_handler]
    72.         push dword ptr fs:[0]
    73.         mov fs:[0],esp
    74.     }
    75. }
    76. void
    77. __forceinline
    78. __try_release()
    79. //Restores old SEH frame
    80. {
    81.     __asm  
    82.     {
    83.         mov eax,fs:[0]
    84.         mov eax,[eax]
    85.         mov fs:[0],eax
    86.         add esp,20
    87.     }
    88. }
     
  16. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    2FED

    Код (Text):
    1. typedef struct _SEH_RECORD
    2. {
    3.     DWORD Prev;         +20
    4.     DWORD Handler;      +16
    5.     DWORD Safe;         +12
    6.     DWORD ESP;          +8
    7.     DWORD EBP;          +4 ;- стек растет вниз
    8.  
    9. }SEH_RECORD,
    10. *PSEH_RECORD;
     
  17. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  18. Prince

    Prince New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2008
    Сообщения:
    71