zyustc

常用链接

统计

最新评论

DKOM更改ETHREAD--进程防杀

关于进程防杀思路:

1.保持现有进程防杀机制不变!的确,瑞星此时在防止Ring3下进程的防杀几乎没有缺憾!

2.直接操作线程的ETHREAD结构的几个变量!只是简单的DKOM,就达到了底层HOOK 函数所达到的功能!此时达到的功能:防止冰刃,RkU的进程防杀----当然,对于大部分的程序也能阻止....

 

DKOM进程防杀的技术点--这里是对线程的操作----(遍历进程内的所有线程即可):

 

方案1

KernelApcDisable ----利用这个值来防止APC的插入!------KernelApcDisable ++;

kd> dt _ethread -r

nt!_ETHREAD

   +0x000 Tcb              : _KTHREAD

           ...................

     +0x0d4 KernelApcDisable : Uint4B------利用这个!

        ...................

      +0x166 ApcQueueable     : UChar-------我测试时BSOD!

 

KernelApcDisable 这个关键点的利用在于对PsLookupProcessByProcessId函数的分析时发现并测试的!

PsLookupProcessByProcessId提取的指令:

........

805c8c35 ff7508          push    dword ptr [ebp+8]

805c8c38 8bf0            mov     esi,eax

805c8c3a ff8ed4000000    dec     dword ptr [esi+0D4h]

.........

 

 

不过,利用这种方式来防杀,首先遇到的问题就是:其他进程(冰刃,Rku....)都无法结束利用此种方式保护的进程......

如果是程序自己结束,BSOD!解决方案很简单,当自己程序结束时,恢复这个值就可以了!

 

方案2:更改CrossThreadFlags 的线程属性

kd> dt _ethread

nt!_ETHREAD

   +0x248 CrossThreadFlags : Uint4B

   +0x248 Terminated       : Pos 0, 1 Bit---欺骗系统此线程已经结束!-----值=1;

   +0x248 DeadThread       : Pos 1, 1 Bit

   +0x248 HideFromDebugger : Pos 2, 1 Bit

   +0x248 ActiveImpersonationInfo : Pos 3, 1 Bit

   +0x248 SystemThread     : Pos 4, 1 Bit-----欺骗系统此线程为系统线程!!-----值=1;

   +0x248 HardErrorsAreDisabled : Pos 5, 1 Bit

   +0x248 BreakOnTermination : Pos 6, 1 Bit

   +0x248 SkipCreationMsg : Pos 7, 1 Bit

   +0x248 SkipTerminationMsg : Pos 8, 1 Bit

 

 

这个在Wrk中有简单的说明,大概就是:

union {

        ULONG CrossThreadFlags;   

        struct {

            ULONG Terminated              : 1;

            ULONG DeadThread              : 1;

            ULONG HideFromDebugger        : 1;

            ULONG ActiveImpersonationInfo : 1;

            ULONG SystemThread            : 1;

            ULONG HardErrorsAreDisabled   : 1;

            ULONG BreakOnTermination      : 1;

            ULONG SkipCreationMsg         : 1;

            ULONG SkipTerminationMsg      : 1;

       };

};

A.利用ULONG SystemThread            : 1的思路来源:

对于PspTerminateThreadByPointer的代码分析:

..............

805c83f2 f60610          test    byte ptr [esi],10h

;检测0x248 CrossThreadFlagsSystemThread4)位是否为1!是,表示是系统线程,不能结束!

805c83f5 740a            je      nt!PspTerminateThreadByPointer+0x61 (805c8401)

................

 

 

利用这种方式达到的效果仍然和方案1相同!并且自己结束时也不会造成蓝屏!

 

B.利用 +0x248 Terminated       : Pos 0, 1 Bit的思路来源:

对于PspTerminateThreadByPointer的代码分析

..................

805c8428 8b4d08          mov     ecx,dword ptr [ebp+8];-----ETHREAD!参数1

805c842b 33d2            xor     edx,edx

805c842d 42              inc     edx;---edi=1;

805c842e 81c148020000    add     ecx,248h;-ecx=ETHREAD+0x248;

805c8434 8b01            mov     eax,dword ptr [ecx];eax=CrossThreadFlags;

805c8436 8bf0            mov     esi,eax---esi=CrossThreadFlags;

805c8438 0bf2            or      esi,edx

;----esi=CrossThreadFlags|1!Terminated标志位如果为1,esi=1;反之,为0

805c843a f00fb131        lock cmpxchg dword ptr [ecx],esi

--比较交换吗?如果CrossThreadFlags原来的值为0,标志位为0!如果原来的值为1,标志位为1

但最后ETHREAD+0x248 -CrossThreadFlags Terminated标志位为1!

805c843e 75f6            jne     nt!PspTerminateThreadByPointer+0x96 (805c8436)

805c8440 84c2            test    dl,al----dl---1;al----CrossThreadFlags

------这儿的比较注意:比较的是原来的CrossThreadFlags的标志!如果原来的值为0,则805c8444

如果原来的值为1,则跳转到805c8489

.................................

<代码中的注释是我的理解,如果错了,多多包涵,o(_)o...>

进程防杀的效果和以上相同!

posted on 2010-01-23 16:38 风一样的离去 阅读(1139) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理