美杜莎是百度对其"偷拍插件"自己定义的名称。它的原理是,百度插件上传用户屏幕截图等信息,由服务端判断用户正在使用哪款浏览器,从而挟持百度凤巢客户资源针对360浏览器进行不兼容提示。
百度"偷拍插件"系统结构和实现
"美杜莎"分为网页脚本、客户端和服务端三个部分,三者交互完成密码加密和浏览器检测"二选一"目的。
当用户访问开启了"美杜莎"计划的百度凤巢(北京测试时需要外地代理),网站会先通过加载指定的JS脚本,弹出对话框要求用户安装插件。在用户安装完成后,用户登录界面上密码框会变为输入控件的输入框,如图:
该插件会通过特殊方式获得用户输入的密码,加密后计算一个加密的密码,在用户选择登录时:
首先会发送一个握手请求给服务端,包括插件的版本号等,请求获取一个SID(Token),服务端若判断插件有更新,则会返回需要更新,由网页脚本弹出对话框提示:"控件已经更新,请重新下载安装!"
接着网页JS脚本会调用控件的接口: sendEnvironmentInfo,收集当前用户的环境信息并发送给服务端,这是独立于当前网站的一个收集和判定系统,由百度客户端插件收集以下信息:
用户的CPU信息
用户的磁盘序列号
用户的网络IP地址、MAC地址和网关信息
用户网络DNS信息
用户的当前浏览器进程名称信息
用户当前启动的所有程序的进程名称信息
用户当前电脑屏幕的图像截图
除了屏幕截图外,其它信息都使用AES加密算法进行了加密。百度将全部这些信息打包编码到数据包后,会通过加密的HTTP传输协议上传到百度的服务器:https://isafe.baidu.com/cinfo,百度服务端解密后看到的数据如下:
偷拍插件采集数据上传后,百度服务端程序会对上传的数据做判定,然后给控件返回一个状态码,网页脚本通过控件的getLastErrorCode接口获取到这个状态码。当服务端程序通过进程信息或截图判定用户正在使用360浏览器,则返回-3这个状态码。
网页脚本判断如果返回的状态码是-3,那么就调用控件的getSendbackMessage接口,目的是获得百度服务端返回的一段文字,并弹出对话框提示用户更换其他浏览器。
在这个过程中,上传信息判定是由百度云端决定的,弹框的文字也是由云端发送的,关键逻辑都由云控。
由于上传信息非常丰富,因此百度云端判断相当灵活,不仅可以针对360浏览器不兼容,还可以针对系统中其他任何软件做不兼容提示,提示文字也是完全云控、可随时变化的,同时还可以随时在服务端配置升级,要求用户更新插件,以便应用新的信息采集和对抗策略。
百度"偷拍插件"技术原理
npBaiduSafeInput.dll控件的关键在于sendEnvironmentInfo这个函数,它首先收集信息,收集的信息包括cinfo\bmp两个字段。
cinfo字段包括了除了截屏之外的其它系统信息,是一个简单的key-value结构数据,使用AES加密算法进行了加密,然后编码为ASCII-HEX后,保存在数据包的cinfo字段中。
获取cinfo.processlist字段系统进程列表信息使用的API是ToolHelp32 系列API,通过对比当前进程Pid,在进程列表中筛选出当前浏览器进程名并保存为cinfo.currentprocess字段。
截屏数据则通过GetDIBits截取屏幕指定区域的图像并保存为BMP数据,编码为ASCII-HEX后,保存在bmp字段。
这些数据再加上之前获取的sid数据,和计算整个数据包的md5数据,拼接成具有4个字段的数据包,通过WinHttp接口发送加密的HTTPS数据到http://isafe.baidu.com/cinfo这个百度服务器地址上。
综上,百度用于判定用户软件使用情况的数据有:当前进程、进程列表和屏幕截图。以下为几处代码分析:
1、百度"偷拍插件"通过GetDIBits对用户电脑屏幕截图:
2、把截取的BMP数据编码后发送到百度服务器:
3、抓取用户的Cpu、磁盘序列号、ip地址、mac信息、网关信息、DNS信息和所有进程列表上传:
4、网页脚本根据百度服务端返回的状态码弹出相应提示,怎样提示完全由服务端控制: