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指纹已经发生了改变: