驱动保护:挂接SSDT内核钩子(1)

坚强是说给别人听的谎言 提交于 2019-11-30 04:17:18

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> 此处我们直接跟进去。

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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!