关于进程防杀思路:
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 CrossThreadFlags的SystemThread(4)位是否为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...>
进程防杀的效果和以上相同!