自从改行玩硬件后,就很少关注病毒和反病毒之间的斗争了。某天在中关村论坛听到一 名网友说 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 |