16.Chromium指纹浏览器开发教程之WebGPU指纹定制

WebGPU指纹概述

WebGPU是下一代的Web图形和计算API,旨在提供高性能的图形渲染和计算能力。它是WebGL的后继者,旨在利用现代GPU的强大功能,使得Web应用能够实现接近原生应用的图形和计算性能。而且它是一个低级别的API,可以直接与GPU通信,从而进行图形渲染和并行计算。

WebGPU指纹信息是通过WebGPU API获取的一些硬件和驱动程序信息,这些信息包括GPU的名称、供应商、驱动程序版本、支持的功能和限制等。在前端的JavaScript中主要依赖以下接口:

1.requestAdapter

WebGPU提供了一个GPUAdapter对象,它包含了有关GPU适配器的详细信息。获取这个对象需要调用navigator.gpu.requestAdapter。以下是 GPUAdapter 的详细介绍,包括 features 和 limits 等属性:

  • features: GPUSupportedFeatures。
  • limits: GPUSupportedLimits。
  • isFallbackAdapter: boolean。
  • requestDevice: 用于请求一个 GPUDevice 对象,该对象代表实际的 GPU 设备,可以用于提交命令和管理 GPU 资源。

features 是一个 GPUSupportedFeatures 对象,表示该 GPU 适配器支持的一组特性。它是一个集合,包含了一些字符串,每个字符串代表一个特性。可以通过遍历 features 集合来检查 GPU 支持的特性。使用JavaScript代码获取示例如下:

const adapter = await navigator.gpu.requestAdapter();const supportedFeatures = adapter.features;supportedFeatures.forEach(feature => {console.log(`Supported feature: ${feature}`);});

常见的特性包括:

  • texture-compression-bc: 支持 BC (Block Compression) 纹理压缩格式。
  • timestamp-query: 支持时间戳查询,用于测量 GPU 命令的执行时间。
  • indirect-first-instance: 支持间接绘制的第一个实例。

limits 是一个 GPUSupportedLimits 对象,表示 GPU 适配器的硬件限制。这些限制决定了可以使用的资源和配置的最大值。例如:

  • maxTextureDimension1D: 1D 纹理的最大尺寸。
  • maxTextureDimension2D: 2D 纹理的最大尺寸。
  • maxTextureDimension3D: 3D 纹理的最大尺寸。
  • maxTextureArrayLayers: 纹理数组的最大层数。

isFallbackAdapter 是一个布尔值,表示当前的 GPUAdapter 是否为后备适配器。如果找不到高性能适配器,WebGPU 会返回一个功能受限的后备适配器。具体代码如下:

const isFallback = adapter.isFallbackAdapter;console.log(`Is fallback adapter: ${isFallback}`);

2.requestAdapterInfo

requestAdapterInfo 是 WebGPU API 中的一个函数,它用于获取有关 GPU 适配器的详细信息。该函数返回一个 Promise,解析为一个包含适配器信息的对象。这个对象提供了更详细的 GPU 适配器信息,比直接访问 GPUAdapter 对象的属性要更为全面。具体代码如下:

async function getDetailedGPUInfo() {try {const adapter = await navigator.gpu.requestAdapter();if (!adapter) {console.log('No GPU adapter found');return;}const adapterInfo = await adapter.requestAdapterInfo();console.log('Detailed GPU Adapter Info:', adapterInfo);} catch (error) {console.error('Error getting detailed GPU info:', error);}}getDetailedGPUInfo();

requestAdapterInfo 返回一个包含适配器详细信息的对象。以下是这些信息的详细说明:

  • vendor: GPU 供应商的标识符。例如,Intel 的 ID 通常是 8086,NVIDIA 的 ID 是 10DE,AMD 的 ID 是 1002。
  • architecture: GPU 架构的名称,例如“Turing”, “Pascal”等。这有助于了解 GPU 的性能和功能特性。
  • description: 对 GPU 适配器的描述,通常包括 GPU 的型号和名称,例如 “NVIDIA GeForce GTX 1050”。
  • device: GPU 设备的标识符,这是一个独特的 ID,用于标识特定的 GPU 设备。

WebGPU指纹获取

生成WebGPU指纹,可以通过上述所讲的JavaScript函数来获取详细的GPU信息,并将这些信息组合成一个唯一的标识符。以下是一个完整的示例代码,它展示了如何获取所有相关信息,并生成 WebGPU 指纹:

async function getWebGPUFingerprint() {try {// 请求 GPU 适配器const adapter = await navigator.gpu.requestAdapter();if (!adapter) {console.log('No GPU adapter found');return;}// 请求详细的适配器信息const adapterInfo = await adapter.requestAdapterInfo();// 获取适配器的基本信息const basicInfo = {name: adapter.name,features: [...adapter.features.values()],limits: adapter.limits,isFallbackAdapter: adapter.isFallbackAdapter};// 获取适配器的详细信息const detailedInfo = {vendor: adapterInfo.vendor,architecture: adapterInfo.architecture,description: adapterInfo.description,driverVersion: adapterInfo.driverVersion,device: adapterInfo.device};// 组合所有信息生成指纹const fingerprint = {basicInfo,detailedInfo};console.log('WebGPU Fingerprint:', fingerprint);return fingerprint;} catch (error) {console.error('Error getting GPU info:', error);}}// 调用函数获取 WebGPU 指纹getWebGPUFingerprint();

将上述代码在浏览器的控制台中运行,即可得到完整的WebGPU指纹信息,如图4-9所示:

WebGPU指纹修改

从上述指纹信息的获取可以得知,WebGPU相关信息是通过adapter接口来获取的,与修改requestAdapter中的信息相比,requestAdapterInfo可以得到更加具体的信息,涉及GPU的厂商、架构、设备和描述等信息。因此,本书的WebGPU指纹修改选择修改这里的具体信息,而且为了防止修改之后影响WebGPU的运行,选择对重要性不太高的描述信息进行定制修改。

修改WebGPU指纹信息,需要到“src/third_party/blink/renderer/modules/webgpu”目录之下,这里选择了gpu_adapter_info.cc文件作为修改文件,以下是requestAdapterInfo的源码:

GPUAdapterInfo::GPUAdapterInfo(const String& vendor,const String& architecture,const String& device,const String& description,const String& driver): vendor_(vendor),architecture_(architecture),device_(device),description_(description),driver_(driver){}

可以看出,requestAdapterInfo在Chromium中进行初始化构造的时候就会完成这些信息的赋值,因此可以在构造函数之中对这些值进行定制替换,即可完成指纹修改:

std::string my_des = *(json_reader->GetDict().FindDouble("webaudio"));description_ = String(my_des);

默认情况下,Chromium浏览器的WebGPU可能处于被禁止状态,因此可以额外添加以下命令行参数来启动WebGPU:

chrome.exe --enable-unsafe-webgpu

如图4-10所示,传递任意字符串定制WebGPU的描述信息之后,可以到BrowserScan网站查看指纹信息,可以发现WebGPU指纹已经发生了改变:

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

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

相关文章

HTTP:九.WEB机器人

概念 Web机器人是能够在无需人类干预的情况下自动进行一系列Web事务处理的软件程序。人们根据这些机器人探查web站点的方式,形象的给它们取了一个饱含特色的名字,比如“爬虫”、“蜘蛛”、“蠕虫”以及“机器人”等!爬虫概述 网络爬虫(英语:web crawler),也叫网络蜘蛛(…

Vue3+TS中svg图标的使用

安装依赖 pnpm i vite-plugin-svg-icons -D配置引入 vite.config.ts ... import { createSvgIconsPlugin } from vite-plugin-svg-icons import path from node:pathconst svgIconsPlugin createSvgIconsPlugin({iconDirs: [path.resolve(process.cwd(), src/assets/icons)]…

【java实现+4种变体完整例子】排序算法中【堆排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

以下是堆排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、堆排序基础实现 原理 基于二叉堆结构(最大堆),通过以下步骤实现排序: 构建最大堆:将…

论文阅读笔记:Generative Modeling by Estimating Gradients of the Data Distribution

1、参考来源 论文《Generative Modeling by Estimating Gradients of the Data Distribution》 来源:NeurIPS 2019 论文链接:https://arxiv.org/abs/1907.05600 参考链接: 【AI知识分享】真正搞懂扩散模型Score Matching一定要理解的三大核心…

Kubernetes相关的名词解释CNI插件(1)

(一)什么是CNI插件? 在 Kubernetes 中,CNI 插件(Container Network Interface Plugin) 是一种用于配置容器网络接口的标准工具,负责为 Pod 分配网络资源(如 IP 地址)并建…

2021-11-10 C++蜗牛爬井进3退1求天数

缘由C大一编程题目。-编程语言-CSDN问答 int n 0, t 0;cin >> n;while ((n - 3)>0)n, t;cout << t << endl;

分享一个DeepSeek+自建知识库实现人工智能,智能回答高级用法。

这个是我自己搞的DeepSeek大模型自建知识库相结合到一起实现了更强大的回答问题能力还有智能资源推荐等功能。如果感兴趣的小伙伴可以联系进行聊聊&#xff0c;这个成品已经有了实现了&#xff0c;所以可以融入到你的项目&#xff0c;或者毕设什么的还可以去参加比赛等等。 1.项…

动态规划算法:状态压缩

状态压缩动态规划算法 状态压缩动态规划是动态规划的一种&#xff0c;它通过使用位运算的方式压缩程序占用的空间&#xff0c;对于可以用来解决一些只有两个状态&#xff08;是与否&#xff09;的问题。 多少无益&#xff0c;我们通过下面的一道编程题目来学习这种算法。 题目…

查看matlab函数帮助文档的方法

方法一&#xff1a;在命令行窗口中使用help命令 方法二&#xff1a;在命令行窗口中使用doc命令 方法三&#xff1a;在帮助文档中搜索关键字

MYSQL初阶(暂为自用草稿)

目录 基本操作 database操作 table操作 数据类型 INT类型 bit类型 FLOAT类型 CHAR类型 DATE类型 SEL类型 表的约束 列约束 NULL DEFAULT PRIMARY KEY UNIQUE KEY 表约束 PRIMARY KEY FOREIGN KEY 其他补充 AUTO_INCREMENT COMMENT ZEROFILL 表的CRUD …

MVC/MVVM 高级应用的深度解析

状态共享与同步 跨组件状态管理策略 状态变更的传播机制优化 状态快照与时间旅行调试 状态持久化 本地存储策略 状态序列化与反序列化 与服务端状态同步 数据绑定进阶 双向绑定优化 脏检查机制优化 基于Proxy/Object.defineProperty的实现差异 批量更新策略 自定义…

AI 边缘计算盒子:开启智能物联新时代

一、什么是 AI 边缘计算盒子 AI 边缘计算盒子是一种集成了高性能芯片、AI 算法和数据处理能力的硬件设备。它部署在数据源的边缘侧&#xff0c;如工厂、商场、交通路口等&#xff0c;能够在本地进行数据采集、预处理、分析和决策&#xff0c;而无需将所有数据上传到云端。这种…

LeetCode 5:最长回文子串

1、题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 示例 1: 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。 示例 2: 输入&#xff1a;s "cbbd" 输出&#…

简易 Python 爬虫实现,10min可完成带效果源码

目录 准备工作 编写爬虫代码 运行爬虫 查看结果 遇到的问题及解决 总结 前言和效果 本文记录了使用 Python 实现一个简单网页爬虫的过程&#xff0c;目标是爬取 quotes.toscrape.com 的名言和作者&#xff0c;并将结果保存到文本文件。以下是完整步骤&#xff0c;包含环境…

【KWDB 创作者计划】_上位机知识篇---Docker容器

文章目录 前言1. Docker 容器是什么&#xff1f;隔离性轻量级可移植性可复用性 2. Docker 核心概念镜像容器仓库Dockerfile 3. Docker 基本使用(1) 安装 Docker(2) 容器生命周期管理(3) 镜像管理(4) 进入容器内部(5) 数据持久化&#xff08;挂载卷&#xff09;(6) 网络管理 4. …

树莓派练习

1.守护进程 守护进程含义&#xff1a;守护进程在树莓派上电后开始运行&#xff0c;断电后结束运行的进程&#xff0c;即使你的终端退出也不会停止&#xff0c;我们可以手动关闭它 使用nohup创建守护进程 先创建一个c语言文件&#xff08;long_task.c&#xff09; #include …

详细解释浏览器是如何渲染页面的?

渲染流程概述 渲染的目标&#xff1a;将HTML文本转化为可以看到的像素点 当浏览器的网络线程收到 HTML 文档后&#xff0c;会产生一个渲染任务&#xff0c;并将其传递给渲染主线程的消息队列。在事件循环机制的作用下&#xff0c;渲染主线程取出消息队列中的渲染任务&#xff0…

java+postgresql+swagger-多表关联insert操作(九)

入参为json&#xff0c;然后根据需要对多张表进行操作&#xff1a; 入参格式&#xff1a; {"username": "车主01","usertel": "11111111111","useridtype": "2","useridcard": null,"proname&qu…

JavaSpring 中使用 Redis

创建项目 配置 Redis 服务地址 创建 Controller 类 由于当前只是些简单的测试代码&#xff0c;所以就不进行分层了&#xff0c;只创建一个 Controller 来实现 jedis 通过 jedis 对象里的各种方法来操作 Redis 此处通过 StringRedisTemplate 来操作 Redis 最原始提供的类是 Re…

AI文生图工具推荐

一、AI文生图技术实现原理 AI文生图&#xff08;Text-to-Image&#xff09;基于生成对抗网络&#xff08;GAN&#xff09;或扩散模型&#xff08;Diffusion Model&#xff09;实现&#xff0c;通过深度学习将文本描述转化为图像。其核心流程包括&#xff1a; 文本编码&#xf…