看流星社区

 找回密码
 注册账号
查看: 2499|回复: 1

最新处理HS保护的NtOpenProcess Hook

[复制链接]

该用户从未签到

发表于 2013-6-20 12:03:06 | 显示全部楼层 |阅读模式
  1. NTSTATUS PassHSProcessProtect()
  2. {
  3. NTSTATUS status;
  4. UNICODE_STRING funtionName;
  5. ULONG addr;
  6. LONG HSHook;
  7. PMDL pMdl;
  8. PVOID pMyNtOP;


  9. RtlInitUnicodeString(&funtionName,L"NtOpenProcess");
  10. addr = (ULONG)MmGetSystemRoutineAddress(&funtionName);

  11. KdPrint(("NtOpenProcess的地址是%X",addr));

  12. //简单判断是否被HOOK,感觉上是鸡肋
  13. if (!(addr == (ULONG)NtOpenProcess))
  14. {
  15. return STATUS_UNSUCCESSFUL;
  16. }

  17. status = MapMemoryToSystemVA(pMdl, (PVOID)addr, 4096, pMyNtOP);

  18. if (STATUS_UNSUCCESSFUL == status)
  19. {
  20. KdPrint(("MapMemoryToSystemVA 调用失败。111"));
  21. return STATUS_UNSUCCESSFUL;
  22. }

  23. KdPrint(("pMyNtOP为:%X" ,(ULONG)pMyNtOP));

  24. //读取HS的Hook的地址
  25. {
  26. __asm
  27. {
  28. mov ebx, pMyNtOP
  29. mov eax, dword ptr[ebx + 0xB]
  30. mov HSHook, eax
  31. }
  32. }

  33. MmUnmapLockedPages(pMyNtOP,pMdl);

  34. //获得HS的Detour函数的地址
  35. HSHook = (ULONG)NtOpenProcess + 0xA + 5 + HSHook;

  36. KdPrint(("pHSHook:%X" ,HSHook));

  37. status = MapMemoryToSystemVA(pMdl, (PVOID)HSHook, 4096, (PVOID*)HSHook);
  38. if (status == STATUS_UNSUCCESSFUL)
  39. {
  40. KdPrint(("MapMemoryToSystemVA 调用失败!"));
  41. return STATUS_UNSUCCESSFUL;
  42. }

  43. KdPrint(("pHSHook:%X" ,HSHook));

  44. return STATUS_SUCCESS;

  45. //开了HS后的NtOpenProcess
  46. //805cc3fc 68c4000000 push 0C4h
  47. //805cc401 68b8b44d80 push offset nt!ObWatchHandles+0x25c (804db4b8)
  48. //805cc406 e8957cc109 call 8a1e40a0 ;被HOOK的地方
  49. //805cc40b 33f6 xor esi,esi
  50. //805cc40d 8975d4 mov dword ptr [ebp-2Ch],esi
  51. //805cc410 33c0 xor eax,eax
  52. //805cc412 8d7dd8 lea edi,[ebp-28h]
  53. //805cc415 ab stos dword ptr es:[edi]

  54. //这里是HS的Detour函数
  55. //8a1e40a0 e9db009e26 jmp b0bc4180 ;据说这里HS不会检测这里的CRC,果断NOP掉
  56. //8a1e40a5 90 nop
  57. //8a1e40a6 90 nop
  58. //8a1e40a7 90 nop
  59. //8a1e40a8 e9d38a35f6 jmp nt!_SEH_prolog (8053cb80)
  60. //8a1e40ad 90 nop
  61. //8a1e40ae 90 nop
  62. //8a1e40af 90 nop

  63. //NnHook之后NtOpenProcess就变成原来的效果了
  64. //HS是先用一个Detour函数来HookNtOpenProcess,然后跳转到自己的函数里面去。但是我逆向才开始学,所以就以后再去研究(而且可能还有CRC)。
  65. //然后就自己nop下这个跳转指令。发现可以!

  66. //JMP指令占5个字节,你懂的。

  67. //取消NtOpenProcess的Hook
  68. {
  69. __asm
  70. {
  71. mov ebx, HSHook
  72. mov dword ptr[ebx], 0x90909090
  73. mov byte ptr[ebx+4], 0x90
  74. }
  75. }

  76. //下面的是我用错了还是怎么了,没反应
  77. //InterlockedExchange(&HSHook,0x90909090);
  78. //HSHook = HSHook + 1;
  79. //InterlockedExchange(&HSHook,0x90909090);

  80. MmUnmapLockedPages((PVOID)HSHook, pMdl);
  81. IoFreeMdl(pMdl);

  82. return STATUS_SUCCESS;
  83. }



  84. NTSTATUS MapMemoryToSystemVA
  85. (
  86. OUT MDL* pMdl,
  87. IN PVOID pAddr,
  88. IN SIZE_T pageSize,
  89. OUT PVOID* MappedAddr
  90. )
  91. /*++

  92. 函数描述:

  93. 使用MDL以及相关函数把内存中的一块内存映射到系统空间

  94. 参数:

  95. pMdl
  96. MDL结构的地址
  97. pAddr
  98. 需要映射的地址
  99. pageSize
  100. 需要映射的页面大小
  101. MappedAddr
  102. 映射完的地址

  103. 返回值:

  104. 成功返回STATUS_SUCCESS,否则返回STATUS_UNSUCCESSFUL。

  105. --*/
  106. {
  107. //创建MDL
  108. pMdl = MmCreateMdl(NULL,(PVOID)pAddr,4096);

  109. if (!pMdl)
  110. {
  111. KdPrint(("MmCreateMdl 调用失败!pMdl:%X",(ULONG)pMdl));
  112. return STATUS_UNSUCCESSFUL;
  113. }

  114. //在不分页内存中分配MDL
  115. MmBuildMdlForNonPagedPool(pMdl);

  116. //映射到系统空间
  117. pMdl->MdlFlags = pMdl->MdlFlags| MDL_MAPPED_TO_SYSTEM_VA;

  118. //锁定区域,并返回映射区域的指针
  119. *MappedAddr = (PVOID)MmMapLockedPages(pMdl, KernelMode);

  120. if (*MappedAddr == NULL)
  121. {
  122. KdPrint(("MmMapLockedPages 调用失败!"));
  123. return STATUS_UNSUCCESSFUL;
  124. }

  125. return STATUS_SUCCESS;
  126. }
复制代码

该用户从未签到

发表于 2013-6-20 23:29:58 | 显示全部楼层
嗯,不错,MDL都用了,
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-26 16:40

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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