看流星社区

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

OD SOD TP的那些事儿 非法调试

[复制链接]

该用户从未签到

发表于 2013-1-27 10:10:11 | 显示全部楼层 |阅读模式
  1. SDO年久失修~~被TP爆非法调试~

  2. //OD SOD TP的那些事儿
  3. //恢复SOD的NtOpenThread SSDThook,不然tp爆非法调试
  4. //然后这里接管这个函数的过滤

  5. NTSTATUS __stdcall NewNtOpenThread(
  6.         OUT PHANDLE             ThreadHandle,
  7.         IN ACCESS_MASK          AccessMask,
  8.         IN PVOID                           ObjectAttributes,
  9.         IN PCLIENT_ID           ClientId
  10.         )
  11. {
  12.         PETHREAD EThread;
  13.         PEPROCESS EProcess;
  14.         NTSTATUS status;
  15.         ZWOPENTHREAD OldZwOpenThread;
  16.         ULONG ulPage;

  17.         __asm{
  18.                 push eax
  19.                 mov eax,[ebp+4]
  20.                 mov ulPage,eax
  21.                 pop eax
  22.         }
  23.         //tp的菊花痒,非得用原始KeServiceDescriptorTable里面的函数,经过tp的钩子,才不报非法调试
  24.         OldZwOpenThread = KeServiceDescriptorTable->ServiceTable[ZwOpenThreadIndex];

  25.         //让OD能XXXXXX
  26.         if (IsFromDebugProcess(RPsGetCurrentProcess()))
  27.         {
  28.                 OldZwOpenThread = OriginalServiceDescriptorTable->ServiceTable[ZwOpenThreadIndex];
  29.         }
  30.         status = OldZwOpenThread(
  31.                 ThreadHandle,
  32.                 AccessMask,
  33.                 ObjectAttributes,
  34.                 ClientId
  35.                 );
  36.         if (NT_SUCCESS(status))
  37.         {
  38.                 //如果是自己的驱动调用,则返回哦
  39.                 if (ulPage >= ulMyDriverBase && ulPage <= ulMyDriverBase+ulMyDriverSize){
  40.                         return status;
  41.                 }
  42.                 //好像这里的判断是多余的~
  43.                 if (KeGetCurrentIrql() != PASSIVE_LEVEL){
  44.                         return status;
  45.                 }
  46.                 //如果退出了
  47.                 if (!bIsInitSuccess){
  48.                         return status;
  49.                 }
  50.                 //如果没有保护
  51.                 if (!bProtectProcess){
  52.                         return status;
  53.                 }
  54.                 //过滤掉桌面进程以及csrss进程
  55.                 if (_stricmp(PsGetProcessImageFileName(RPsGetCurrentProcess()),"explorer.exe") == 0 ||
  56.                         RPsGetCurrentProcess() == CsrssEProcess)
  57.                 {
  58.                         return status;
  59.                 }
  60.                 //get ethread
  61.                 status = ObReferenceObjectByHandle(
  62.                         ThreadHandle,
  63.                         THREAD_ALL_ACCESS,
  64.                         *PsThreadType,
  65.                         KernelMode,
  66.                         (PVOID*)&EThread,
  67.                         NULL
  68.                         );
  69.                 if (NT_SUCCESS(status))
  70.                 {
  71.                         ObDereferenceObject(EThread);
  72.                         //get eprocess
  73.                         EProcess = IoThreadToProcess(EThread);

  74.                         if (IsFromDebugProcess(EProcess))
  75.                         {
  76.                                 if (DebugOn)
  77.                                         KdPrint(("open OD Thread by %s\n",PsGetProcessImageFileName(RPsGetCurrentProcess())));
  78.                                 return STATUS_ACCESS_DENIED;
  79.                         }
  80.                 }
  81.                 status = STATUS_SUCCESS;
  82.         }
  83.         return status;
  84. }
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

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

GMT+8, 2024-4-20 14:26

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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