Сейчас на форуме: vsv1 (+3 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Помогите поставить SEH-фрейм |
Посл.ответ | Сообщение |
|
Создано: 07 января 2008 11:55 · Поправил: LexxCracker · Личное сообщение · #1 Сабж прочитал несколько статей по антиотладке с использованием сех-фреймов. Но по непонятным причинам код падает. Требования к коду такие: 1. Стек портится не должен. Т.е. все, что лежало в нем до использования приема, должно там и быть и после 2. Нормальное выполнение кода после использования приема Помогите разобраться, и, если есть код с использованием данного метода защиты - сбросьте. Бу благодарен. ![]() |
|
Создано: 07 января 2008 11:56 · Поправил: LexxCracker · Личное сообщение · #2 вот взял код с васма. Но мессаджбокса нет. ![]() Падает там где и должно падать.... и под отладчиком и без него. Но обработки исключения нет. ;--------------------------------------------------------------------- ----------------
![]() |
|
Создано: 07 января 2008 12:47 · Личное сообщение · #3 |
|
Создано: 07 января 2008 12:57 · Личное сообщение · #4 |
|
Создано: 07 января 2008 13:01 · Поправил: LexxCracker · Личное сообщение · #5 |
|
Создано: 07 января 2008 13:06 · Личное сообщение · #6 как вариант program SEH; uses Windows; type _SEH = record SafeEip:DWORD; // The offset where it's safe to continue execution PrevEsp:DWORD; // The previous value of esp PrevEbp:DWORD; // The previous value of ebp end; // // Exception disposition return values. // EXCEPTION_DISPOSITION = DWORD; const ExceptionContinueExecution = 0; ExceptionContinueSearch = 1; ExceptionNestedException = 2; ExceptionCollidedUnwind = 3; var format_string : PChar = 'EAX = %08lX' + #0; __seh : _SEH; label _SafePlace; {$O+} function _except_handler( ExceptionRecord:PExceptionRecord; EstablisherFrame:Pointer; ContextRecord:PContext; DispatcherContext:Pointer): EXCEPTION_DISPOSITION; cdecl; var Buff: PChar; _EAX: DWord; begin ContextRecord.Eip := __seh.SafeEip; ContextRecord.Esp := __seh.PrevEsp; ContextRecord.Ebp := __seh.PrevEbp; _EAX := ContextRecord.Eax; GetMem(Buff, 64); asm push _EAX push format_string push Buff call wsprintf add esp, 0Ch end; MessageBox(0, Buff, nil, MB_OK or MB_ICONINFORMATION); FreeMem(Buff); // Tell the OS to restart the faulting instruction Result := ExceptionContinueExecution; end; {$O-} begin asm push OFFSET _except_handler push DWORD PTR fs:[0] // address of next ERR structure mov fs:[0], esp // give FS:[0] the ERR address just made mov __seh.SafeEip, OFFSET _SafePlace mov __seh.PrevEsp, esp mov __seh.PrevEbp, ebp mov eax, $12345678 db 0CCh end; _SafePlace: asm pop DWORD PTR fs:[0] // restore next ERR structure to FS:[0] add esp, 4 // throw away rest of ERR structure end; end. ![]() |
|
Создано: 07 января 2008 14:40 · Поправил: Hellspawn · Личное сообщение · #7 |
|
Создано: 07 января 2008 15:26 · Личное сообщение · #8 |
|
Создано: 07 января 2008 15:48 · Личное сообщение · #9 |
|
Создано: 07 января 2008 16:00 · Личное сообщение · #10 |
|
Создано: 07 января 2008 16:14 · Личное сообщение · #11 Hellspawn пишет: если и делать сех на дельфях, то или try/except или asm вставку не аргумент, товарищу нужна асм реализация, все что ему нужно в том коде есть асм вставки нужно делать только там где без них нельзя ;) в данном случае при "ручной" постановке SEH без них не обойтись, т.к. встроенный try/except для примера не годится ![]() |
|
Создано: 07 января 2008 16:37 · Личное сообщение · #12 |
|
Создано: 07 января 2008 19:37 · Личное сообщение · #13 http://exelab.ru/f/action=vthread&forum=5&topic=10874 Могу дать этот пример под MASM32 если нужно. ----- Всем привет, я вернулся ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Помогите поставить SEH-фрейм |