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

How to give fake GPU info to site

我需要使用 CefSharp.Wpf 创建网络浏览器,并能够向站点提供虚假数据,例如 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);
};

我希望完全重新定义这个方法和 return 一些假信息,但是当我再次调用 gl.getParameter(param) 时,它仍然给了我一个旧的 gpu 信息

WebGLRenderingContextWebGL2RenderingContext

如果您仍然希望 Canvas2D 和 WebGL 仍然有效,那么您不能隐藏,因为它们可以通过实际渲染来指纹识别。

您可以使用

禁用它们
HTMLCanvasElement.prototype.getContext = function() {
  return null;
};

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

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

首先,您真的应该在创建上下文之前设置函数

第二你的最后一行应该是

   oldParam.call(this, parameter);

你也没有显示 debugInfo 但你可以使用 WebGLRenderingContext 或者你可以硬编码数字

至于 http://www.deviceinfo.me,您需要确保您的补丁在所有 iframe 和 worker 中先于任何其他 JavaScript 运行。

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]));
  }
}