看流星社区

 找回密码
 注册账号
查看: 2959|回复: 0

过滤函数里,tp爆非法模块的解决方法

[复制链接]

该用户从未签到

发表于 2013-1-27 10:09:01 | 显示全部楼层 |阅读模式
在hookport过滤函数中,一不小心就种了tp的圈套~~下面是处理方法:
  1. NTSTATUS __stdcall NewNtOpenProcess(
  2.   OUT PHANDLE             ProcessHandle,
  3.   IN ACCESS_MASK          AccessMask,
  4.   IN PVOID         ObjectAttributes,
  5.   IN PCLIENT_ID           ClientId
  6.   )
  7. {
  8.   PEPROCESS EProcess;
  9.   NTSTATUS status;
  10.   ZWOPENPROCESS OldZwOpenProcess;
  11.   ULONG ulPage;

  12.   __asm{
  13.     push eax
  14.     mov eax,[ebp+4]
  15.     mov ulPage,eax
  16.     pop eax
  17.   }
  18.   //如果是自己的驱动调用,则返回哦
  19.   if (ulPage >= ulMyDriverBase && ulPage <= ulMyDriverBase+ulMyDriverSize)
  20.   {
  21.     goto _FunctionRet;
  22.   }
  23.   if (KeGetCurrentIrql() != PASSIVE_LEVEL)
  24.   {
  25.     goto _FunctionRet;
  26.   }
  27.   //如果退出了
  28.   if (!bIsInitSuccess)
  29.     goto _FunctionRet;

  30.   //是否要保护
  31.   if (!bProtectProcess)
  32.     goto _FunctionRet;

  33.   //过滤掉桌面进程以及csrss进程
  34.   if (_stricmp(PsGetProcessImageFileName(RPsGetCurrentProcess()),"explorer.exe") == 0 ||
  35.     RPsGetCurrentProcess() == CsrssEProcess)
  36.   {
  37.     goto _FunctionRet;
  38.   }
  39.   if (MmIsAddressValidEx(ClientId))
  40.   {
  41.     if (IsFromDebugProcessId(ClientId->UniqueProcess))
  42.     {
  43.       //乾坤大挪移
  44.       ClientId->UniqueProcess = PsGetCurrentProcessId();

  45.       if (DebugOn)
  46.         KdPrint(("open OD process by %s\n",PsGetProcessImageFileName(RPsGetCurrentProcess())));
  47.     }
  48.     //如果调用者不是csrss,那么所有来自任何进程打开csrss的操作,都XXXX
  49.     if (PsGetCurrentProcessId() != CsrssID)
  50.     {
  51.       if (ClientId->UniqueProcess == CsrssID)
  52.       {
  53.         //乾坤大挪移
  54.         ClientId->UniqueProcess = PsGetCurrentProcessId();

  55.         if (DebugOn)
  56.           KdPrint(("open csrss process by %s\n",PsGetProcessImageFileName(RPsGetCurrentProcess())));
  57.       }
  58.     }
  59.   }
  60. _FunctionRet:
  61.   //tp的菊花痒了,非得用原始KeServiceDescriptorTable里面的函数,经过tp的钩子,才不报非法模块
  62.   OldZwOpenProcess = KeServiceDescriptorTable->ServiceTable[ZwOpenProcessIndex];

  63.   //让OD能XXXXXX
  64.   if (IsFromDebugProcess(RPsGetCurrentProcess()))
  65.   {
  66.     OldZwOpenProcess = OriginalServiceDescriptorTable->ServiceTable[ZwOpenProcessIndex];
  67.   }
  68.   return OldZwOpenProcess(
  69.     ProcessHandle,
  70.     AccessMask,
  71.     ObjectAttributes,
  72.     ClientId
  73.     );
  74. }
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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

GMT+8, 2024-3-29 15:14

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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