自从改行玩硬件后,就不多关注病毒和反病毒之间的斗争了。某天在中关村论坛听到一
名网友说 360在WIN64 上有了进程自我保护,万分牛逼,连微软的Process Explorer都不
能结束呢!我听后内心十分好奇,因而重操旧业,下载了最新版本的360 安全卫士7.7版本
(2011-5-6),安装在64位 Windows 7虚拟机上来测试。
首先拿“任务管理器”来测试,果真再次出现了熟悉的“拒绝访问”提示: 安全
而后尝试用用重载NTDLL + ZwGetNextProcess得到句柄,发现NTSTATUS的返回值老是
失败。后来发现OpenProcess能够在低权限下(好比以查询进程信息的权限
PROCESS_QUERY_INFORMATION)打开360 的进程,可是想用DuplicateHandle或者
NtDuplicateObject来得到同一进程的最高权限句柄时就失败了。而后又对线程如法炮制,
依然失败。最后用无句柄杀线程的绝招,连KiInsertQueueApc钩子都抵挡不住的 10 万次
PostThreadMessage,仍是失败。初步测试,发现来者不善,决定先用IDA Pro 5.5分析一
下 360的驱动,再想办法。
首先用 Win64AST(Win64下的系统工具,有查看内核模块,管理进程等功能, 网络
查看 360加载的驱动: 函数
能够发现,360 在Win64 系统上只加载了两个驱动:360FsFlt.sys和一个网络相关的驱
动。其中,360FsFlt.sys从名字上来看是文件系统过滤驱动。经分析,在它的里面有进程
自我保护相关的内容。
在作理智的分析以前,咱们能够先进行猜想,猜想一下360会用什么手段来实现进程自
我保护。第一种方法是Ring 3 的 Inline Hook,虽然安全稳定,可是容易绕过。上次我虽
然有篇文章讲解如何反绕过Ring 3 Inline Hook,可是毕竟判断方法还有必定的瑕疵。所
以我判定,360不会这么作。第二种方法就是废掉Win64的PatchGuard机制,对内核函数
进行 Inline Hook,虽然这种方法最好,可是我确定360也不会这么作。由于360 是一个商
业软件,这种方法稳定性差不说,并且还会给竞争对手以“破坏系统安全机制”的口实。所
以惟一的多是第三种方法,既微软官方推荐的方法:用ObRegisterCallbacks注册一个回
调,监控系统中全部的进线程句柄的动态,一旦发现对本身有害的句柄,立刻就把句柄关闭
并返回一个错误值。在用IDA 的分析中,果真证明了个人猜想。
首先把360FsFlt.sys拖入 IDA进行反汇编,而后把点击“Imports”,找到
ObRegisterCallbacks,而后双击ObRegisterCallbacks,进入和IDA VIEW-A界面,而后双
击 SUB_1D938,就进入和反汇编代码的界面。什么?您想按F5查看 C代码?呵呵。真的不
好意思,64位的 IDA 不带把汇编代码变成C代码的插件,只能委屈各位看观看晦涩的64位汇编 工具
代码了。顺便说一句,我以为IDA对 64位 BIN文件作的反汇编不怎么正确,可是没什
么确实的证据,因此仍是不要乱说为好。
你们能够看到,在调用ObRegisterCallbacks以前,还往 rax 寄存器里放了两个你们十
分熟悉的对象类型:PsProcessType和 PsThreadType,所以能够很确定地说,360 就是用
ObRegisterCallbacks注册了一个回调,用来监视进程类型句柄和线程类型句柄的动态!截
图以下: 测试
完整的反汇编以下:
;int __fastcall sub_1D938(PDRIVER_OBJECT DriverObject, __int64)
sub_1D938 proc near
arg_0= qword ptr 8
mov [rsp+arg_0], rbx
push rdi
sub rsp, 20h
mov rax, cs:PsProcessType
mov rbx, rcx
lea rdx, qword_ABA20
mov cs:qword_34300, rax
mov rax, cs:PsThreadType
lea rcx, unk_342D8
mov cs:qword_34320, rax
lea rax, qword_34300
mov cs:qword_342F8, rax
call cs:ObRegisterCallbacks
mov rdx, cs:qword_ABA20
xor edi, edi
cmp eax, edi
movzx eax, cs:byte_59E12
cmovl rdx, rdi
test byte ptr cs:dword_59ED8, 4
lea ecx, [rdi+1]
cmovnz eax, ecx
mov cs:qword_ABA20, rdx
mov cs:byte_59E12, al
mov eax, cs:dword_59ED8 ui
test al, 8 jz short loc_1D9D6 xor edx, edx ; __int64 mov rcx, rbx ; DriverObject call sub_1E710 cmp eax, edi mov eax, cs:dword_59ED8 setnl cs:byte_59E13 loc_1D9D6: test al, 10h jz short loc_1D9EF mov rcx, rbx ; DriverObject call sub_2350C cmp eax, edi
setnl al 我还找了找360实现进线程自保护的过程,可是能力有限,只找到一部分实现[进程自 我以为此函数的逻辑是这样:传入进程对象指针PEPROCESS (注意:我强烈以为不是IDA |