012.指纹浏览器编译-修改canvas指纹(高级)

指纹浏览器编译-修改canvas指纹(高级)

一、canvas指纹是什么

  • 之前介绍过canvas指纹和常见网站绕过canvas指纹,插眼: https://blog.csdn.net/w1101662433/article/details/137959179

二、为啥有更高级的canvas指纹

  • 众所周知,creepjs和browserscan这2个网站对指纹的检测比较严格,随机修改了指纹后,很容易无法通过网站的反指纹修改检测,被识别到指纹被篡改。
  • 上一期的canvas指纹修改没有通过browserscan的canvas指纹检测,我们继续针对性加强。

三、修改源码

  • 打开源码文件 \third_party\blink\renderer\modules\canvas\canvas2d\base_rendering_context_2d.cc
1.头部加上(随便加在一个#include后面)
#include <string>
#include <iostream>
#include <cstdlib>
#include <ctime>
2.找到下面的代码
void BaseRenderingContext2D::setFillStyle(v8::Isolate* isolate,v8::Local<v8::Value> value,ExceptionState& exception_state) {V8CanvasStyle v8_style;if (!ExtractV8CanvasStyle(isolate, value, v8_style, exception_state))return;ValidateStateStack();UpdateIdentifiabilityStudyBeforeSettingStrokeOrFill(v8_style,CanvasOps::kSetFillStyle);CanvasRenderingContext2DState& state = GetState();switch (v8_style.type) {case V8CanvasStyleType::kCSSColorValue:state.SetFillColor(v8_style.css_color_value);break;case V8CanvasStyleType::kGradient:state.SetFillGradient(v8_style.gradient);break;case V8CanvasStyleType::kPattern:if (!origin_tainted_by_content_ && !v8_style.pattern->OriginClean())SetOriginTaintedByContent();state.SetFillPattern(v8_style.pattern);break;case V8CanvasStyleType::kString: {if (v8_style.string == state.UnparsedFillColor()) {return;}Color parsed_color = Color::kTransparent;if (!ExtractColorFromV8ValueAndUpdateCache(v8_style, parsed_color)) {return;}if (state.FillStyle().IsEquivalentColor(parsed_color)) {state.SetUnparsedFillColor(v8_style.string);return;}state.SetFillColor(parsed_color);break;}}state.SetUnparsedFillColor(v8_style.string);state.ClearResolvedFilter();
}

注意:最新代码可能和当前代码有略微差异,但基本逻辑是一样。通过改变canvas颜色来改变指纹。

3.替换为
void BaseRenderingContext2D::setFillStyle(v8::Isolate* isolate,v8::Local<v8::Value> value,ExceptionState& exception_state) {V8CanvasStyle v8_style;if (!ExtractV8CanvasStyle(isolate, value, v8_style, exception_state))return;ValidateStateStack();UpdateIdentifiabilityStudyBeforeSettingStrokeOrFill(v8_style,CanvasOps::kSetFillStyle);CanvasRenderingContext2DState& state = GetState();// 这里追加2行,这里可以过creepjssrand((int)time(NULL));state.SetStrokeColor(Color::FromRGBALegacy(rand() % 5, rand() % 6,rand() % 7, rand() % 255));switch (v8_style.type) {case V8CanvasStyleType::kCSSColorValue:state.SetFillColor(v8_style.css_color_value);break;case V8CanvasStyleType::kGradient:state.SetFillGradient(v8_style.gradient);break;case V8CanvasStyleType::kPattern:if (!origin_tainted_by_content_ && !v8_style.pattern->OriginClean())SetOriginTaintedByContent();state.SetFillPattern(v8_style.pattern);break;case V8CanvasStyleType::kString: {if (v8_style.string == state.UnparsedFillColor()) {return;}Color parsed_color = Color::kTransparent;if (!ExtractColorFromV8ValueAndUpdateCache(v8_style, parsed_color)) {return;}if (state.FillStyle().IsEquivalentColor(parsed_color)) {state.SetUnparsedFillColor(v8_style.string);return;}//这里追加1行,这里用来过browserscanparsed_color = Color::FromRGBALegacy(parsed_color.Param1() + rand() % 5, parsed_color.Param1()+ rand() % 6, parsed_color.Param2() + rand() % 7, parsed_color.Alpha()*255);state.SetFillColor(parsed_color);break;}}state.SetUnparsedFillColor(v8_style.string);state.ClearResolvedFilter();
}

注意:由于browserscan会同一时间点生成2次canvas指纹,进行对比,纯随机的话会无法绕过反修改指纹检测。
所以这里巧妙的运用了rand(),同一时间点生成的随机数是相同的,完美绕过。

4.编译
ninja  -C  out/Default chrome

三、绕过creepjs的反修改指纹检测

  • 编译后发现,creepjs检测到了我们修过指纹
    在这里插入图片描述

为了绕过他的检测,继续修改源码:

1.找到
ImageData* BaseRenderingContext2D::getImageDataInternal(int sx,int sy,int sw,int sh,ImageDataSettings* image_data_settings,ExceptionState& exception_state) {
2.改成:
ImageData* BaseRenderingContext2D::getImageDataInternal(int sx,int sy,int sw,int sh,ImageDataSettings* image_data_settings,ExceptionState& exception_state) {// 这里追加一行if (sh==1){return nullptr;}

注意:就是追加了一行代码,让sh==1时,canvas的getImageDate会返回null,完美绕过creepjs的检测。

3.再编译
ninja  -C  out/Default chrome

四、在线指纹验证网站:

  • https://abrahamjuliot.github.io/creepjs/
  • https://www.browserscan.net/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/352618.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用CUDA加速卷积计算:原理、实践与示例代码

利用CUDA加速卷积计算:原理、实践与示例代码 在深度学习领域,卷积神经网络(Convolutional Neural Networks,CNN)是目前最流行和有效的模型之一。然而,随着模型复杂度的增加,卷积计算的计算量也随之增加,这使得在CPU上进行卷积计算变得非常耗时。因此,利用CUDA加速卷积…

我在高职教STM32——GPIO入门之蜂鸣器

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

6.17 作业

使用qt实现优化自己的登录界面 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 第一个源文件 …

做材料科学领域研究热点:高通量多尺度材料计算和机器学习

研究背景 材料科学是一个重要领域&#xff0c;涉及物质的研究和利用。随着科技进步&#xff0c;材料学已成为多学科交叉的前沿领域之一&#xff0c;融合物理、化学、数学、信息、力学和计算科学等知识。寻找更坚固的新材料已成为当今急需解决的问题。 材料基因工程作为一项颠覆…

大前端 业务架构 插件库 设计模式 属性 线程

大前端 业务架构 插件库 适配模式之(多态)协议1对多 抽象工厂模式 观察者模式 外观模式 装饰模式之参考catagory 策略模式 属性

服务器数据恢复—KVM虚拟机被误删除如何恢复虚拟磁盘文件?

服务器数据恢复环境&故障&#xff1a; 1台服务器&#xff0c;Linux操作系统EXT4文件系统&#xff0c;部署了数台KVM虚拟机&#xff0c;每台虚拟机包含一个qcow2格式的磁盘文件&#xff0c;和一个raw格式的磁盘文件。 工作人员操作失误删除了3台服务器上的KVM虚拟机&#xf…

HTML静态网页成品作业(HTML+CSS)——美食火锅介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

6.14作业

使用手动连接&#xff0c;将登录框中的取消按钮使用第二中连接方式&#xff0c;右击转到槽&#xff0c;在该槽函数中&#xff0c;调用关闭函数&#xff0c;将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"…

MySQL常见的命令

MySQL常见的命令 查看数据库&#xff08;注意添加分号&#xff09; show databases;进入到某个库 use 库; 例如&#xff1a;进入test use test;显示表格 show tables;直接展示某个库里面的表 show tables from 库&#xff1b; 例如&#xff1a;展示mysql中的表格 show tabl…

一个软件是如何开发出来的呢?

一、前言 如今&#xff0c;AI大爆发的时代&#xff0c;作为一名IT从业者&#xff0c;你是否也想尝试开发一套自己的系统&#xff0c;实现那些看似有可能实现的天马行空的想法&#xff0c;变成一个优秀甚至伟大的产品&#xff0c;甚至带来某个行业的革新&#xff0c;那作为一名…

11 数制介绍及转换

数制介绍 一、数制介绍 &#xff08;一&#xff09;计算机的数制 ​ 二进制这个词的意思是基于两个数字 ​ 二进制数或二进制位表示为0 和1 ​ 示例&#xff1a;10001011 ​ 十进制数制系统包括10 个数字&#xff1a;十进制数0、1、2、3、4、5、6、7、8、9 ​ 示例&…

List, Set, Map, Queue介绍

Java集合框架是一组接口和实现这些接口的类的集合&#xff0c;它提供了对数据集合的高效率存储和操作。以下是Java集合框架中一些核心接口的介绍&#xff1a; 1.List&#xff1a; List是一个有序的集合&#xff0c;允许包含重复的元素。它提供了按插入顺序访问元素的方法&…

React+TS前台项目实战(十一)-- 全局常用组件提示语可复制Link组件封装

文章目录 前言HighLightLink组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇讲的这个组件&#xff0c;是一个用于高亮显示文本并添加可选的跳转链接&#xff0c;提示文本&#xff0c;复制文本的 React 组件 HighLightLink组件 1. 功能分析 &#x…

CentOS搭建kubernetes集群详细过程(yum安装方式)

kubernetes集群搭建详细过程&#xff08;yum安装方式&#xff09; Kubernetes&#xff0c;也被称为K8s&#xff0c;是一个多功能的容器管理工具&#xff0c;它不仅能够协调和调度容器的部署&#xff0c;而且还能监控容器的健康状况并自动修复常见问题。这个平台是在谷歌十多年…

VS2022打开.netcore2.2 问题解决

1.vs2022运行时一直提示异常 2.解决方法&#xff0c;双击当前的项目修改xxxx.csproj文件 把当前的版本修改为2.2.0即可重新编译运行

事务所管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;客户管理&#xff0c;评论管理&#xff0c;基础数据管理&#xff0c;公告信息管理 客户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;律师管理&#xff0…

Java多线程设计模式之不可变对象(Immutable Object)模式

简介 多线程共享变量的情况下&#xff0c;为了保证数据一致性&#xff0c;往往需要对这些变量的访问进行加锁。而锁本身又会带来一些问题和开销。Immutable Object模式使得我们可以在不加锁的情况下&#xff0c;既保证共享变量访问的线程安全&#xff0c;又能避免引入锁可能带…

Vue 3与ESLint、Prettier:构建规范化的前端开发环境

title: Vue 3与ESLint、Prettier&#xff1a;构建规范化的前端开发环境 date: 2024/6/11 updated: 2024/6/11 publisher: cmdragon excerpt: 这篇文章介绍了如何在Vue 3项目中配置ESLint和Prettier以统一代码风格&#xff0c;实现代码规范性与可读性的提升。通过设置规则、解…

QT——MySQL数据库联用

一、ODBC 1、ODBC简介 ODBC全称为Open Database Connectivity,是一种用于数据库操作的标准接口。要使用ODBC,首先需要安装相应的ODBC驱动程序,然后在系统中配置ODBC数据源。接着,可以通过编程语言(如C++、Java等)或者数据库工具(如SQL Server Management Studio)来连…

【离散化 二维差分】850. 矩形面积 II

本文涉及知识点 离散化 二维差分 LeetCode850. 矩形面积 II 给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2]&#xff0c;其中&#xff08;x1&#xff0c;y1&#xff09;是矩形 i 左下角的坐标&#xff0c; (xi1, yi1) 是该矩形 左下角 的坐标…