安全矩阵

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

网络安全编程:Inline HOOK SSDT

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

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



在有些情况下,反病毒软件会保护SSDT不受篡改,其保护方式是检查Native API的函数指针数组中的值是否正确。如果其中某项或某几项被修改,那么反病毒软件会将被修改的项恢复到原来的值,这样HOOK SSDT就不成功了。Inline HOOK是修改被HOOK的入口字节为一个跳转,从而跳转入函数中。如果换作是Inline HOOK SSDT的话,那么就不会去修改Native API的函数指针数组中的值了,这样可以避免反病毒软件的检测(注:这只是一个简单的说明,现在使用Inline HOOK SSDT同样会被反病毒软件查杀)。

实现Inline HOOK SSDT的代码如下:
  1. typedef NTSTATUS (*NTCREATEPROCESSEX)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES,
  2.   HANDLE, ULONG, HANDLE, HANDLE, HANDLE, ULONG);
  3. NTCREATEPROCESSEX ulZwCreateProcessEx = 0; // 原始函数地址
  4. unsigned char bOldBytes[5]; // 函数入口代码
  5. unsigned char bNewBytes[5]; // Inline 代码
  6. VOID UnInlineHookCreateProcess();
  7. VOID ReInlineHookCreateProcess();
  8. VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
  9. {
  10.   UnInlineHookCreateProcess();
  11. }
  12. NTSTATUS
  13. MyNtCreateProcessEx(
  14.   __out PHANDLE ProcessHandle,
  15.   __in ACCESS_MASK DesiredAccess,
  16.   __in_opt POBJECT_ATTRIBUTES ObjectAttributes,
  17.   __in HANDLE ParentProcess,
  18.   __in ULONG Flags,
  19.   __in_opt HANDLE SectionHandle,
  20.   __in_opt HANDLE DebugPort,
  21.   __in_opt HANDLE ExceptionPort,
  22.   __in ULONG JobMemberLevel
  23. )
  24. {
  25.   NTSTATUS Status = STATUS_SUCCESS;
  26.   KdPrint(("Enter Inline MyNtCreateProcessEx! \r\n"));
  27.   UnInlineHookCreateProcess();
  28.   Status = ulZwCreateProcessEx(ProcessHandle,
  29.     DesiredAccess,
  30.     ObjectAttributes,
  31.     ParentProcess,
  32.     Flags,
  33.     SectionHandle,
  34.     DebugPort,
  35.     ExceptionPort,
  36.     JobMemberLevel);
  37.   ReInlineHookCreateProcess();
  38.   return Status;
  39. }
  40. VOID UnInlineHookCreateProcess()
  41. {
  42.   UN_PROTECT();
  43.   RtlCopyMemory((PVOID)ulZwCreateProcessEx, (CONST PVOID)bOldBytes, 5);
  44.   RE_PROTECT();
  45. }
  46. VOID ReInlineHookCreateProcess()
  47. {
  48.   UN_PROTECT();
  49.   RtlCopyMemory((PVOID)ulZwCreateProcessEx, (CONST PVOID)bNewBytes, 5);
  50.   RE_PROTECT();
  51. }
  52. VOID InlineHookCreateProcess()
  53. {
  54.   ULONG ulSsdt = 0;
  55.   // 保存 NtCreateProcessEx 的地址
  56.   ULONG ulZwCreateProcessExAddr = 0;
  57.   // __asm int 3;
  58.   // 获取 SSDT
  59.   ulSsdt = (ULONG)KeServiceDescriptorTable->ServiceTableBase;
  60.   // 获取 NtCreateProcessEx 地址的指针
  61.   ulZwCreateProcessExAddr = ulSsdt + 0x30 * 4;
  62.   // 备份 NtCreateProcessEx 的原始地址
  63.   ulZwCreateProcessEx = (NTCREATEPROCESSEX) *(PULONG)ulZwCreateProcessExAddr;
  64.   // 备份函数前 5 字节
  65.   RtlCopyMemory((PVOID)bOldBytes, (CONST PVOID)ulZwCreateProcessEx, 5);
  66.   // 构造入口跳转指令
  67.   bNewBytes[0] = '\xE9'; // jmp 指令
  68.   *(PULONG)&bNewBytes[1] = (ULONG)MyNtCreateProcessEx - (ULONG)ulZwCreateProcessEx - 5;
  69.   // 修改函数前 5 字节
  70.   RtlCopyMemory((PVOID)ulZwCreateProcessEx, (CONST PVOID)bNewBytes, 5);
  71. }
  72. NTSTATUS DriverEntry(
  73.   PDRIVER_OBJECT pDriverObject,
  74.   PUNICODE_STRING pRegistryPath
  75. )
  76. {
  77.   NTSTATUS Status = STATUS_SUCCESS;
  78.   pDriverObject->DriverUnload = DriverUnload;
  79.   UN_PROTECT();
  80.   InlineHookCreateProcess();
  81.   RE_PROTECT();
  82.   return Status;
  83. }
复制代码

其运行结果如图1所示。

图1  Inline HOOK


回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

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

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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