Hi,大家好,欢迎大家观看由IT猫之家打造的【网络爬虫教学】虫师终极武器之Chromium定制开发系列教学文章的第四篇,如果您是第一次观看本系列教程,请先移步到这里看完前两篇后再回来哦!大家在学习的过程中,有任何疑问可以留言或加入我们的QQ技术交流群进行探讨: 544185435
概述
近期由于要逆向某JS的关系,导致多天未能抽出时间来更新这一系列文章,在这里我先跟大家道个歉,那么接下来呢,我们将一起来分析 third_party/blink 下的文件以及正式开启我们的DIY浏览器之旅!
third_party\blink 目录结构
在前面的文章中,我们有粗略的讲过Blink,它是基于Webkit进阶开发出来的一套浏览器渲染内核,目前由谷歌团队在维护着,由于我们的目的仅仅是为了实现随机化接口,所以在本文中我们仅对 third_party/blink/renderer目录进行讲解,其他的大家可以自行参考网上的方案。
blink/renderer 目录下包含了大多数web平台的实现,并且它们只运行于renderer进程之中,意味着它只有在浏览器渲染时才会有效。而该目录下的所有代码都是实现blink的细节,不应在blink之外的地方使用,如非要使用,可以通过调用blink的外部接口,详情可参考 Blink外部API。
core/ :该目录实现了specs和IDL接口定义的web平台核心功能,它包含:dom、events的实现,我们大部分随机的接口都将在该目录下完成。
modules/ :该目录为web平台实现自包含、定义明确的功能集合,这些功能由core/ 构成的,它涵盖了诸如:canvas、webgl、webaudio、webrtc等相关功能的实现。
综上所述,我们所有的随机化功能都是基于renderer运行时实现的,意味着我们开发出来的浏览器与正常的不太一样,每次刷新页面时都会自动更新固有信息,比如我们实现了webgl接口随机化之后,每次页面调用getParameter获取显卡型号时都会发生改变,而由于这些都是基于blink底层实现的,没有经过JS任何的篡改,所以在安全角度上来看,它是安全的。
GPU随机化的实现
随着H5的普及,使得浏览器支持通过JS来检测设备的部分信息,而显卡作为设备固有的部分,自然也就成为了FP脚本以及各大网站的重点检测对象之一,在chrome下执行以下这段代码我们可以轻松看到我们当前设备的显卡型号:
(function () {
var canvas = document.createElement('canvas'),
gl = canvas.getContext('experimental-webgl'),
debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
console.log(gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL));
})();
上图,我们清晰可见,控制台返回了我的设备的型号,而对于FP而言,它将会通过一系列运算,将其加密成一串md5然后提交到服务器,而因为该接口是只读的,所以理论上每次从客户端中收集的数据都会是一样的,无论你使用哪款浏览器,那么我们如何实现接口随机呢?
其实要实现随机化非常的简单,你只要会使用函数就可以了,当然,我们还需事先准备一批“显卡型号”以便于后期作随机化,显卡型号大全可以自行到网上寻找,找完型号后,我们在 third_party/blink/renderer/modules/webgl 目录下创建一个名为:webgl_rendering_context_base_infoRandom.h 的头文件,然后实现最基本的随机化功能,这里我定义了一个GetGPUList的方法,然后设置一个随机数种子,让其随机返回列表中的某个元素。
#include
#include
#include
#include
#include
#include
#include
#include
int randomW(int x) {
return rand() % x;
}
String GetGPUList(){
srand((int)time(0));
String GPUList[] = {
"ANGLE ( NVIDIA GTX Titan Z Direct3D9Ex vs_3_0 ps_3_0)","ANGLE ( NVIDIA GTX Titan Black Direct3D9Ex vs_3_0 ps_3_0)"
};
return GPUList[randomW(12)];
}
然后我们使用IDE或记事本打卡webgl_rendering_context_base.cc这个文件。
然后我们引用刚刚创建好的随机化头文件。
然后我们定位到该文件的3362行,并注释掉原本的返回语句,修改成:
return WebGLAny(script_state,GetGPUList());
其他的不需要修改,然后我们按保存,接着打开命令行,进入到工作目录中,然后执行:autoninja -C out\Release mini_installer 命令,请注意,Release为您上次编译的目录,请自行替换,且该命令是打包mini安装包的,如果上次不是编译安装包的,请自行更换,执行该命令后将会增量更新。
由于我们之前已经编译过了,所以这次增量更新不需要耗时太久,理论上只要不修改内核相关配置都不会导致重新编译,待我们编译完毕后,打开新编译的浏览器再执行上述的JS代码,我们会发现,它的型号的确发生了变化。
为了更直观的验证是否成功改变指纹,我们可以直接到:webgl指纹检测 检测我们的GPU指纹是否已经生效,可以多刷新几次,我们会发现每次的指纹哈希都不一样了。
总结
由于时间关系,本篇将暂告一段落,我们今天主要介绍了基于renderer时的两大依赖以及粗略的实现了webgl随机化的制作流程,值得一说的是,我们这一系列文章主要围绕着随机化而写,意味着页面每次刷新都会变动,这对于部分网站可能会出现不兼容的情况,所以请三思,还有,大家不要再问我如何找到目标文件的,这种问题自己去解决,有这种啥不用付出还能白嫖的好事请告诉我,我也想白嫖,不过大家可以到这里寻找相关的文件:Chromium代码搜索 最后提前祝大家新春快乐,咱们下篇文章再见!