当前位置: 首页 > news >正文

指纹浏览器开发教程五:浏览器内存信息相关能力该怎么改

@[TOC]@TOC导语浏览器内存信息是指纹识别中常用的一个维度。网站可以通过 navigator.deviceMemory 和 performance.memory 等接口,读取设备的大致内存容量和当前内存使用情况。对于指纹浏览器来说,这个信息需要能够按环境单独配置,让每个环境呈现出不同的内存特征。这篇教程会讲解如何在 Chromium 源码中修改这些接口的返回值。内存信息暴露的两个主要接口接口一:navigator.deviceMemory这是一个只读属性,返回设备的大致内存容量(以 GB 为单位),取值为 0.25、0.5、1、2、4、8 等离散值。javascript// 网页中读取console.log(navigator.deviceMemory); // 输出: 8接口二:performance.memory这是 Chrome 特有的扩展接口,返回更详细的内存信息:javascript// 网页中读取console.log(performance.memory);// 输出:// {// usedJSHeapSize: 12345678,// totalJSHeapSize: 23456789,// jsHeapSizeLimit: 2197815296// }这两个接口的返回值,都可以被指纹检测脚本用来判断"这个浏览器是否在虚拟机里"或者"多个账号是否来自同一台物理机"。修改 navigator.deviceMemory定位源码位置navigator.deviceMemory 的实现位于 Blink 渲染引擎中:thirdparty/blink/renderer/core/frame/navigatordevicememory.ccthirdparty/blink/renderer/core/frame/navigatordevicememory.h理解现有实现打开 navigatordevicememory.cc,你会看到类似这样的代码:cppfloat NavigatorDeviceMemory::deviceMemory() const {// 从系统获取实际内存容量int64t physicalmemory = base::SysInfo::AmountOfPhysicalMemory();// 转换为 GB 并取离散值return GetDeviceMemoryInGB(physicalmemory);}修改思路不是从系统读取真实内存,而是从环境配置中读取预设值:cppfloat NavigatorDeviceMemory::deviceMemory() const {// 尝试从环境配置读取std::string configvalue = GetEnvironmentConfig(“devicememory”);if (!configvalue.empty()) {return std::stof(configvalue);}// 兜底:返回系统真实值int64t physicalmemory = base::SysInfo::AmountOfPhysicalMemory();return GetDeviceMemoryInGB(physicalmemory);}配置传递这个修改依赖于"参数传递链路"(参考教程四)。控制程序在启动浏览器时,需要把 devicememory 参数通过配置文件或命令行传入。编译验证修改后,重新编译 Blink 层:bashautoninja C out/Default blink启动浏览器,在控制台输入 navigator.deviceMemory,验证返回值是否与配置一致。修改 performance.memory定位源码位置performance.memory 的实现位于:thirdparty/blink/renderer/core/timing/memoryinfo.ccthirdparty/blink/renderer/core/timing/memoryinfo.hthirdparty/blink/renderer/core/timing/performance.cc理解现有实现MemoryInfo 类封装了内存信息的返回:cppclass MemoryInfo : public ScriptWrappable {public:unsigned long long usedJSHeapSize() const;unsigned long long totalJSHeapSize() const;unsigned long long jsHeapSizeLimit() const;private:// 内部通过 V8 获取实际内存数据v8::HeapStatistics heapstatistics;};修改思路performance.memory 的数据来自 V8 引擎的真实堆统计,不建议直接篡改,因为会影响 JS 引擎的内存管理。更合理的做法是:1. 保持 usedJSHeapSize 和 totalJSHeapSize 为真实值(它们反映的是当前运行状态)2. 修改 jsHeapSizeLimit 的返回值,让它与环境配置的内存容量对应cppunsigned long long MemoryInfo::jsHeapSizeLimit() const {// 从环境配置读取目标内存容量std::string configmemory = GetEnvironmentConfig(“devicememory”);if (!configmemory.empty()) {float memorygb = std::stof(configmemory);// V8 堆限制通常为物理内存的某个比例return staticcast<unsigned long long(memorygb 1024 1024 1024 0.8);}// 兜底:返回 V8 原始值return heapstatistics.heapsizelimit();}为什么只改 jsHeapSizeLimitusedJSHeapSize 和 totalJSHeapSize 反映的是实时状态,篡改后可能导致 JS 引擎行为异常jsHeapSizeLimit 是一个上限值,修改后不会影响实际运行,但能让指纹检测脚本读到"合理"的内存容量很多指纹检测脚本主要关注 jsHeapSizeLimit 和 deviceMemory 的对应关系验证修改效果本地验证1. 启动修改后的浏览器2. 打开 DevTools 控制台3. 输入以下命令:javascript// 验证 deviceMemoryconsole.log(‘deviceMemory:’, navigator.deviceMemory);// 验证 performance.memoryconsole.log(‘memory:’, performance.memory);// 验证两者是否对应console.log(‘ratio:’, performance.memory.jsHeapSizeLimit / (navigator.deviceMemory 1024 1024 1024));自动化测试建议写一个 Playwright 脚本,自动验证内存信息的返回值:javascriptconst { chromium } = require(‘playwright’);(async () = {const browser = await chromium.launch({executablePath: ‘/path/to/easybr/chrome’});const page = await browser.newPage();await page.goto(‘about:blank’);const deviceMemory = await page.evaluate(() = navigator.deviceMemory);const memoryInfo = await page.evaluate(() = performance.memory);console.log(‘Device Memory:’, deviceMemory);console.log(‘JS Heap Limit:’, memoryInfo.jsHeapSizeLimit);await browser.close();})();常见问题问题一:修改后编译报错检查是否正确引入了 GetEnvironmentConfig 的头文件确认 std::stof 的输入字符串格式正确(如 “8” 而不是 “8GB”)清理编译缓存:autoninja C out/Default clean,然后重新编译问题二:deviceMemory 返回值不是离散值Chromium 的规范要求 deviceMemory 返回离散值(0.25、0.5、1、2、4、8)。如果配置值是 6,需要映射到最接近的离散值:cppfloat GetDiscreteMemoryValue(float rawvalue) {const float kDiscreteValues[] = {0.25, 0.5, 1, 2, 4, 8};// 找到最接近的离散值float closest = kDiscreteValues[0];for (float v : kDiscreteValues) {if (std::abs(v rawvalue) < std::abs(closest rawvalue)) {closest = v;}}return closest;}问题三:修改对某些网站不生效检查是否在正确的渲染进程中修改(主进程修改不会影响已存在的渲染进程)确认网站没有使用 Service Worker 缓存旧的 JS 执行结果尝试无痕模式或清除缓存后重新测试EasyBR 的内存指纹实践EasyBR 在内存指纹的实现上,有几个经验:配置粒度不提供任意数值输入,而是提供几个预设选项:2GB、4GB、8GB、16GB。这样既满足大多数场景,又避免用户输入不合理的值。一致性检查在控制程序中,当用户选择 8GB 内存时,同时检查分辨率、CPU 核心数等参数是否匹配。避免出现"8GB 内存 + 1366x768 分辨率 + 双核 CPU"这种不合理的组合。动态调整对于 performance.memory 的 usedJSHeapSize,EasyBR 选择不改。原因是:1. 篡改实时内存数据可能导致 JS 引擎的 GC 策略异常2. 大多数指纹检测只关注 deviceMemory 和 jsHeapSizeLimit 的对应关系3. 保持 usedJSHeapSize 真实,反而更自然结语内存信息指纹的修改,是指纹浏览器开发中相对简单但很重要的一环。它涉及 Blink 层的 JS 接口修改,是理解"如何在 Chromium 中定制浏览器行为"的一个好起点。完成这个修改后,你就掌握了从配置传递到内核生效的完整链路。后续修改其他指纹参数(如 CPU 核心数、UA、时区等),思路都是类似的。下一篇教程,我们会进入 CPU 指纹信息的修改。

http://www.jsqmd.com/news/826503/

相关文章:

  • 基于MCP协议构建AI技能服务器:从原理到实战开发指南
  • SLO-Warden:基于错误预算的云原生服务稳定性自动化管理实践
  • 智能苔藓花园:用CircuitPython与NeoPixel打造会呼吸的天气可视化装置
  • Kaggle竞赛实战技能库:从数据预处理到模型集成的完整工程化实践
  • FAST开发方法在系统分析中四个阶段
  • Windows Cleaner:3步解决C盘爆红,快速释放系统空间的实用指南
  • 2026年公考软件大盘点:技术架构与用户体验深度评测
  • 04 AI 时代的岗位分工与协作机制
  • SpleeterGui终极指南:3步实现AI音乐人声分离的免费神器
  • 我们团队的技术债已经堆成山,我用这四步说服老板给时间重构
  • Swift集成飞书API:原生SDK实现iOS/macOS应用无缝协同
  • 使用git filter-repo删除已提交到git中的敏感信息,api key,配置文件等
  • 二分查找与二分答案模板
  • 【BUUCTF】【WEB】Nmap
  • AI时代PPT实战:产品思维与AI辅助的高效演示方法论
  • Maven依赖裁剪插件paperclip-plugin-acp实战:Spring Boot瘦身利器
  • 书成紫微动,律定凤凰驯:从无心创作到天命显化的海棠山铁哥之路
  • Go语言构建高并发实时流媒体服务器:dundas/liveport架构与实战
  • Ketcher分子编辑器实战指南:从基础绘图到高级生物分子设计
  • BilibiliDown:零基础小白也能轻松下载B站视频的完整指南
  • 西安电子科技大学网络对抗原理选修课实验2-基于Snort的入侵检测实验
  • 2026年评价高的洛阳流行舞蹈培训/洛阳舞蹈培训/洛阳零基础舞蹈培训/洛阳爵士舞培训哪家专业 - 行业平台推荐
  • 如何通过Perseus实现碧蓝航线皮肤解锁与游戏深度定制
  • AI技能库实战指南:结构化Prompt与自动化流程提升内容创作效率
  • Proxima向量检索库:硬件优化与量化技术实战解析
  • 代码审查时最该关注的不是语法,而是这五个“坏味道”
  • 毕业论文写不好别慌!这 3 款神器让你轻松搞定格式排版和论文查重(重复率、AI疑似率)
  • 从“租赁”到“共生”:江南北机器人如何重构企业与AI的协作关系
  • AI规则引擎:构建可控智能应用的核心架构与实践
  • 我电脑上安装的cli工具复盘