Chromium 修改UA的几种办法方法c++

news2024/10/3 23:51:09

第一种方式 启动浏览器添加命令行

格式 --user-agent="自定义的UA"

1、C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 jdtest"

2、启动浏览器f12查看效果

可以看到 net render 和主进程以及f12开发者工具中 都已经追加成功自定义ua。

原因是 翻看源码【本例子122核】可以看到每次取UA优先从命令行,然后是默认UA

// A string used to override the default user agent with a custom one.
const char kUserAgent[] = "user-agent";

components\embedder_support\user_agent_utils.cc

absl::optional<std::string> GetUserAgentFromCommandLine() {
  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
  if (command_line->HasSwitch(kUserAgent)) {
    std::string ua = command_line->GetSwitchValueASCII(kUserAgent);
    if (net::HttpUtil::IsValidHeaderValue(ua)) {
      return ua;
    }
    LOG(WARNING) << "Ignored invalid value for flag --" << kUserAgent;
  }
  return absl::nullopt;
}


std::string GetUserAgent(
    UserAgentReductionEnterprisePolicyState user_agent_reduction) {
  //从命令行获取UA
  absl::optional<std::string> custom_ua = GetUserAgentFromCommandLine();
  if (custom_ua.has_value()) {
    return custom_ua.value();
  }
  
  //获取默认UA
  return GetUserAgentInternal(user_agent_reduction);
}

第二种方法如下:

1、在components\embedder_support\user_agent_utils.cc和content\common\user_agent.cc中直接修改源码:

1、components\embedder_support\user_agent_utils.cc

// Internal function to handle return the full or "reduced" user agent string,
// depending on the UserAgentReduction enterprise policy.
std::string GetUserAgentInternal(
    UserAgentReductionEnterprisePolicyState user_agent_reduction) {
  std::string product = GetProductAndVersion(user_agent_reduction);
  if (base::CommandLine::ForCurrentProcess()->HasSwitch(kHeadless)) {
    product.insert(0, "Headless");
  }

#if BUILDFLAG(IS_ANDROID)
  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
          switches::kUseMobileUserAgent))
    product += " Mobile";
#endif

  // In User-Agent reduction phase 5, only apply the <unifiedPlatform> to
  // desktop UA strings.
  // In User-Agent reduction phase 6, only apply the <unifiedPlatform> to
  // android UA strings.
  return ShouldSendUserAgentUnifiedPlatform(user_agent_reduction)
             ? content::BuildUnifiedPlatformUserAgentFromProduct(product)
             : content::BuildUserAgentFromProduct(product);
}

absl::optional<std::string> GetUserAgentFromCommandLine() {
  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
  if (command_line->HasSwitch(kUserAgent)) {
    std::string ua = command_line->GetSwitchValueASCII(kUserAgent);
    if (net::HttpUtil::IsValidHeaderValue(ua)) {
      return ua;
    }
    LOG(WARNING) << "Ignored invalid value for flag --" << kUserAgent;
  }
  return absl::nullopt;
}

//主进程 net进程 和render进程都会调用此函数,稍后看调试堆栈
std::string GetUserAgent(
    UserAgentReductionEnterprisePolicyState user_agent_reduction) {
  absl::optional<std::string> custom_ua = GetUserAgentFromCommandLine();
  if (custom_ua.has_value()) {
    return custom_ua.value();
  }

  return GetUserAgentInternal(user_agent_reduction);
}

2、content::BuildUserAgentFromProduct函数实现在
content\common\user_agent.cc
std::string BuildUserAgentFromProduct(const std::string& product) {
  std::string os_info;
  base::StringAppendF(&os_info, "%s%s", GetUserAgentPlatform().c_str(),
                      BuildOSCpuInfo(IncludeAndroidBuildNumber::Exclude,
                                     IncludeAndroidModel::Include)
                          .c_str());
  return BuildUserAgentFromOSAndProduct(os_info, product);
}
//此处代码是否有种似曾相识感觉,其他的自行看源码吧。
std::string BuildUserAgentFromOSAndProduct(const std::string& os_info,
                                           const std::string& product) {
  // Derived from Safari's UA string.
  // This is done to expose our product name in a manner that is maximally
  // compatible with Safari, we hope!!
  std::string user_agent;
  base::StringAppendF(&user_agent,
                      "Mozilla/5.0 (%s) AppleWebKit/537.36 (KHTML, like Gecko) "
                      "%s Safari/537.36",
                      os_info.c_str(), product.c_str());
  return user_agent;
}

2、看下调用GetUserAgent的堆栈

 1)、地址栏输入www.baidu.com render进程调用GetUserAgent初始化UA

2)、我将UA追加 jdtest 编译看下效果:

至此:两种方法定义UA已经介绍完毕,至于动态定义UA读者可自行实现。

   

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

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

相关文章

vgg19提取特征

一般来说&#xff0c;大家使用VGG16&#xff0c;用的是第四列的网络架构&#xff0c;而使用VGG19&#xff0c;使用的就是第六列的网络架构。 使用vgg进行提取特征&#xff0c;在这个项目中&#xff0c;使用的就是每一块卷积层的第一层。 import torch.nn as nn from torchvis…

T10:数据增强

T10周&#xff1a;数据增强 **一、前期工作**1.设置GPU,导入库2.加载数据 **二、数据增强****三、增强方式**方法一&#xff1a;将其嵌入model中方法二&#xff1a;在Dataset数据集中进行数据增强 **四、训练模型****五、自定义增强函数****六、总结** &#x1f368; 本文为&am…

idea使用ant源码运行tomcat8.5

1 安装ant 下载ant 下载地址 使用apache-ant-1.10.15版本 将压缩包放到/Library/Java/ant解压 设置ant环境变量 打开finder到用户根目录 按下shiftcmd.显示隐藏文件 打开隐藏文件.zprofile 按照以下格式设置环境变量 #ant export ANT_HOME/Library/Java/ant/apache-a…

数据丢失怎么办?2024四款恢复工具帮你忙!

数据是我们日常生活和工作中不可或缺的一部分&#xff0c;然而&#xff0c;由于误操作、硬件故障或其他原因导致的数据丢失却是常有的事情。这时候&#xff0c;一款可靠的数据恢复工具就显得尤为重要。 福昕数据恢复 直达链接&#xff1a;www.pdf365.cn/foxit-restore/ 假设…

Linux命令:用于显示 Linux 发行版信息的命令行工具lsb_release详解

目录 一、概述 二、用法 1、基本用法 2、选项 3、获取帮助 三、示例 1. 显示所有信息 2. 只显示发行版名称 3. 只显示发行版版本号 4. 只显示发行版代号 5. 只显示发行版描述 6. 只显示值&#xff0c;不显示标签 四、使用场景 1、自动化脚本 2、诊断问题 3、环…

【KVM】虚拟化技术及实战

一&#xff0c;KVM简介 KVM全称为QEMU-KVM。 KVM可以模拟内存&#xff0c;cpu的虚拟化&#xff0c;不能模拟其他设备虚拟化。 QEMU可以模拟I/O设备&#xff08;网卡&#xff0c;磁盘等&#xff09; 两者结合&#xff0c;实现真正意义上的虚拟化。 从rhel6版本开始&#xff0c…

Elasticsearch——数据聚合、数据同步与集群搭建

目录 1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket 聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric 聚合语法1.2.5.小结 1.3.RestAPI 实现聚合1.3.1.API 语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.…

YOLOv8 结合设计硬件感知神经网络设计的高效 Repvgg的ConvNet 网络结构 ,改进EfficientRep结构

一、理论部分 摘要—我们提出了一种硬件高效的卷积神经网络架构,它具有类似 repvgg 的架构。Flops 或参数是评估网络效率的传统指标,这些网络对硬件(包括计算能力和内存带宽)不敏感。因此,如何设计神经网络以有效利用硬件的计算能力和内存带宽是一个关键问题。本文提出了一…

Chromium 使用安全 DNS功能源码分析c++

一、选项页安全dns选项如下图&#xff1a; 二、那么如何自定义安全dns功能呢&#xff1f; 1、先看前端部分代码调用 shared.rollup.jsclass PrivacyPageBrowserProxyImpl {.................................................................getSecureDnsResolverList() {re…

25货拉拉校园招聘面试经验 面试最常见问题总结

货拉拉校园招聘面试经验 目录 【面试经历】 问题+详细答案 面试全流程 【面试经历】 发面经,攒人品。 项目问题: 1.AOP日志落库到数据库,为什么不用一些现成的方案? 2.邀请链接的id怎么用redis生成的? 3.乐观锁保证了奖励的正确发放,请你说说乐观锁的原理。 4.奖…

TCN模型实现电力数据预测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色&a…

AI少女/HS2甜心选择2 仿天刀人物卡全合集打包

内含AI少女/甜心选择2 仿天刀角色卡全合集打包共21张 下载地址&#xff1a;https://www.51888w.com/408.html 部分演示图&#xff1a;

python全栈学习记录(二十一)类的继承、派生、组合

类的继承、派生、组合 文章目录 类的继承、派生、组合一、类的继承二、派生三、组合 一、类的继承 继承是一种新建类的方式&#xff0c;新建的类称为子类&#xff0c;被继承的类称为父类。 继承的特性是&#xff1a;子类会遗传父类的属性&#xff08;继承是类与类之间的关系&a…

基于STM32的数字温度传感器设计与实现

引言 STM32 是由意法半导体&#xff08;STMicroelectronics&#xff09;开发的基于 ARM Cortex-M 内核的微控制器系列&#xff0c;以其强大的处理能力、丰富的外设接口和低功耗著称&#xff0c;广泛应用于嵌入式系统设计中。在这篇文章中&#xff0c;我们将介绍如何基于 STM32…

C++《string》

在之前的C语言学习当中我们已经了解了一系列的字符以及字符串函数&#xff0c;虽然这些函数也能实现对字符串进行求长度、拷贝、追加等操作&#xff0c;但是C语言当中的这些函数是与字符串分离的&#xff0c;并且最主要的是在使用这些函数时原字符串的底层空间是需要我们自己来…

微知-Intel芯片中的QPI是什么?本质是什么?以及其他几个高速总线的速率问题(快速通道互联,CPU之间互联总线)

基础信息 CPU与CPU之间通过QPI总线进行通信&#xff0c;类似CPU与PCI-E设备通过PCIE总线进行通信。 The Intel QuickPath Interconnect (QPI)&#xff1a;快速通道互联&#xff0c;快路径内部互联总线。是Inter-connect&#xff0c;内部互联的。是英特尔开发的一种高速点对点…

SpringBoot精华:打造高效美容院管理系统

第一章 绪论 1.1 选题背景 如今的信息时代&#xff0c;对信息的共享性&#xff0c;信息的流通性有着较高要求&#xff0c;尽管身边每时每刻都在产生大量信息&#xff0c;这些信息也都会在短时间内得到处理&#xff0c;并迅速传播。因为很多时候&#xff0c;管理层决策需要大量信…

BiLSTM模型实现电力数据预测

基础模型见&#xff1a;A020-LSTM模型实现电力数据预测 1. 引言 时间序列预测在电力系统管理、负荷预测和能源优化等领域具有重要意义。传统的单向长短期记忆网络&#xff08;LSTM&#xff09;因其在处理时间序列数据中的优势&#xff0c;广泛应用于此类任务。然而&#xff0…

用友NC service接口信息泄露漏洞

漏洞描述 用友NC service接口信息泄露漏洞&#xff0c;攻击者可通过构造恶意链接获取所有接口链接 公网上大部分服务器都没有修复此漏洞&#xff0c;可刷SRC 用友nc有个接口可以获取数据库账户密码&#xff0c;不过是老版本了 漏洞复现 app"用友-UFIDA-NC" POC …

哪家宠物空气净化器可以高效去除浮毛?希喂、IAM、有哈怎么样

在现代养宠家庭中&#xff0c;随着生活节奏的加快&#xff0c;清理浮毛也是很多家庭周末必须要做的事情。但是如何选择一款吸毛好、还不增加清理负担的宠物空气净化器&#xff0c;在寸土寸金的租房里为全家老小的健康生活保障&#xff1f;又如何通过强大的吸毛、除臭技术和除菌…