Помогите разобраться, почему если seh обработчик запихнуть в стек, то он не срабатывает, т.е. до labbegin дело не доходит соовсем...в чем дело? собсна код: Код (Text): push dword ptr [exh+4] push dword ptr [exh] push esp ; указатель на обработчик который находится в стеке push fs:[0] mov fs:[0],esp xor eax,eax mov dword ptr [eax],0 labbegin: mov esp,[esp+8] pop fs:[0] add esp,8 invoke Beep,1000,100 invoke ExitProcess,0 exh: push offset labbegin ret А ВОТ ТАК ГЛАВНОЕ РАБОТАЕТ: Код (Text): push offset exh ; указатель на обработчик который находится в коде push fs:[0] mov fs:[0],esp xor eax,eax mov dword ptr [eax],0 labbegin: mov esp,[esp+8] pop fs:[0] add esp,8 invoke Beep,1000,100 invoke ExitProcess,0 exh: push offset labbegin ret
атрибутики могут не помочь, т.к. в XP SP2 рулит софтварный DEP, запрещающий исполнение SEH-обработчиков в стеке см.топик WinXP SP2 и выполнение кода на стеке
такой изврат нужно для защиты от дизассемблирования и отладки...там все ксорится по 10 раз... извините за ламерский вопрос... а где атрибуты стека находятся?
zhorik Разреши запись в секцию кода VirtualProtect'ом и ксорь себе наздоровье Ну он только нач.адрес обработчика проверяет, поэтому если очень хочется, то можно основное тело обработчика запихнуть в стек, а в секции кода оставить пару инструкций, передающих управление на стек. Но учти, что на компах с хардварным DEP-ом нужно будет разрешить исполнение кода в стеке тем же VirtualProtect-ом
leo да у секции кода уже стоит атрибут на запись.... но всё равно, спасибо тебе бальшое! буду копать дальше...
zhorik, сейчас посмотрела: KiUserExceptionDispatcher вызывает _RtlDispatchException а там делается проверка, находиться ли обработчик в стеке. Если да, то он просто не выполняется