最近在学习Ring0层Hook的一些知识点,很久就写完SSDTHook的代码了,但是一直没有整理成笔记,最近有时间也就整理整理。

介绍:

     SSDTHook 实质是利用Ntoskrnl.exe 中全局导出的SSDT来进行Hook,SSDT(SystemServiceDescriptorTable,系统服务描述表),为什么要去用到SSDT表呢?

     我们看一下ZwOpenProcess实现就明白了。为什么不用Nt系列函数,可以看我之前的文章。

 

kd> u 0x8485acd8
            nt!ZwOpenProcess:
            8485acd8 b8 be000000      mov     eax,0BEh
            8485acdd 8d542404        lea     edx,[esp+4]
            8485ace1 9c              pushfd
            8485ace2 6a08            push    8
            8485ace4 e8d5190000      call    nt!KiSystemService (8485c6be)
            8485ace9 c21000          ret     10h
            nt!ZwOpenProcessToken:
            8485acec b8bf000000      mov     eax,0BFh
            8485acf1 8d542404        lea     edx,[esp+4]

 

    KiSystemService是系统调用的内核入口,也是从Ring3陷入Ring0的关键点。在第一句中mov eax,0BEh 中的BEh在我看来就是一个序号,相当于中断向量表中的中断类型号一样,在SSDT表中通过这序号,才找到真正的NtOpenProcess函数的代码出。很容易就能理解,我们为什么要找这个。原因在于:我们要把SSDT表中相应位置的函数地址替换掉,就实现了Hook。

 (一)

 

     ⚪首先找到全局导出的KeServiceDescriptorTable。

     ⚪然后从MmGetSystemRoutineAddress函数中获取ZwOpenProcess函数地址。

     ⚪从ZwOpenProcess中获取序号。

     ⚪将SSDT表所在页属性改为可读可写的状态。

     ⚪将自己写好的Fake函数地址替换进去即可。

 

Hook之前:                                                                               Hook之后:

 

 

             

 

 

 

 

 

 

extern PSYSTEM_SERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;  //全局导出的SSDT

/*
typedef struct _SYSTEM_SERVICE_DESCRIPTOR_TABLE_     
{
    PVOID ServiceTableBase; //这个指向系统服务函数地址表
    PULONG ServiceCounterTableBase;
    ULONG NumberOfService; //服务函数的个数
    ULONG ParamTableBase;
}SYSTEM_SERVICE_DESCRIPTOR_TABLE, *PSYSTEM_SERVICE_DESCRIPTOR_TABLE;

0x84988b00 struct _SYSTEM_SERVICE_DESCRIPTOR_TABLE_ *
ServiceTableBase         0x8489d43c
ServiceCounterTableBase  0x00000000
NumberOfService          0x191
ParamTableBase           0x8489da84
*/

 

版权声明:本文为matthew-memorys原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/matthew-memorys/p/12600916.html