003.修改chromium源码随机webGL指纹

修改chromium源码随机webGL指纹

一、WebGL指纹是什么

  • WebGL:全称为Web Graphics Library,是一个JavaScript API,无需使用任何额外插件,就可以在网页浏览器中渲染高性能的2D和3D图像。
  • WebGL指纹:WebGL指纹是基于网页浏览器中的WebGL API生成的唯一标识符。它利用了图形处理单元(GPU)不同程度的差异来创建一个可以用来跟踪用户的设备指纹。由于不同设备的GPU有细微的差异,例如渲染能力、性能等,WebGL指纹可以作为区分用户设备的一种手段。

二、获取浏览器的WebGL指纹

  • 有攻才有防,先看看网站是如何通过js获取你的WebGL指纹的。
  • 将下面的代码复制到F12控制台,就可以获取显示你的WebGL指纹了
async function sha256(message) {
    // 把字符串转换为Uint8Array
    const msgBuffer = new TextEncoder().encode(message);
    // 计算散列值
    const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
    // 转换为数组
    const hashArray = Array.from(new Uint8Array(hashBuffer));
    // 转换为16进制字符串
    const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
    return hashHex;
}

function getWebGLFingerprint() {
    // 尝试创建一个canvas元素并获取WebGL渲染上下文
    const canvas = document.createElement('canvas');
    const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');

    if (!gl) { // 如果无法获取到WebGL上下文,则无法生成指纹
        return null;
    }

    // 创建一个可以用来生成指纹的函数
    const getGlParam = function(parameter) {
        // WebGL参数值可以通过调用gl.getParameter()获取
        const value = gl.getParameter(parameter);
        return value ? value.toString() : 'null';
    };

    // 收集一系列WebGL参数的值
    const webglParams = [
        // 表示GPU驱动和硬件的字符串
        gl.VENDOR,
        gl.RENDERER,
        // WebGL版本字符串
        gl.VERSION,
        // 支持的WebGL扩展列表
        gl.getSupportedExtensions(),
        // 其他一些可能影响指纹的特性
        gl.MAX_TEXTURE_SIZE,
        gl.MAX_RENDERBUFFER_SIZE,
        // ...可以根据需要获取更多的参数
    ];

    // 遍历并收集参数值
    const glValues = webglParams.map(param => {
        if (Array.isArray(param)) {
            return param.join('-');
        }
        return getGlParam(param);
    });

    // 拼接得到的参数值作为一个长字符串,这就是我们的WebGL指纹
    const webglFingerprint = glValues.join('_');

    return webglFingerprint;
}

sha256(getWebGLFingerprint()).then(hash => console.log(hash));

  • 输出:
dfe89f41416faecf0ab4be2ddeccdc79999aafd3577a0e14e9b3e5265e72d6e7

三、编译随机webGL指纹

注意:这里是全网独一份。

  • 第一篇文章写了如何编译chromium,假设你已经编译成功了。
  • 找到源码 third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
1.头部加上(随便加在一个#include后面)
#include <algorithm> // std::shuffle
#include <random>    // std::default_random_engine
#include <chrono>    // std::chrono::system_clock
2.替换掉原有代码
std::optional<Vector<String>>
WebGLRenderingContextBase::getSupportedExtensions() {
  if (isContextLost())
    return std::nullopt;

  Vector<String> result;

  for (ExtensionTracker* tracker : extensions_) {
    if (ExtensionSupportedAndAllowed(tracker)) {
      result.push_back(tracker->ExtensionName());
    }
  }

  return result;
}
替换为
std::optional<Vector<String>>
WebGLRenderingContextBase::getSupportedExtensions() {
  if (isContextLost())
    return std::nullopt;

  Vector<String> result;

  for (ExtensionTracker* tracker : extensions_) {
    if (ExtensionSupportedAndAllowed(tracker)) {
      result.push_back(tracker->ExtensionName());
    }
  }

  // 使用当前时间作为随机数生成的种子
  unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
  std::default_random_engine engine(seed);

  // 打乱result中的元素顺序
  std::shuffle(result.begin(), result.end(), engine);
  
  return result;
}

可以看到,获取webGL指纹的关键函数就是getSupportedExtensions,返回当前WebGL上下文对象支持的所有扩展名称的列表。
我们将返回列表打乱随机,js收集的指纹信息hash自然每次都不一样啦。

五、在线指纹验证网站:

  • https://browserleaks.com/webgl
  • https://abrahamjuliot.github.io/creepjs/

不知道后续还有没有人关注

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要下载Chromium源码,你可以按照以下步骤进行操作: 1. 首先,你需要下载depot_tools,这是一个用于管理Chromium源码的工具集。你可以在官方网址http://www.chromium.org/developers/how-tos/build-instructions-windows 下载depot_tools。 2. 下载完成后,将depot_tools添加到系统的环境变量中,以便在任何位置都可以使用它。 3. 接下来,你需要创建一个自定义的源码目录,并使用命令行工具进入该目录。 4. 在源码目录中,执行命令"gclient config http://src.chromium.org/svn/releases/31.0.1620.2"来配置Chromium的版本。你可以根据需要下载不同的版本,可以在http://src.chromium.org/viewvc/chrome/releases/ 查看可用的版本。 5. 如果你不需要下载LayoutTest测试文件,可以打开以版本名称命名的目录下的DEPS文件,并将"src/third_party/WebKit/LayoutTests"修改为None。 6. 第一次执行"gclient sync"命令时,会自动安装git、python等必要的工具。请耐心等待安装完成。 7. 在安装过程中,可能会出现连接错误。如果出现连接错误,你可以尝试将以下内容复制到C:\Windows\System32\drivers\etc\hosts文件中,以解决连接问题。 8. 安装完成后,你可以执行"gclient sync"命令来获取Chromium源码。如果下载过程中出现问题,可以重复执行"gclient sync"命令。 9. 下载完成后,进入源码目录,并执行"gn gen out/Default"命令来生成编译规则到out/Default目录中。 这样,你就成功下载了Chromium源码。希望对你有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [下载Chromium源码方法及问题记录](https://blog.csdn.net/hezhipin610039/article/details/31372619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Chrome源码chromium下载编译详细步骤](https://blog.csdn.net/langeldep/article/details/120032077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王辉辉的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值