安全矩阵

 找回密码
 立即注册
搜索
查看: 2096|回复: 0

网络安全编程:HOOK SSDT

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-6-29 18:12:44 | 显示全部楼层 |阅读模式
网络安全编程:HOOK SSDT计算机与网络安全 前天
一次性付费进群,长期免费索取资料。
回复公众号:微信群 可查看进群流程。



SSDT把用户层的Win32 API与内核层的Native API做了一个关联,而整个Native API都保存在SSDT中的一个函数指针数组中,只要修改函数指针数组中的某一项,就相当于HOOK了某个Native API函数。比如,修改SSDT中函数指针数组中的最后一个函数指针,就相当于HOOK了NtQueryPortInformationProcess()函数。

下面HOOK一个比较熟悉的函数,即创建进程函数NtCreateProcessEx()。该函数在指针数组的第0x30项(该编号根据系统版本的不同而不同,是系统相关的)。通过编程获取SSDT表,然后找到Native API的函数指针数组,再修改其中第0x30项的内容为自己的函数地址。为了不影响进程的正常创建,在函数中调用NtCreateProcessEx()函数。代码如下:
  1. #include <ntddk.h>
  2. typedef struct _SERVICE_DESCRIPTOR_TABLE
  3. {
  4.   PULONG ServiceTableBase;
  5.   PULONG ServiceCounterTableBase;
  6.   ULONG NumberOfServices;
  7.   PUCHAR ParamTableBase;
  8. }SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;
  9. extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;
  10. typedef NTSTATUS (*NTCREATEPROCESSEX)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
  11. HANDLE, ULONG, HANDLE, HANDLE, HANDLE, ULONG);
  12. // 保存 NtCreateProcessEx 函数的地址
  13. NTCREATEPROCESSEX ulNtCreateProcessEx = 0;
  14. // 在指针数组中 NtCreateProcessEx 的地址
  15. ULONG ulNtCreateProcessExAddr = 0;
  16. VOID UN_PROTECT()
  17. {
  18.   __asm
  19.   {
  20.     push eax
  21.     mov eax, CR0
  22.     and eax, 0FFFEFFFFh
  23.     mov CR0, eax
  24.     pop eax
  25.   }
  26. }
  27. VOID RE_PROTECT()
  28. {
  29.   __asm
  30.   {
  31.     push eax
  32.     mov eax, CR0
  33.     or eax, 0FFFEFFFFh
  34.     mov CR0, eax
  35.     pop eax
  36.   }
  37. }
  38. VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
  39. {
  40.   UN_PROTECT();
  41.   // 替换 NtCreateProcessEx 的地址为 MyNtCreateProcessEx
  42.   *(PULONG)ulNtCreateProcessExAddr = (ULONG)ulNtCreateProcessEx;
  43.   RE_PROTECT();
  44. }
  45. NTSTATUS
  46. MyNtCreateProcessEx(
  47.   __out PHANDLE ProcessHandle,
  48.   __in ACCESS_MASK DesiredAccess,
  49.   __in_opt POBJECT_ATTRIBUTES ObjectAttributes,
  50.   __in HANDLE ParentProcess,
  51.   __in ULONG Flags,
  52.   __in_opt HANDLE SectionHandle,
  53.   __in_opt HANDLE DebugPort,
  54.   __in_opt HANDLE ExceptionPort,
  55.   __in ULONG JobMemberLevel
  56. )
  57. {
  58.   NTSTATUS Status = STATUS_SUCCESS;
  59.   KdPrint(("Enter MyNtCreateProcessEx! \r\n"));
  60.   Status = ulNtCreateProcessEx(ProcessHandle,
  61.     DesiredAccess,
  62.     ObjectAttributes,
  63.     ParentProcess,
  64.     Flags,
  65.     SectionHandle,
  66.     DebugPort,
  67.     ExceptionPort,
  68.   JobMemberLevel);
  69.   return Status;
  70. }
  71. VOID HookCreateProcess()
  72. {
  73.   ULONG ulSsdt = 0;
  74.   // 保存 NtCreateProcess 的地址
  75.   // 获取 SSDT
  76.   ulSsdt = (ULONG)KeServiceDescriptorTable->ServiceTableBase;
  77.   // 获取 NtCreateProcessEx 地址的指针
  78.   ulNtCreateProcessExAddr = ulSsdt + 0x30 * 4;
  79.   // 备份 NtCreateProcessEx 的原始地址
  80.   ulNtCreateProcessEx = (NTCREATEPROCESSEX) *(PULONG)ulNtCreateProcessExAddr;
  81.   UN_PROTECT();
  82.   // 替换 NtCreateProcessEx 的地址为 MyNtCreateProcessEx
  83.   *(PULONG)ulNtCreateProcessExAddr = (ULONG)MyNtCreateProcessEx;
  84.   RE_PROTECT();
  85. }
  86. NTSTATUS DriverEntry(
  87.   PDRIVER_OBJECT pDriverObject,
  88.   PUNICODE_STRING pRegistryPath
  89. )
  90. {
  91.   NTSTATUS Status = STATUS_SUCCESS;
  92.   pDriverObject->DriverUnload = DriverUnload;
  93.   HookCreateProcess();
  94.   return Status;
  95. }
复制代码

DriverEntry()中调用了HookCreateProcess()函数,该函数的作用是将指针数组中NtCreateProcessEx()函数的地址替换为MyNtCreateProcessEx()函数的地址。而MyNtCreateProcessEx()函数是用来取代NtCreateProcessEx()函数的函数,在这里的函数中调用了一条KdPrint()用于输出代码。整个HOOK的过程非常简单,只要找到指针数组的位置,保存原地址后修改为新的地址即可。代码中出现了两个函数,分别是UN_PROTECT()和RE_PROTECT()。这两个函数的作用是禁止和开启CPU向标志为只读的内存页进行写入的操作。执行UN_PROTECT后, CPU可以向标志为只读的内存页进行写入操作。当写入完成后,调用RE_PROTECT()函数恢复到原来的状态。把它放到虚拟机中,打开DebugView,然后加载该驱动,加载成功后随便运行一个可执行程序。可以看到,DebugView中显示了在MyNtCreateProcessEx()中的输出,如图1所示,说明HOOK成功了。

图1  MyNtCreateProcessEx()函数的输出


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 06:31 , Processed in 0.014648 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表