Проблема в следующем:пытаюсь встроить обработчик ошибо в код своей программы но передачи управления на отладич не происходит. Вот код: 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.
Попробуй вместо "push dword ptr [ebp+SAH]" просто "push dword ptr [SAH]" ps. Это какой пакет ассемблера?
судя по dword ptr - МАСМ. но чото мне кажецо топикстартер не понимает что делоет и не умеет обращацо с отладчиком, код зверский...
нет push dword ptr [SAH] не подходит,у меня адресная привязка к ebp. Возможно код и зверский....поэтому и прошу помощи-умелбы обращаться и не спрашивал бы.Так как тогда надо сделать?
в самом простом случае вот статья https://www.wasm.ru/article.php?article=vgw10 листинг 1 очень просто и наглядно А вот в подробностях http://www.wasm.ru/article.php?article=green2red03#_Toc106866994 вторая глава статьи
и использование каких либо библиотек не возможно.Примеры посмотрел,но без библиотек не пошло.Может кто нибудь пример показать?
Рано в сех лезешь разберись сперва с компилятором иначе мы всем форумом будем тебе код отлаживать Код (Text): start: call setupSEH exceptionhandler: mov esp,[esp+8] ; Ошибка дает нам старый ESP ; в [ESP+8] ;...тут твой код обработчика setupSEH: push dword ptr fs:[0] ; Push'им оригинальный ; обработчик SEH mov fs:[0],esp ; И помещаем новый (который ; находится после первого ; call) mov ebx,0BFF70000h ; Пытаемся писать в ядро (что mov eax,012345678h ; вызовет исключение) xchg eax,[ebx]
спосибо,с этим я разобрался.Только возник еще вопрос, строка assume fs:nothing акак нибудь отражается на pe заголовке?Просто если вписать в какую нибудь программу (например по средствам HIEW) элементарный SEH,то он отказывается работать.
fs:nothing отражается только на том, проверяет ли транслятор использование этого сегментного регистра, соответственно в готовом коде этого нет. Правильно вставленный SEH работать должен. Не модифицируй чужие программки, пиши свои
hawk assume это просто директива, не имеющая непосредственного опкода. а насчет модификации - смотря как модифицировать..
Magnum а можно подробнее насщет ; Ошибка дает нам старый ESP в [ESP+8] Откуда берётся старый ESP в [ESP+8] ?
Вот небольшой пример того как реализовывал на С Код (Text): typedef struct _SEH_RECORD { DWORD Prev; DWORD Handler; DWORD Safe; DWORD ESP; DWORD EBP; }SEH_RECORD, *PSEH_RECORD; typedef EXCEPTION_DISPOSITION (__cdecl *EXCEPTION_HANDLER) (__in PEXCEPTION_RECORD ExceptionRecord, __in LPVOID EstablisherFrame, __inout PCONTEXT ContextRecord, __inout LPVOID DispatcherContext); typedef struct _EXCEPTION_REGISTRATION { struct _EXCEPTION_REGISTRATION *PreviousChain; EXCEPTION_HANDLER ExceptHandler; } EXCEPTION_REGISTRATION, *PEXCEPTION_REGISTRATION; /* ___try { // unsafe code } ___except { // SAFE: // safe offset } */ #define ___try \ DWORD addr; \ __asm { mov eax,SAFE } \ __asm {mov dword ptr[addr], eax} \ __try_set((LPVOID)addr); #define ___except \ SAFE: \ __try_release(); EXCEPTION_DISPOSITION __cdecl except_handler(__in PEXCEPTION_RECORD ExceptionRecord, __in LPVOID EstablisherFrame, __inout PCONTEXT ContextRecord, __inout LPVOID DispatcherContext) //Exception handling routine { PSEH_RECORD SehRec = EstablisherFrame; ContextRecord->Eip = SehRec->Safe; ContextRecord->Ebp = SehRec->EBP; ContextRecord->Esp = SehRec->ESP; return ExceptionContinueExecution; } void __forceinline __try_set(LPVOID safeoffset) //Adds new SEH frame { __asm { push ebp push esp push dword ptr[safeoffset] push dword ptr[except_handler] push dword ptr fs:[0] mov fs:[0],esp } } void __forceinline __try_release() //Restores old SEH frame { __asm { mov eax,fs:[0] mov eax,[eax] mov fs:[0],eax add esp,20 } }
2FED Код (Text): typedef struct _SEH_RECORD { DWORD Prev; +20 DWORD Handler; +16 DWORD Safe; +12 DWORD ESP; +8 DWORD EBP; +4 ;- стек растет вниз }SEH_RECORD, *PSEH_RECORD;