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.pswp.cn/bicheng/77536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77536.shtml
英文地址,請注明出處:http://en.pswp.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…