如何向网站提供虚假 GPU 信息

问题描述 投票:0回答:3

我需要使用 CefSharp.Wpf 创建 Web 浏览器,并能够向网站提供虚假数据,例如 CPU 核心、浏览器插件、平台名称等。 有一些网站可以检索所有这些信息:https://www.deviceinfo.me/

我的问题是:如何从该网站隐藏 GPU 信息?使用 javascript 或 CefSharp 功能

我尝试重新定义 WebGLRenderingContext.getParameter 方法,该方法提供有关 GPU 渲染器和供应商的信息:


var canvas = document.createElement('canvas');

var gl;

try {
  gl = canvas.getContext("webgl2") || canvas.getContext("webgl") || canvas.getContext("experimental-webgl2") || canvas.getContext("experimental-webgl");
} catch (e) {
}

var oldParam = WebGLRenderingContext.prototype.getParameter;


WebGLRenderingContext.prototype.getParameter = function(parameter){

    console.log("we have guests");

    if(parameter == debugInfo.UNMASKED_RENDERER_WEBGL){
         return "GTX 1080";
    }

    if(parameter == gl.getExtension("WEBGL_debug_renderer_info").UNMASKED_RENDERER_WEBGL){
        return "GTX 1080";
    }

    if(parameter == debugInfo.UNMASKED_RENDERER_WEBGL){
        return "NVidia";
    }

    if(parameter == gl.VERSION){
        return "GTX 1080";
    }
    return oldParam(parameter);
};

我本来希望完全重新定义这个方法并返回一些假信息,但是当我再次调用

gl.getParameter(param)
时,它仍然给了我一个旧的gpu信息

javascript webgl cefsharp
3个回答
4
投票

如果您仍然希望 Canvas2D 和 WebGL 继续工作,那么您无法隐藏,因为它们可以通过实际渲染进行指纹识别。

您可以禁用它们

HTMLCanvasElement.prototype.getContext = function() {
  return null;
};

虽然它们不存在的事实也是一个数据点。

否则你的包装似乎有一些问题。

首先,您确实应该在创建上下文之前设置函数。

第二你的最后一行应该是

oldParam.call(this, parameter);

此外,您没有显示

debugInfo

,但您可以使用 
WebGLRenderingContext
 代替,或者您可以对数字进行硬编码

至于

http://www.deviceinfo.me,您需要确保您的补丁在任何其他 JavaScript 之前在所有 iframe 和工作线程中运行。

WebGLRenderingContext.prototype.getParameter = function(origFn) { const paramMap = {}; paramMap[0x9245] = "Foo"; // UNMASKED_VENDOR_WEBGL paramMap[0x9246] = "Bar"; // UNMASKED_RENDERER_WEBGL paramMap[0x1F00] = "Nobody"; // VENDOR paramMap[0x1F01] = "Jim"; // RENDERER paramMap[0x1F02] = "Version 1.0"; // VERSION return function(parameter) { return paramMap[parameter] || origFn.call(this, parameter); }; }(WebGLRenderingContext.prototype.getParameter); // --- test const gl = document.createElement('canvas').getContext('webgl'); const ext = gl.getExtension('WEBGL_debug_renderer_info'); show(gl, gl, [ 'VENDOR', 'RENDERER', 'VERSION', ]); if (ext) { show(gl, ext, [ 'UNMASKED_VENDOR_WEBGL', 'UNMASKED_RENDERER_WEBGL', ]); } function show(gl, base, params) { for (const param of params) { console.log(param, ':', gl.getParameter(base[param])); } }


1
投票

WebGLRenderingContext

WebGL2RenderingContext

    


0
投票
我的代码和您的建议对我不起作用。如果您有解决办法请搜索一下 谢谢你

// 您现有的 UnDetectedChromeDriver 创建代码 IWebDriver 驱动程序 = UnDetectedChromeDriver.Create( 选项:选项Chrome, userDataDir:AppSettings.Profile? AppSettings.ProfilePath:空, 驱动程序可执行路径:chromeDriverPath, browserExecutablePath:二进制位置, 抑制欢迎:真实, 隐藏命令提示窗口:true);

// Inject the JavaScript code to modify WebGL parameters string script = @" WebGLRenderingContext.prototype.getParameter = function(parameter) { if (parameter === 37445) { return 'Custom WebGL Vendor'; } if (parameter === 37446) { return 'Custom WebGL Renderer'; } return getParameter(parameter); }; "; IJavaScriptExecutor js = (IJavaScriptExecutor)driver; js.ExecuteScript(script);
    
© www.soinside.com 2019 - 2024. All rights reserved.