SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序,来实现搜索 SSDT 函数的地址,并能够实现简单的内核 Hook 挂钩。
在开始编写驱动之前,我们先来分析一下Ring3到Ring0是如何协作的,这里通过C语言调用 OpenProcess
函数,并分析它的执行过程,先来创建一个C程序。
#include <windows.h>
int main(int argc, char* argv[])
{
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,2548);
return 0;
}
通过VC6编译器编译,并使用OD载入程序,找到程序的OEP,分析第一次调用,可以看到CALL的地址是 <&KERNEL32.OpenProcess>
此处我们F7直接跟进这个CALL。
0040102A |. 68 F4090000 push 0x9F4 ; /ProcessId = 0x9F4
0040102F |. 6A 00 push 0x0 ; |Inheritable = FALSE
00401031 |. 68 FF0F1F00 push 0x1F0FFF ; |Access = PROCESS_ALL_ACCESS
00401036 |. FF15 4CA14200 call dword ptr [<&KERNEL32.OpenProcess>] ; \OpenProcess
0040103C |. 3BF4 cmp esi, esp
此时我们已经进入到了 00401036
这个地址中,观察下方的代码,发现其调用了&ntdll.NtOpenProcess
这个函数,我们继续F7跟进。
772CBBA7 50 push eax
772CBBA8 FF75 08 push dword ptr [ebp+0x8]
772CBBAB 8D45 FC lea eax, dword ptr [ebp-0x4]
772CBBAE 894D F0 mov dword ptr [ebp-0x10], ecx
772CBBB1 50 push eax
772CBBB2 FF15 78883977 call dword ptr [<&ntdll.NtOpenProcess>] ; ntdll.ZwOpenProcess
当我们进入到NtOpenProcess
这个函数时,会看到以下代码,其中0x26
将其转换成十进制是38
。
778D0700 > B8 26000000 mov eax, 0x26
778D0705 BA C04F8E77 mov edx, 778E4FC0
778D070A FFD2 call edx
778D070C C2 1000 retn 0x10
通过使用Xuetr工具对比,可以发现这个0x26正好就是 NtOpenProcess
函数的调用号。
原文:https://www.cnblogs.com/LyShark/p/11558680.html