SEH hook 的一种方法
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
技术学习来源:火哥(QQ:471194425)
该方法的一些原理暂时还不太了解,整理之后一定会补充的。
SEH hook 的一种方法
一、当函数中有try语句时编译器的处理
首先,我们必须知道,当一个函数中有try时,编译器对其的函数头部分的处里和平常有些不一样的,如下图。
1)关键是压入的第二个参数 0A65E00h,其通过 (test+6) 可以拿到该值。
1> 这个值指向一个数据结构,其第五个成员代表指向except的语句。
2> 因此,我们只要修改这个地址来到我们的函数,这很容易就执行了。
二、实现代码
1)采用Debug模式下,则必须关闭增量链接。
关闭方法:[debug] 关闭vs的增量链接
2)实现代码:
// SEH.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <windows.h> #include <stdio.h> int test3(ULONG ecode, PEXCEPTION_POINTERS p) { if (ecode == 0xc0000094) { p->ContextRecord->Eip += 3; return EXCEPTION_CONTINUE_EXECUTION; } return EXCEPTION_EXECUTE_HANDLER; } void test2() { __try { __asm { xor edx, edx; xor eax, eax; mov ecx, 0; div ecx; } } __except (1) { printf("exception语句也被执行了!"); } } int WINAPI ExcepFilter(PEXCEPTION_POINTERS p) { printf("HOOK上的函数执行了!\r\n"); return 1; } int __declspec(naked) catchExcepFilter() { __asm { mov eax, [ebp - 0x14]; push eax; call ExcepFilter; ret; } } int main(int argc, char* argv[]) { ULONG hookAddress = *(PULONG)((ULONG)test2 + 6); ULONG pro = 0; //exceptionInfoAddr = (ULONG)_exception_info; if (VirtualProtect((PVOID)hookAddress, 0x1000, PAGE_READWRITE, &pro)) { *((PULONG)hookAddress + 5) = (ULONG)(catchExcepFilter); //修复回去 VirtualProtect((PVOID)hookAddress, 0x1000, pro, &pro); } test2(); //TestException(); getchar(); return 0; }
3)执行结果