Помогите с SEH и VirtualProtect

Тема в разделе "WASM.WIN32", создана пользователем geek2600, 20 июл 2006.

  1. geek2600

    geek2600 New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2005
    Сообщения:
    5
    Адрес:
    Russia
    Помогите пожалуйста.
    Что не так?
    Код (Text):
    1. #include <windows.h>
    2. #include <shellapi.h>
    3. #include <windowsx.h>
    4. #include <stdio.h>
    5. #define WIN32_LEAN_AND_MEAN
    6. int Z=0;
    7. char Z8;
    8. DWORD pt;
    9. void TUNEC()
    10. {
    11.     int ip=0;
    12.     while(ip<=3){
    13.         ip++;
    14.     MessageBox(0,0,0,0);
    15.     }
    16. }
    17.  
    18.  
    19. EXCEPTION_DISPOSITION
    20. __cdecl
    21. _except_handler(
    22.     struct _EXCEPTION_RECORD *ExceptionRecord,
    23.     void * EstablisherFrame,
    24.     struct _CONTEXT *ContextRecord,
    25.     void * DispatcherContext )
    26. {
    27.     unsigned i;
    28.     MessageBox(0,"In SEH",0,0);
    29.  
    30.  
    31.     return ExceptionContinueExecution;
    32. }
    33.  
    34. int _stdcall WinMain(HINSTANCE ha, HINSTANCE, PTSTR, int)
    35. {
    36.    DWORD handler = (DWORD)_except_handler;
    37.  
    38.     __asm
    39.     {  
    40.         push    handler    
    41.         push    FS:[0]    
    42.         mov     FS:[0],ESP
    43.     }
    44. VirtualProtect((void*)(&TUNEC),1024,PAGE_NOACESS,&pt);
    45. TUNEC();
    46.     __asm
    47.     {
    48.         mov     eax,[ESP]
    49.         mov     FS:[0], EAX
    50.         add     esp, 8      
    51.     }
    52.     return 0;
    53. }
    Почему при обращение к памяти с атрибутом PAGE_NOACESS я не поподаю в SEH?
    Что происходит при таком обращении?
    Убедительная просьба давать дельные советы , хорошобы с примерами.
    Заранее благодарен.
    С уважением ко всем откликнувшимся geek.
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Все так - что хотел, то и получил :lol:
    Потому, что твой SEH-обработчик находится в той же странице памяти, к которой ты запрещаешь доступ. И кстати вызов TUNEC() тут и не нужен вовсе - исключение возникает (должно возникать) при выходе по ret из VirtualProtect
    PS: смутно помнится такой вопрос на форуме уже как-то был
     
  3. geek2600

    geek2600 New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2005
    Сообщения:
    5
    Адрес:
    Russia
    Да то не совсем так.
    VirtualProtect((void*)(&TUNEC),1024,PAGE_NOACESS,&pt);
    nop
    nop
    nop
    nop
    nop
    TUNEC();
    Дает тот же результат.
     
  4. geek2600

    geek2600 New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2005
    Сообщения:
    5
    Адрес:
    Russia
    Да то не совсем так.
    VirtualProtect((void*)(&TUNEC),1024,PAGE_NOACESS,&pt);
    nop
    nop
    nop
    nop
    nop
    TUNEC();
    Дает тот же результат, т.е. исключение (ошибка) возникает только при вызове TUNEC
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Если тело TUNEC и вызовы VirtualProtect(..) и TUNEC(..) располагаются в разных страницах кода, то ошибка будут возникать при вызове TUNEC(..). Если же в одной странице (как можно предположить из твоего первого поста) - то ошибка возникнет на инструкции ret в VirtualProtect
    В любом случае нужно убедиться, что адрес обработчика _except_handler не попадает в запрещаемый диапазон адресов