Backtrace делай, там уже часть асма будет, надо же получить ebp, и дальше просто отделать параметры. Ну вообщем не сложно. Но мне этот двиг уже не подходит та как там хук только одной функи, я на базе этого движка, напишу свой с мулти хуком ведь 10000< есть 16 страниц, а это 16 хуков уже не один.
19841204 У клерка, как я понял еще есть построитьель графов, который по его утверждениям, способен даже автоматически находить указатели нужные для перехвата, не хочешь тоже на си перевести)
Прям как легенду преподнес . А нафигу его на с++ переводить, вставляй его в проект и юзай. Этот мне нужно сделать только изза того что там мало возможностей и только.
19841204 Захватывать можно 128 областей(точно не помню лимит), это число ограничено лимитом LDT. Также общий размер областей не должен превышать 16 страниц. Этого достаточно для решения любых задач.
ziral2088 Портирование под x64 не возможно, так как там не поддерживается LDT. Вот бинарь пересобранный, никаких изменений кроме сех - добавил сохранение некоторых регистров http://indy-vx.narod.ru/Bin/Idpe.zip
небольшой чуть чуть оффтоп Код (Text): if(e->ExceptionRecord->ExceptionCode==IDP_SINGLE_STEP) { GetThreadContext(GetCurrentThread(),&ctxt); _esp=ctxt.Esp; printf("esp=%x\n",_esp); _asm mov _esp,esp printf("esp=%x\n",_esp); getch(); MessageBox(0,L"Catched",0,0); return EXCEPTION_CONTINUE_EXECUTION; } почему в первом случае _esp =0
Вы не заполнили ContextFlags. Там следует указать флажки, определяющие какая часть контекста будет обработана. Для текущего потока вызов не имеет смысла, так как будет возвращён немного изменённый контекст при вызове сервиса. Для диспетчера исключений он передаётся параметром.
CrystalIC это глобальная переменная флаги были в мэйн заполнены Код (Text): ctxt.ContextFlags=CONTEXT_INTEGER; GetThreadContext(GetCurrentThread(),&ctxt); _esp=ctxt.Esp; printf("esp=%x\n",_esp); _asm mov _esp,esp printf("esp=%x\n",_esp); все равно 0? CONTEXT_FULL все решил
еще вопрос смотри, мы находимся в обработчике исключения значит повторное исключение не получится обработать (__try,__except) Как тогда при бактрейсе не потерять управление? до какого уровня углубляться при поиске?
Допустимы рекурсивные вызовы. Вызов из других тредов не пройдёт, пока текущий не возвратится из VEH, так как используется синхронизация на кс. SEH будет раскручен, если VEH не выполнит обработку. Тоесть вы не фильтруете к примеру #AV в VEH, или например если адрес исключения принадлежит вашему коду(избыточный функционал в данном случае). На счёт бактрейса не понятно для чего он вам и что за поиск.
Код (Text): LONG __stdcall MyVEH(PEXCEPTION_POINTERS e) { CONTEXT ctxt; DWORD _esp; BOOL ret; //__asm{int 3} if(e->ExceptionRecord->ExceptionFlags!=NULL) { //non continuable exception return 0; } if(e->ExceptionRecord->ExceptionCode==IDP_BREAKPOINT) { return EXCEPTION_CONTINUE_EXECUTION; } if(e->ExceptionRecord->ExceptionCode==IDP_SINGLE_STEP) { __try { _asm xor eax,eax _asm mov eax,[eax] } __except(filter(GetExceptionCode(), GetExceptionInformation())) { puts("in except"); } getch(); MessageBox(0,L"Catched",0,0); return EXCEPTION_CONTINUE_EXECUTION; } return 0; } Код (Text): int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) { puts("in filter."); return EXCEPTION_EXECUTE_HANDLER; } вот это не обрабатывается падает бесшумно
punxer Необходимо знать разницу NL(SFN) текущей процедуры и целевой, либо адрес возврата и пр., в зависимости от целевого кода. Тут некоторые нюансы расмотрены http://wasm.ru/forum/viewtopic.php?id=39006&p=1. В общем это обширная сложная тема.
Это я понимаю сорсы смотрел, но тогда почему не пашет этот код Код (Text): #include <Windows.h> #include "idp.h" LONG some1=0x777; LONG some2=0x777; PLONG RepSome1; PLONG RepSome2; LONG __stdcall MyVEH(PEXCEPTION_POINTERS e) { //__asm{int 3} if(e->ExceptionRecord->ExceptionFlags!=NULL) { //non continuable exception return 0; } if(e->ExceptionRecord->ExceptionCode==IDP_BREAKPOINT) { return EXCEPTION_CONTINUE_EXECUTION; } if(e->ExceptionRecord->ExceptionCode==IDP_SINGLE_STEP) { //код обработчика //__asm{int 3} MessageBox(0,L"Catched",0,0); return EXCEPTION_CONTINUE_EXECUTION; } return 0; } VOID Test1() { int a = 34; a /= *RepSome1; MessageBox(0,L"End Test1()",0,0); } VOID Test2() { int a = 34; a /= *RepSome2; MessageBox(0,L"End Test2()",0,0); } void main() { IdpInitializeEngine(); IdpAddVeh(NULL,MyVEH); RepSome1 = &some1; RepSome2 = &some2; //__asm{int 3} DWORD status = IdpAddReference(&RepSome1,0x1000); status = IdpAddReference(&RepSome2,0x1000); Test1(); MessageBox(0,L"Next",0,0); Test2(); IdpRemoveVeh(MyVEH); }