x64技术之SSDT_Hook
测试环境:
虚拟机: Windows 7 64bit
过PG工具
驱动加载工具
PCHunter64
系统自带的计算器和任务管理器等
实现思路:
实际思路与win32的思路一样.都是替换SSDT表里边的函数地址.不过微软被搞怕了,所以在x64上做了一些手脚.
具体手脚就是x64通过SSDT得到的函数地址,不是真实的函数绝对地址了,而是加密了的.
HOOK
1.得到系统服务表基址
2.保存需要Hook的函数地址(实际为偏移)
3.使内存可写,把表中要Hook的地址替换成KeBugCheckEx的地址,还原内存属性
4.HookKeBugCheckEx函数,在其开始处jmp到我们自己的函数地址.
5.自己实现Hook的函数,在其中做处理.
注:
x64要Hook的函数地址是 ServiceTableBase[Index]>>4 + ServiceTableBase
此处Hook了NtOpenProcess,导出序号是35号.处理了结束计算器进程的时候,禁止结束.
还原Hook的时候不需要还原KeBugCheckEx,因为这个函数就是崩溃蓝屏需要执行的函数.
这篇文章不会讲述过PG.
关键代码:
获取服务表基址
//获取服务表基址
ULONGLONG GetKeServiceDescriptorTable64()
{
PUCHAR StartSearchAddress = (PUCHAR)__readmsr(0xC0000082);
PUCHAR EndSearchAddress = StartSearchAddress + 0x500;
PUCHAR i = NULL;
UCHAR byte1 = 0, byte2 = 0