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

news2025/4/24 6:25:34

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.coloradmin.cn/o/2341251.html

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

相关文章

SQL预编译——预编译真的能完美防御SQL注入吗

SQL注入原理 sql注入是指攻击者拼接恶意SQL语句到接受外部参数的动态SQL查询中,程序本身 未对插入的SQL语句进行过滤,导致SQL语句直接被服务端执行。 拼接的SQL查询例如,通过在id变量后插入or 11这样的条件,来绕过身份验证&#…

运行neo4j.bat console 报错无法识别为脚本,PowerShell 教程:查看语言模式并通过注册表修改受限模式

无法将“D:\neo4j-community-4.4.38-windows\bin\Neo4j-Management\Get-Args.ps1”项识别为cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 前提配置好环境变量之后依然报上面的错…

【EDA软件】【设计约束和分析操作方法】

1. 设计约束 设计约束主要分为物理约束和时序约束。 物理约束主要包括I/O接口约束(如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束。 时序约束是FPGA内部的各种逻辑或走线的延时,反应系统的频率和速度的约束…

【Lua】Lua 入门知识点总结

Lua 入门学习笔记 本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用,包括全局变量和局部变量的区别,以及nil类型的概念、数值型、字符串和函数的基本操作,包括16进制表示、科学计数法、字符串连接、函数声明…

光谱相机在肤质检测中的应用

光谱相机在肤质检测中具有独特优势,能够通过多波段光谱分析皮肤深层成分及生理状态,实现‌非侵入式、高精度、多维度的皮肤健康评估‌。以下是其核心应用与技术细节: ‌一、工作原理‌ ‌光谱反射与吸收特性‌: ‌血红蛋白‌&a…

机器学习第一篇 线性回归

数据集:公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标:基于GDP值预测幸福指数。(单特征预测) 代码: 文件一:prepare_for_traning.py """用于科学计算的一个库…

CS144 Lab1实战记录:实现TCP重组器

文章目录 1 实验背景与要求1.1 TCP的数据分片与重组问题1.2 实验具体任务 2 重组器的设计架构2.1 整体架构2.2 数据结构设计 3 重组器处理的关键场景分析3.1 按序到达的子串(直接写入)3.2 乱序到达的子串(需要存储)3.3 与已处理区…

Linux安装mysql_exporter

mysqld_exporter 是一个用于监控 MySQL 数据库的 Prometheus exporter。可以从 MySQL 数据库的 metrics_schema 收集指标,相关指标主要包括: MySQL 服务器指标:例如 uptime、version 等数据库指标:例如 schema_name、table_rows 等表指标:例如 table_name、engine、…

BeautifulSoup 库的使用——python爬虫

文章目录 写在前面python 爬虫BeautifulSoup库是什么BeautifulSoup的安装解析器对比BeautifulSoup的使用BeautifulSoup 库中的4种类获取标签获取指定标签获取标签的的子标签获取标签的的父标签(上行遍历)获取标签的兄弟标签(平行遍历)获取注释根据条件查找标签根据CSS选择器查找…

HTTP的Header

一、HTTP Header 是什么? HTTP Header 是 HTTP 协议中的头部信息部分,位于请求或响应的起始行之后,用来在客户端(浏览器等)与服务器之间传递元信息(meta-data)(简单理解为传递信息的…

linux虚拟机网络问题处理

yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件:fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&arch…

AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B专属管家大模型

环境: AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 Qwen2.-1.5B/3B Llama factory llama.cpp 问题描述: AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B管家大模型 解决方案: 一、准备数据集我这…

协同推荐算法实现的智能商品推荐系统 - [基于springboot +vue]

🛍️ 智能商品推荐系统 - 基于springboot vue 🚀 项目亮点 欢迎来到未来的购物体验!我们的智能商品推荐系统就像您的私人购物顾问,它能读懂您的心思,了解您的喜好,为您精心挑选最适合的商品。想象一下&am…

Jenkins的地位和作用

所处位置 Jenkins 是一款开源的自动化服务器,广泛应用于软件开发和测试流程中,主要用于实现持续集成(CI)和持续部署(CD)。它在开发和测试中的位置和作用可以从以下几个方面来理解: 1. 在开发和测…

【集合】底层原理实现及各集合之间的区别

文章目录 集合2.1 介绍一下集合2.2 集合遍历的方法2.3 线程安全的集合2.4 数组和集合的区别2.5 ArrayList和LinkedList的区别2.6 ArrayList底层原理2.7 LinkedList底层原理2.8 CopyOnWriteArrayList底层原理2.9 HashSet底层原理2.10 HashMap底层原理2.11 HashTable底层原理2.12…

srp batch

参考网址: Unity MaterialPropertyBlock 正确用法(解决无法合批等问题)_unity_define_instanced_prop的变量无法srp合批-CSDN博客 URP | 基础CG和HLSL区别 - 哔哩哔哩 (bilibili.com) 【直播回放】Unity 批处理/GPU Instancing/SRP Batche…

【Linux运维涉及的基础命令与排查方法大全】

文章目录 前言1、计算机网络常用端口2、Kali Linux中常用的命令3、Kali Linux工具的介绍4、Ubuntu没有网络连接解决方法5、获取路由6、数据库端口 前言 以下介绍计算机常见的端口已经对应的网络协议,Linux中常用命令,以及平时运维中使用的排查网络故障的…

Webview+Python:用HTML打造跨平台桌面应用的创新方案

目录 一、技术原理与优势分析 1.1 架构原理 1.2 核心优势 二、开发环境搭建 2.1 安装依赖 2.2 验证安装 三、核心功能开发 3.1 基础窗口管理 3.2 HTML↔Python通信 JavaScript调用Python Python调用JavaScript 四、高级功能实现 4.1 系统级集成 4.2 多窗口管理 五…

克服储能领域的数据处理瓶颈及AI拓展

对于储能研究人员来说,日常工作中经常围绕着一项核心但有时令人沮丧的任务:处理实验数据。从电池循环仪的嗡嗡声到包含电压和电流读数的大量电子表格,研究人员的大量时间都花在了提取有意义的见解上。长期以来,该领域一直受到对专…

包含物体obj与相机camera的 代数几何代码解释

反余弦函数的值域在 [0, pi] 斜体样式 cam_pose self._cameras[hand_realsense].camera.get_model_matrix() # cam2world# 物体到相机的向量 obj_tcp_vec cam_pose[:3, 3] - self.obj_pose.p dist np.linalg.norm(obj_tcp_vec) # 物体位姿的旋转矩阵 obj_rot_mat self.ob…