更改浏览器中的导航器以假装该插件已安装(javascript)
Change navigator in browser to pretend, that plugin is installed (with javascript)
我正在尝试做 Chrome 扩展,它会假装安装了一些插件。我试图编辑 navigator.plugins,但这些属性是只读的。我可以添加新项目 navigator.plugins[x],但我不知道如何在 navigator.plugins.
中创建新的(Plugin、PluginArray 或 MimeType)对象
有可能吗?
尝试破解失败。显然 Plugin
类型无法手动实例化。根据规范,它是只读的,Chrome 相应地实现了它 (source code)。如您所见,构造函数没有暴露给 DOM,因此我们不能使用 new Plugin
或其他方法来实例化它。
另一方面,您可以通过 <script>
元素尝试 injecting the code into webpage,例如,这将用您自己的实现替换整个内置 Plugin
class并使用那个假 class 来填充 navigator.plugins
。 PluginArray
.
同上
这是一种非常适合欺骗 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
})()
控制台输出:
我还没有添加 MimeType 属性,但应该可以通过类似的方式完成。
请随时提交 PR,以防你充实它(我已经为 puppeteer 开发了一个插件,它实现了各种检测规避技术):
https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth
编辑:我有一些空闲时间并添加了代码以完全模拟 navigator.plugins
和 navigator.mimeTypes
here。它甚至模拟功能方法、实例类型和 .toString 属性,使它们看起来像原生的并且类似于普通的 Google Chrome.
我正在尝试做 Chrome 扩展,它会假装安装了一些插件。我试图编辑 navigator.plugins,但这些属性是只读的。我可以添加新项目 navigator.plugins[x],但我不知道如何在 navigator.plugins.
中创建新的(Plugin、PluginArray 或 MimeType)对象有可能吗?
尝试破解失败。显然 Plugin
类型无法手动实例化。根据规范,它是只读的,Chrome 相应地实现了它 (source code)。如您所见,构造函数没有暴露给 DOM,因此我们不能使用 new Plugin
或其他方法来实例化它。
另一方面,您可以通过 <script>
元素尝试 injecting the code into webpage,例如,这将用您自己的实现替换整个内置 Plugin
class并使用那个假 class 来填充 navigator.plugins
。 PluginArray
.
这是一种非常适合欺骗 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
})()
控制台输出:
我还没有添加 MimeType 属性,但应该可以通过类似的方式完成。
请随时提交 PR,以防你充实它(我已经为 puppeteer 开发了一个插件,它实现了各种检测规避技术): https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth
编辑:我有一些空闲时间并添加了代码以完全模拟 navigator.plugins
和 navigator.mimeTypes
here。它甚至模拟功能方法、实例类型和 .toString 属性,使它们看起来像原生的并且类似于普通的 Google Chrome.