首页
社区
课程
招聘
[分享]用ObRegisterCallbacks实现进程防杀
发表于: 2012-9-12 15:52 42577

[分享]用ObRegisterCallbacks实现进程防杀

2012-9-12 15:52
42577
之前做了xp下的进程防杀,现在这个用于WIN7,采用的是回调的方式。
没什么技术含量,会的人赶紧飞开。
源码和bin我都上传了。
欢迎kman来继续杀进程。

有兴趣的可以帮我测试下,步骤如下:
1、        由于我的驱动未签名,所以需要在虚拟机里运行,并且要修改下内核,否则ObRegisterCallbacks会返回错误0xC0000022。具体可参考http://bbs.pediy.com/showthread.php?t=140891&highlight=ObRegisterCallbacks

//        bp nt!ObRegisterCallbacks+0xf5 ".if(1){ r @eax=1; gc; }.else{gc;}"
//        bp nt!ObRegisterCallbacks+0x109 ".if(1){ r @eax=1; gc; }.else{gc;}"
//
//        或者
//
//        ew ObRegisterCallbacks+0xf7 0x9090
//        ew ObRegisterCallbacks+0x10b 0x9090

或者

注册回调前加段代码,改一个比特位就解决了    // mccoysc提供的方法

代码:
PLDR_DATA_TABLE_ENTRY pLdrEntry=(PLDR_DATA_TABLE_ENTRY)pDrvObj->DriverSection;
pLdrEntry->Flags |=0x20;


2、        进入虚拟机后,把bin里的文件拷贝到c盘根目录下。
3、        运行InstDrv.exe,把驱动new_MoniProcess32.sys加载起来,再运行AntiCrack.exe。然后就可以试着强杀AntiCrack.exe了。之前kman的oooshit.exe和oooshit2.exe也杀不了的,呵呵。

注:任务管理器的结束任务可以杀掉AntiCrack.exe,至于为什么,我还要研究下。

bin
bin.rar

src
src.rar

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (69)
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
2
代码有个错误,
在 函数   OB_PREOP_CALLBACK_STATUS ObjectPreCallback_Thread_Dispatch(
        IN PVOID  RegistrationContext,
        IN POB_PRE_OPERATION_INFORMATION  OperationInformation ) 里

需要将 PROCESS_TERMINATE 换成 THREAD_TERMINATE
2012-9-12 16:36
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
3
win7 的任务管理器在结束任务时:

int __stdcall EndTaskThreadProc(LPVOID lpMem)
{
  LPVOID v1; // esi@1
  int v2; // edi@2
  BOOL v3; // eax@4
  DWORD v4; // eax@8
  DWORD v5; // eax@14
  DWORD v6; // eax@19
  bool v7; // zf@19
  bool v8; // sf@19
  char v9; // of@19
  HANDLE v10; // eax@27
  int v11; // ST14_4@28
  int v12; // eax@28
  ULONG_PTR dwResult; // [sp+8h] [bp-Ch]@12
  int v15; // [sp+Ch] [bp-8h]@4
  int v16; // [sp+10h] [bp-4h]@1
  int lpMema; // [sp+1Ch] [bp+8h]@3

  v1 = lpMem;
  v16 = 40046;
  if ( !lpMem )
  {
    v2 = -2147467259;
    goto LABEL_28;
  }
  v16 = *((_DWORD *)lpMem + 4);
  lpMema = *((_DWORD *)lpMem + 3);
  if ( !lpMema )
  {
    v3 = IsHungAppWindow(*((HWND *)v1 + 1));
    v15 = v3 == 0;
    if ( v3 != 0 )
    {
      TmGetProcessStatus(*((_DWORD *)v1 + 5), (int)&v15);
      lpMema = v15 == 0;
      if ( !v15 )
        v16 = 40207;
    }
  }
  if ( !SetThreadDesktop(*(HDESK *)v1) )
  {
    v4 = GetLastError();
    if ( (signed int)v4 > 0 )
      v4 = (unsigned __int16)v4 | 0x80070000;
    v2 = v4;
    if ( (v4 & 0x80000000u) != 0 )
      goto LABEL_26;
  }
  if ( !lpMema )
  {
   if ( SendMessageTimeoutW(*((HWND *)v1 + 1), 0x10u, 0, 0, 3u, 0x1F4u, &dwResult) )
    {
      v2 = 0;
    }
    else
    {
      v5 = GetLastError();
      if ( (signed int)v5 > 0 )
        v5 = (unsigned __int16)v5 | 0x80070000;
      v2 = v5;
      if ( (v5 & 0x80000000u) != 0 )
      {
LABEL_18:
        v2 = 0;
        if ( !EndTask(*((_DWORD *)v1 + 1), 0, 0) )
        {
          v6 = GetLastError();
          v9 = 0;
          v7 = v6 == 0;
          v8 = (v6 & 0x80000000u) != 0;
LABEL_23:
          if ( !((unsigned __int8)(v8 ^ v9) | v7) )
            v6 = (unsigned __int16)v6 | 0x80070000;
          v2 = v6;
          goto LABEL_26;
        }
        goto LABEL_26;
      }
    }
    Sleep(0x1F4u);
    if ( !IsWindowVisible(*((HWND *)v1 + 1)) )
      goto LABEL_26;
    goto LABEL_18;
  }
  if ( !EndTask(*((_DWORD *)v1 + 1), 0, 1) )
  {
    v6 = GetLastError();
    v9 = 0;
    v7 = v6 == 0;
    v8 = (v6 & 0x80000000u) != 0;
    goto LABEL_23;
  }
  v2 = 0;
LABEL_26:
  if ( *((_DWORD *)v1 + 6) )
  {
    v10 = GetProcessHeap();
    HeapFree(v10, 0, v1);
  }
LABEL_28:
  v11 = v16;
  v12 = IsUserAdmin();
  TmSqmAction(v12, 0, v11, 0, v2);
  return v2;
}
2012-9-12 17:33
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
4
00CF843A  |.  FF15 5013CE00 CALL DWORD PTR DS:[<&USER32.SendMessageTimeoutW>]                    ; \SendMessageTimeoutW
02DEFC30   00150332  |hWnd = 00150332 ('test_kill',class='#32770')
02DEFC34   00000010  |Message = WM_CLOSE
02DEFC38   00000000  |wParam = 0
02DEFC3C   00000000  |lParam = 0
02DEFC40   00000003  |Flags = SMTO_BLOCK|SMTO_ABORTIFHUNG
02DEFC44   000001F4  |Timeout = 500. ms
02DEFC48   02DEFC58  \pResult = 02DEFC58
2012-9-12 17:35
0
雪    币: 473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
强烈围观一下,谢谢楼主,分享。。。源码万岁。。。
2012-9-12 17:56
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
ObRegisterCallbacks的验证可以通过一个小技巧绕过。
另外插个APC还是欢乐的结束了~XXOO的方法太多了~
2012-9-12 18:54
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
最简单直接改一下
_OBJECT_TYPE_INITIALIZER        中的                                                                                                   

                  union
                  {
/*0x002*/         UINT8        ObjectTypeFlags;
                          struct
                          {
/*0x002*/             UINT8        CaseInsensitive : 1;
/*0x002*/             UINT8        UnnamedObjectsOnly : 1;
/*0x002*/             UINT8        UseDefaultObject : 1;
/*0x002*/             UINT8        SecurityRequired : 1;
/*0x002*/             UINT8        MaintainHandleCount : 1;
/*0x002*/             UINT8        MaintainTypeList : 1;
/*0x002*/             UINT8        SupportsObjectCallbacks : 1;
                          };
                  };
SupportsObjectCallbacks  去掉后,轻松over~
太多可以xxoo的地方了,obcallback弱的很~
2012-9-12 19:18
0
雪    币: 1895
活跃值: (1642)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
老V深爱着object_type····
2012-9-12 20:35
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
9
我不深爱~
我深爱MSDN~
2012-9-12 21:58
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
10
"太多可以xxoo的地方了,obcallback弱的很~"

你都进内核了,不只是obcallback弱的很,一切都皆有可能了。呵呵
2012-9-12 23:06
0
雪    币: 405
活跃值: (2255)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
对于防守RING3的还是可以的,而且64位下,是比较有效的方法,32位下进RING0,可以无视了。怎么干都行。
2012-9-13 14:24
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
12
就是考虑到64位系统下不能hook了,所以我才搞这种框架。很蛋疼,代码都要写两套
2012-9-13 14:47
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
不考虑内核的破坏

win32下

插APC,你总要线程句柄的吧

设置了PsProcess和PsThread的监控后,你怎么获取到句柄?
2012-9-13 14:55
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
win32下你能改这个结构体么。。。。要是内核的话。。。都进内核了,没什么是不可以的。。。。某人的这句话还是很正确的
2012-9-13 14:56
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
实际上,随便什么HIPS之流的。。。没了先入为主的优势,监视垃圾一堆

这些各种保护,都必须有个前提,那就是你得先入为主,你先把防御搭起来。。然后等着别人来攻击。没了这个前提,你再怎么防都没用。

防御的和攻击的,都在内核的话。。。这次可能你防御的手段高明些而已,人家没攻破,但是真的想搞,dbg一下,看下你防守的原理,针对性处理一下。。。马上就能搞定。。然后双方这么死循环下去
2012-9-13 15:00
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
object hook的话64位还不是照用不误
2012-9-13 15:02
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
这个

注册回调前加段代码,改一个比特位就解决了

PLDR_DATA_TABLE_ENTRY pLdrEntry=(PLDR_DATA_TABLE_ENTRY)pDrvObj->DriverSection;
pLdrEntry->Flags |=0x20;
2012-9-13 15:07
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
看了下代码

那个写得有问题

// 去除掉杀进程的权限
                        OperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess ^= PROCESS_TERMINATE;

这个求异或的话,会把除PROCESS_TERMINATE外的其他所有权限都给加上了。。。。明显不该这样

应该是仅仅去掉PROCESS_TERMINATE而已,正确做法该是:
OperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= (~PROCESS_TERMINATE);
2012-9-13 16:41
0
雪    币: 316
活跃值: (128)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
19
跟着楼上学习.
2012-9-13 18:30
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
20
64位下的object hook,我没有试过,不知道行不行
函数Hook、ssdt hook 试过了的,是行不通的。

既然微软用了新框架,我打算hook这种方式就只用于xp下了,
vista及其以后的系统我就用新框架了,
2012-9-14 11:04
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
貌似你没搞明白patch guard的基本原理

人家pg只能对死的代码进行检查

object header是系统启动时动态填充的。。。焉有检查的道理?
2012-9-14 11:15
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
22
一般原则当然是有标准做法就用标准做法

不过,比如注册表监控,cm回调没法完全搞定。。。。这种非用object hook不可

本来我是向来不建议使用hook的。。。但是没办法的情况下,也可以一用。。。object hook在兼容性上要优于其他任何类型hook
2012-9-14 11:18
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
23
至于inline,ssdt的hook。。。。。还是洗洗睡了吧
2012-9-14 11:18
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
24
win7下我测试了,这个方法确实可行,呵呵,感谢
2012-9-14 11:19
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
25
这里是有问题,
2012-9-14 11:20
0
游客
登录 | 注册 方可回帖
返回
//