在浏览器中更改导航器假装,安装该插件(使用javascript)

时间:2015-10-30 01:00:28

标签: javascript google-chrome-extension navigator

我正在尝试进行Chrome扩展,假装已经安装了一些插件。我试图编辑navigator.plugins,但这些属性是只读的。我可以添加新项目navigator.plugins [x],但我不知道,如何在navigator.plugins中创建新的(Plugin,PluginArray或MimeType)对象。

甚至可能吗?

2 个答案:

答案 0 :(得分:3)

尝试破解但失败了。显然Plugin类型无法手动实例化。它是规范的只读,Chrome会相应地实现它(source code)。正如您所看到的,构造函数未暴露给DOM,因此我们无法使用new Plugin或其他方法来实例化它。

另一方面,您可以通过<script>元素尝试injecting the code into webpage,例如,它将使用您自己的实现替换整个内置Plugin类,并使用该假类填充navigator.plugins。同上PluginArray

答案 1 :(得分:3)

这是一种很好的欺骗PluginArray的方法(请注意Object.setPrototypeOf):

(function generatePluginArray() {
  const pluginData = [
    { name: "Chrome PDF Plugin", filename: "internal-pdf-viewer", description: "Portable Document Format" },
    { name: "Chrome PDF Viewer", filename: "mhjfbmdgcfjbbpaeojofohoefgiehjai", description: "" },
    { name: "Native Client", filename: "internal-nacl-plugin", description: "" },
  ]
  const pluginArray = []
  pluginData.forEach(p => {
    function FakePlugin () { return p }
    const plugin = new FakePlugin()
    Object.setPrototypeOf(plugin, Plugin.prototype);
    pluginArray.push(plugin)
  })
  Object.setPrototypeOf(pluginArray, PluginArray.prototype);
  return pluginArray
})()

控制台输出:

enter image description here

我还没有添加MimeType属性,但是应该可以通过类似的方式来实现。

随意提交PR,以防万一(我为puppeteer开发了一个插件,该插件正在实现各种检测逃避技术): https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth

编辑:我有一些空闲时间,并添加了代码以完全模拟navigator.pluginsnavigator.mimeTypes here。它甚至可以模拟功能性方法,实例类型和.toString属性,以使它们看起来本机并类似于普通的Google Chrome。