Zennoposter 进阶教程

【ZP指纹】ZP模拟Canvas 研究

ZP的Canvas真的是难用,一百次有90次模拟失败。

于是我找GPT用JS写了一个随机生成Canvas。模拟效果很不错,但是也有一个问题就是Uniqueness 100% (The signature is unique to our database)。

虽然可以模拟,但是还是有很多问题存在。下面是JS代码:

(function() {
const originalToDataURL = HTMLCanvasElement.prototype.toDataURL;
const originalGetImageData = CanvasRenderingContext2D.prototype.getImageData;

HTMLCanvasElement.prototype.toDataURL = function() {
const context = this.getContext(‘2d’);
if (context) {
const width = this.width;
const height = this.height;
// 混淆 Canvas 内容
for (let i = 0; i < 10; i++) {
context.fillStyle = ‘rgba(‘ + Math.floor(Math.random() * 256) + ‘,’ +
Math.floor(Math.random() * 256) + ‘,’ +
Math.floor(Math.random() * 256) + ‘,’ +
Math.random().toFixed(2) + ‘)’;
context.fillRect(Math.random() * width, Math.random() * height, Math.random() * width / 2, Math.random() * height / 2);
}
}
return originalToDataURL.apply(this, arguments);
};

CanvasRenderingContext2D.prototype.getImageData = function(x, y, width, height) {
const imageData = originalGetImageData.apply(this, arguments);

// 干扰 imageData 数据
for (let i = 0; i < imageData.data.length; i += 4) {
imageData.data[i] = imageData.data[i] ^ (Math.random() * 255); // Red channel
imageData.data[i + 1] = imageData.data[i + 1] ^ (Math.random() * 255); // Green channel
imageData.data[i + 2] = imageData.data[i + 2] ^ (Math.random() * 255); // Blue channel
}

return imageData;
};
})();

具体使用见图:

设置里每次和一次都差不多。一次的意思就是载入框架之前模拟一次,再次打开别的网页没不会模拟了。每次的意思就是只要打开新的页面就会模拟一次canvas。这样的话导致一个问题,如果你访问的是一个网站,那么第一次或者第一页打开的网页的canvas跟后面打开的网页的canvas可能不一样(准确的说是肯定不一样)

ZP的指纹研究还有很多路要走。如果有大佬一起研究的话请联系我。

发表回复