美文网首页Chromium开发IT猫之家
【网络爬虫教学】虫师终极武器之Chromium定制开发系列(四)

【网络爬虫教学】虫师终极武器之Chromium定制开发系列(四)

作者: IT猫之家 | 来源:发表于2020-01-14 15:51 被阅读0次

    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 <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这个文件。

    然后我们引用刚刚创建好的随机化头文件。

    然后我们定位到该文件的3362行,并注释掉原本的返回语句,修改成:

    return WebGLAny(script_state,GetGPUList());

    其他的不需要修改,然后我们按保存,接着打开命令行,进入到工作目录中,然后执行:autoninja -C out\Release mini_installer 命令,请注意,Release为您上次编译的目录,请自行替换,且该命令是打包mini安装包的,如果上次不是编译安装包的,请自行更换,执行该命令后将会增量更新。

    由于我们之前已经编译过了,所以这次增量更新不需要耗时太久,理论上只要不修改内核相关配置都不会导致重新编译,待我们编译完毕后,打开新编译的浏览器再执行上述的JS代码,我们会发现,它的型号的确发生了变化。

    为了更直观的验证是否成功改变指纹,我们可以直接到:webgl指纹检测 检测我们的GPU指纹是否已经生效,可以多刷新几次,我们会发现每次的指纹哈希都不一样了。

    总结

    由于时间关系,本篇将暂告一段落,我们今天主要介绍了基于renderer时的两大依赖以及粗略的实现了webgl随机化的制作流程,值得一说的是,我们这一系列文章主要围绕着随机化而写,意味着页面每次刷新都会变动,这对于部分网站可能会出现不兼容的情况,所以请三思,还有,大家不要再问我如何找到目标文件的,这种问题自己去解决,有这种啥不用付出还能白嫖的好事请告诉我,我也想白嫖,不过大家可以到这里寻找相关的文件:Chromium代码搜索 最后提前祝大家新春快乐,咱们下篇文章再见!

    原文转至IT猫之家,转载请注明出处!

    相关文章

      网友评论

        本文标题:【网络爬虫教学】虫师终极武器之Chromium定制开发系列(四)

        本文链接:https://www.haomeiwen.com/subject/raraactx.html