


























魔改chromium源码——canvas指纹修改 第一节在进行以下操作之前,请确保已完成之前文章中提到的 源码拉取及编译 - 掘金
在src\third_party\blink\renderer\modules\canvas\canvas2d\canvas_2d_recorder_context.cc目录中,找到底下这段函数的源码。
我们以修改 canvas 的 fillStyle 值为例进行说明。对于其他属性的随机化处理,可以参考同样的思路:找到对应的代码位置,并按照类似的方式调整逻辑。这里不再逐一演示,但方法思路是通用的。
#ifndef RANDOM_COLOR_H
#define RANDOM_COLOR_H
#include <array>
#include <random>
#include <string>
#include "base/time/time.h" // 用于动态种子
namespace content {
// 声明并定义 getRandomColorCode 函数
inline std::string getRandomColorCode() {
// 十六进制字符集合
const std::array<char, 17> hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', '\0'};
// 静态字符数组,用于存储颜色代码('#' + 6个字符 + '\0')
static thread_local std::array<char, 8> colorCode;
// 初始化伪随机数生成器
static thread_local std::mt19937 gen(static_cast<unsigned>(base::Time::Now().ToTimeT()));
static std::uniform_int_distribution<> dis(0, 15); // 生成 [0, 15] 范围内的随机数
// 构造颜色代码字符串
colorCode[0] = '#'; // 设置第c一个字符为 '#'
for (int i = 1; i < 7; ++i) {
colorCode[i] = hexChars[dis(gen)]; // 随机选择一个十六进制字符
}
colorCode[7] = '\0'; // 添加字符串终止符
return colorCode.data(); // 返回指向静态数组的指针
}
}
#endif // RANDOM_COLOR_H
先将v8::Localv8::String v8_string = value.Asv8::String();这行注释掉,然后新增底下两行代码。

修改完了之后保存,然后执行以下命令编译
autoninja -C out/Default chrome
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0">
<title>canvas</title>
</head>
<body>
<canvas class="" id="myCanvas1" width="100" height="100"></canvas>
<canvas class="" id="myCanvas2" width="100" height="100"></canvas>
<script>
function canvasFingerprint (urlStr) {
var e = 3735928559
// 基于数据 URL 计算哈希值
for (var i = 0; i < 32; i++) {
e = (65599 * e + urlStr.charCodeAt(e % urlStr.length)) >>> 0;
}
return e; // 返回最终的指纹值
}
const canvas = document.getElementById('myCanvas1');
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'blue';
ctx.fillRect(0, 0, 100, 100);
const canvas2 = document.getElementById('myCanvas2');
const ctx2 = canvas2.getContext('2d');
ctx2.fillStyle = 'blue';
ctx2.fillRect(0, 0, 100, 100);
const urlStr1 = canvas.toDataURL();
const urlStr2 = canvas2.toDataURL();
// 调用函数生成指纹
console.log(canvasFingerprint(urlStr1));
console.log(canvasFingerprint(urlStr2));
</script>
</body>
</html>
在编译好的chromium中打开,就可以看到,每次刷新,他的颜色都不一样,已经被我们修改的源码给hook掉了。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。