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