013.随机指纹chromium编译-如何通过传参来固定指纹

随机指纹chromium编译-如何通过传参来固定指纹

由于要所有的类型的指纹都实现固定,工作量太大,这里我只用plugins指纹作为示例。

一、为什么要固定指纹

  • 目标:启动浏览器时,加上参数--fingerprints="xxxxxxx", 参数变化时,指纹也会跟着变化。打开网页后的后续访问指纹都不会再变化。
  • 广泛用于一些电商平台

二、什么是plugins指纹:

  • 之前有介绍过plugins指纹和如何修改:插眼传送

三、重新修改源码

  • 打开源码 third_party/blink/renderer/modules/plugins/dom_plugin.cc
1.头部加上(随便加在一个#include后面,之前加过就不用加了)
#include <random>
#include <string>
2.找到下面的代码
String DOMPlugin::description() const {return plugin_info_->Description();
}
3.替换为
String DOMPlugin::description() const {//return plugin_info_->Description();base::CommandLine* base_command_line = base::CommandLine::ForCurrentProcess();std::string tmp;if (base_command_line->HasSwitch("fingerprints")) {tmp = base_command_line->GetSwitchValueASCII("fingerprints"); }else{tmp = base_command_line->GetSwitchValueASCII("type"); }// LOG(ERROR) << "tmp:('" << tmp << "') tmp";String res = plugin_info_->Description();return res + String(tmp);
}

代码的原理是给每个plugin的description末尾追加上–fingerprints获取的字符串。

4.编译
ninja  -C  out/Default chrome

四、render进程追加参数

打开资源浏览器就可以发现,chromium默认使用的是多进程
启动浏览器的参数默认又只能传给主进程,所以我们还要改进程创建程序,将参数传给子进程。

  • 打开源码:\content\browser\renderer_host\render_process_host_impl.cc
1.找到下面的代码
command_line->AppendSwitchASCII(switches::kProcessType,switches::kRendererProcess);
2.替换为
command_line->AppendSwitchASCII(switches::kProcessType,switches::kRendererProcess);//追加					  
const base::CommandLine* base_command_line = base::CommandLine::ForCurrentProcess();
if (base_command_line->HasSwitch("fingerprints")) {const std::string tmp = base_command_line->GetSwitchValueASCII("fingerprints");command_line->AppendSwitchASCII("fingerprints", tmp);
}	
3.编译
ninja  -C  out/Default chrome

可以了,后续每次启动chromium时改变 --fingerprints="xxxxxxx" 参数值,就会有不同的plugins指纹

五、验证一下

  • navigator.plugins复制到F12控制台

在这里插入图片描述

  • 发现description中成功追加了我们的参数。固定plugins指纹成功。

相信我这里起个头,其他指纹如何固定,你应该跃跃欲试了。

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

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

相关文章

基于Spring Boot+VUE毕业生信息招聘平台

系统详细设计 1管理员功能模块 管理员登录&#xff0c;管理员通过输入用户名、密码、角色等信息进行系统登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员登录进入毕业生信息招聘平台可以查看首页、个人中心、企业管理、空中宣讲会管理、招聘岗位管理、毕业生管理、个…

jEasyUI 转换 HTML 表格为数据网格

jEasyUI 转换 HTML 表格为数据网格 jEasyUI 是一个基于 jQuery 的框架,它为用户提供了一套完整的用户界面组件,使得网页开发变得更加简单快捷。在本文中,我们将探讨如何使用 jEasyUI 将一个普通的 HTML 表格转换为功能丰富的数据网格(datagrid)。 为什么使用数据网格? …

汇编语言程序设计 - 输入5位以内八进制的数,存入BX中

80x86汇编习题 题目描述&#xff1a;输入5位以内八进制的数&#xff0c;存入BX中。注意&#xff1a;BX中的最高位&#xff08;第十五位&#xff09;如何输入&#xff1f; 思路&#xff1a; 1&#xff0c;清空BX&#xff0c;CL要用来移位&#xff0c;用SI记录循环次数;遇到回…

Leetcode 力扣124. 二叉树中的最大路径和 (抖音号:708231408)

二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &#xff0c…

多种异构数据的分析设计方案1:使用策略模式+函数式接口

多种异构数据的分析设计方案1&#xff1a;聊聊策略模式函数式接口 定义 策略模式(Strategy Pattern): 定义并封装一系列算法类&#xff0c;并且这些类可以相互替换&#xff0c;可以在运行时根据需要选择不同的算法&#xff0c;而不需要修改客户端流程代码。 策略模式让算法独立…

js中函数执行

1、函数调用&#xff08;函数名后跟括号&#xff09; // 定义一个无参函数 function sayHello() {console.log(Hello, World!); }// 执行函数 sayHello(); // 输出: Hello, World!2、方法调用 (1)而methods这一概念在js中的表现就是&#xff0c;一个对象的属性是一个function&…

pytest并发执行时token异常处理问题

接前面加入钩子函数处理token复用的问题&#xff0c;只保证了用例的串联执行&#xff0c;我的部分测试用例中接入了通义千问的部分接口生成测试数据&#xff0c;七八个场景跑完差不多快要10分钟。考虑使用并发执行。 http://t.csdnimg.cn/ACexL 使用多线程和不使用耗时差距很大…

springboot项目中切数据库(mysql-> pg)带来的适配问题:typeHandler

一、数据表中有一张表&#xff0c;名为role_permission&#xff0c;DDL如下&#xff1a; CREATE TABLE "public"."role_permission" ( "role_id" varchar(64) COLLATE "pg_catalog"."default" NOT NULL, "permiss…

Android11 动态权限申请

1、单个权限检查及申请 private void checkSinglePermission(){// 在需要的地方&#xff0c;如Activity中if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)! PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,…

告别传统测绘,WebGIS室内办公,工作轻松又高薪!

为什么说webgis相比传统测绘具有更广阔的发展前景? 我们从以下4个角度进行说明。 1、从工作类型看&#xff0c;WebGIS有更多积累 相信接触过测绘的小伙伴都知道&#xff0c;测绘外业和内业的岗位性质来看&#xff0c;基本没有什么上升空间&#xff0c;也谈不上什么积累。 而w…

外贸拓客软件是否有用

外贸拓客软件在帮助外贸企业提高拓客效率和成功率方面确实非常有用。以下是外贸拓客软件的主要优点和功能&#xff0c;通过参考文章中的相关数字和信息进行归纳&#xff1a; 1. 提高效率 自动化与集成功能&#xff1a;外贸拓客软件通过自动化和集成功能&#xff0c;显著减少了…

Boosting原理代码实现

1&#xff0e;提升方法是将弱学习算法提升为强学习算法的统计学习方法。在分类学习中&#xff0c;提升方法通过反复修改训练数据的权值分布&#xff0c;构建一系列基本分类器&#xff08;弱分类器&#xff09;&#xff0c;并将这些基本分类器线性组合&#xff0c;构成一个强分类…

什么是模板字符串?

模板字符串&#xff08;Template Literals&#xff09;是ES6&#xff08;ECMAScript 2015&#xff09;中引入的一种新的字符串表示方法&#xff0c;允许我们嵌入表达式&#xff0c;并在运行时将它们转换为字符串。模板字符串使用反引号&#xff08;&#xff09;来定义&#xff…

GDB调试相关教程

GDB调试相关教程 相关参考链接 https://wizardforcel.gitbooks.io/100-gdb-tips/content/set-step-mode-on.htmlhttps://wizardforcel.gitbooks.io/100-gdb-tips/content/set-step-mode-on.html 设置程序运行参数 命令set args 10 20 30 40 使用show args显示设置好的运行参…

python __call__(实例化对象的时候返回一个函数,调用这个函数的时候会执行__call__)(将类实例用作回调函数)(类装饰器)

文章目录 Python中的__call__方法深入解析__call__方法简介定义和基本用法为什么要使用__call__方法 __call__方法的高级用法在装饰器中使用__call__&#xff08;类装饰器&#xff1a;在类中保持状态或进行状态管理&#xff09;将类实例用作回调函数 结论 Python中的__call__方…

MySQL修改分隔符

1、修改分隔符符号 delimiter $$ 可以修改成$$ //都行 2、创建触发器 函数名称 create trigger 函数名 3、什么样的操作触发&#xff0c;操作那个表 after:之后触发 before:之前触发 insert:插入被触发 update:修改被触发 delete:删除被触发 on 表名 实例&#xff…

ComfyUI 完全入门:ControlNet 使用教程

今天继续给大家分享 ComfyUI 的入门必备技能&#xff1a;ControlNet。 ControlNet 提供了十几种生成图片的控制方式&#xff0c;有的可以控制画面的结构&#xff0c;有的可以控制人物的姿势&#xff0c;还有的可以控制图片的画风&#xff0c;这对于提高 AI 绘画的质量特别有用…

谷粒商城实战(042集群学习-mysql集群-主从同步)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第361p-第p363的内容 集群 集群的基础形式 MySQL集群 MMM机制 这里使用了vip虚拟ip方式&#xff08;如192.168.0.101&#xff0c;192.168.0.102&…

深入理解计算机系统 CSAPP 家庭作业6.40

这书真是会绕. A:16*16*4 B:256 ,第一个for 50%不命中 0.5*16*16.第二个for 每两个循环1次不命中 也就是128次 C:0.25

Ubuntu 22.04 在线安装docker报错E: Package ‘docker-ce‘ has no installation candidate

一、报错描述 在ubuntu 22.01上执行在线安装docker命令时出现E: Package docker-ce has no installation candidate错误。 sudo apt install docker-ce docker-ce-cli containerd.io 下面是详细报错信息 rootubuntu:# sudo apt install docker-ce docker-ce-cli containerd…