恢复在WIN64上的SSDT钩子
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 要恢复SSDT,首先要获得SSDT各个函数的原始地址,而SSDT各个函数的原始地址,自然是存储在内核文件里的。于是,有了以下思路: 1.获得内核里KiServiceTable的地址(变量名称:KiServiceTable) 2.获得内核文件在内核里的加载地址(变量名称:NtosBase) 3.获得内核文件在PE32+结构体里的映像基址(变量名称:NtosImageBase) 4.在自身进程里加载内核文件并取得映射地址(变量名称:NtosInProcess) 5.计算出KiServiceTable和NtosBase之间的“距离”(变量名称:RVA) 6.获得指定INDEX函数的地址(计算公式:*(PULONGLONG)(NtosInProcess+RVA+8*index)-NtosImageBase+NtosBase) 思路和WIN32下获得SSDT函数原始地址差异不大,接下来解释一下第六步的计算公式是怎么得来的。首先看一张IDA的截图: 可见,从文件中的KiServiceTable地址开始,每8个字节,存储一个函数的“理想地址”(之所以说是理想地址,是因为这个地址是基于『内核文件的映像基址NtosImageBase』的,而不是基于『内核文件的加载基址NtosBase』的)。因此,得到8*index