
Hi,大家好,歡迎大家觀看由IT貓之家打造的【網(wǎng)絡(luò)爬蟲(chóng)教學(xué)】蟲(chóng)師終極武器之Chromium定制開(kāi)發(fā)系列教學(xué)文章的第四篇,如果您是第一次觀看本系列教程,請(qǐng)先移步到這里看完前兩篇后再回來(lái)哦!大家在學(xué)習(xí)的過(guò)程中,有任何疑問(wèn)可以留言或加入我們的QQ技術(shù)交流群進(jìn)行探討: 544185435
概述
近期由于要逆向某JS的關(guān)系,導(dǎo)致多天未能抽出時(shí)間來(lái)更新這一系列文章,在這里我先跟大家道個(gè)歉,那么接下來(lái)呢,我們將一起來(lái)分析 third_party/blink 下的文件以及正式開(kāi)啟我們的DIY瀏覽器之旅!
third_party\blink 目錄結(jié)構(gòu)

在前面的文章中,我們有粗略的講過(guò)Blink,它是基于Webkit進(jìn)階開(kāi)發(fā)出來(lái)的一套瀏覽器渲染內(nèi)核,目前由谷歌團(tuán)隊(duì)在維護(hù)著,由于我們的目的僅僅是為了實(shí)現(xiàn)隨機(jī)化接口,所以在本文中我們僅對(duì)?third_party/blink/renderer目錄進(jìn)行講解,其他的大家可以自行參考網(wǎng)上的方案。

blink/renderer 目錄下包含了大多數(shù)web平臺(tái)的實(shí)現(xiàn),并且它們只運(yùn)行于renderer進(jìn)程之中,意味著它只有在瀏覽器渲染時(shí)才會(huì)有效。而該目錄下的所有代碼都是實(shí)現(xiàn)blink的細(xì)節(jié),不應(yīng)在blink之外的地方使用,如非要使用,可以通過(guò)調(diào)用blink的外部接口,詳情可參考?Blink外部API。
core/ :該目錄實(shí)現(xiàn)了specs和IDL接口定義的web平臺(tái)核心功能,它包含:dom、events的實(shí)現(xiàn),我們大部分隨機(jī)的接口都將在該目錄下完成。
modules/ :該目錄為web平臺(tái)實(shí)現(xiàn)自包含、定義明確的功能集合,這些功能由core/ 構(gòu)成的,它涵蓋了諸如:canvas、webgl、webaudio、webrtc等相關(guān)功能的實(shí)現(xiàn)。
綜上所述,我們所有的隨機(jī)化功能都是基于renderer運(yùn)行時(shí)實(shí)現(xiàn)的,意味著我們開(kāi)發(fā)出來(lái)的瀏覽器與正常的不太一樣,每次刷新頁(yè)面時(shí)都會(huì)自動(dòng)更新固有信息,比如我們實(shí)現(xiàn)了webgl接口隨機(jī)化之后,每次頁(yè)面調(diào)用getParameter獲取顯卡型號(hào)時(shí)都會(huì)發(fā)生改變,而由于這些都是基于blink底層實(shí)現(xiàn)的,沒(méi)有經(jīng)過(guò)JS任何的篡改,所以在安全角度上來(lái)看,它是安全的。
GPU隨機(jī)化的實(shí)現(xiàn)
隨著H5的普及,使得瀏覽器支持通過(guò)JS來(lái)檢測(cè)設(shè)備的部分信息,而顯卡作為設(shè)備固有的部分,自然也就成為了FP腳本以及各大網(wǎng)站的重點(diǎn)檢測(cè)對(duì)象之一,在chrome下執(zhí)行以下這段代碼我們可以輕松看到我們當(dāng)前設(shè)備的顯卡型號(hào):
(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));
})();

上圖,我們清晰可見(jiàn),控制臺(tái)返回了我的設(shè)備的型號(hào),而對(duì)于FP而言,它將會(huì)通過(guò)一系列運(yùn)算,將其加密成一串md5然后提交到服務(wù)器,而因?yàn)樵摻涌谑侵蛔x的,所以理論上每次從客戶端中收集的數(shù)據(jù)都會(huì)是一樣的,無(wú)論你使用哪款瀏覽器,那么我們?nèi)绾螌?shí)現(xiàn)接口隨機(jī)呢?

其實(shí)要實(shí)現(xiàn)隨機(jī)化非常的簡(jiǎn)單,你只要會(huì)使用函數(shù)就可以了,當(dāng)然,我們還需事先準(zhǔn)備一批“顯卡型號(hào)”以便于后期作隨機(jī)化,顯卡型號(hào)大全可以自行到網(wǎng)上尋找,找完型號(hào)后,我們?cè)?third_party/blink/renderer/modules/webgl 目錄下創(chuàng)建一個(gè)名為:webgl_rendering_context_base_infoRandom.h 的頭文件,然后實(shí)現(xiàn)最基本的隨機(jī)化功能,這里我定義了一個(gè)GetGPUList的方法,然后設(shè)置一個(gè)隨機(jī)數(shù)種子,讓其隨機(jī)返回列表中的某個(gè)元素。
#include <iostream>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
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這個(gè)文件。

然后我們引用剛剛創(chuàng)建好的隨機(jī)化頭文件。

然后我們定位到該文件的3362行,并注釋掉原本的返回語(yǔ)句,修改成:
return WebGLAny(script_state,GetGPUList());
其他的不需要修改,然后我們按保存,接著打開(kāi)命令行,進(jìn)入到工作目錄中,然后執(zhí)行:autoninja -C out\Release mini_installer 命令,請(qǐng)注意,Release為您上次編譯的目錄,請(qǐng)自行替換,且該命令是打包mini安裝包的,如果上次不是編譯安裝包的,請(qǐng)自行更換,執(zhí)行該命令后將會(huì)增量更新。

由于我們之前已經(jīng)編譯過(guò)了,所以這次增量更新不需要耗時(shí)太久,理論上只要不修改內(nèi)核相關(guān)配置都不會(huì)導(dǎo)致重新編譯,待我們編譯完畢后,打開(kāi)新編譯的瀏覽器再執(zhí)行上述的JS代碼,我們會(huì)發(fā)現(xiàn),它的型號(hào)的確發(fā)生了變化。


為了更直觀的驗(yàn)證是否成功改變指紋,我們可以直接到:webgl指紋檢測(cè)?檢測(cè)我們的GPU指紋是否已經(jīng)生效,可以多刷新幾次,我們會(huì)發(fā)現(xiàn)每次的指紋哈希都不一樣了。
總結(jié)
由于時(shí)間關(guān)系,本篇將暫告一段落,我們今天主要介紹了基于renderer時(shí)的兩大依賴以及粗略的實(shí)現(xiàn)了webgl隨機(jī)化的制作流程,值得一說(shuō)的是,我們這一系列文章主要圍繞著隨機(jī)化而寫,意味著頁(yè)面每次刷新都會(huì)變動(dòng),這對(duì)于部分網(wǎng)站可能會(huì)出現(xiàn)不兼容的情況,所以請(qǐng)三思,還有,大家不要再問(wèn)我如何找到目標(biāo)文件的,這種問(wèn)題自己去解決,有這種啥不用付出還能白嫖的好事請(qǐng)告訴我,我也想白嫖,不過(guò)大家可以到這里尋找相關(guān)的文件:Chromium代碼搜索?最后提前祝大家新春快樂(lè),咱們下篇文章再見(jiàn)!