首页 > 其他 > 详细

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

时间:2019-09-20 18:18:28      阅读:103      评论:0      收藏:0      [点我收藏+]

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函数的调用号。

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

原文:https://www.cnblogs.com/LyShark/p/11558680.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!