挂钩 javascript 对象文字构造函数以修改在无法访问的上下文中创建的对象

Hooking javascript object literal constructors to modify objects created in inaccessible contexts

提问人:Lee 提问时间:3/26/2023 最后编辑:Lee 更新时间:3/26/2023 访问量:56

问:

我正在尝试修改代码中存在的一个对象,我无法控制且无法直接更改。理想情况下,我想从书签中执行此操作,但用户脚本的额外权限也是一个可用的上下文。

我尝试钩接的代码如下所示:

(() => {
  var target = { nestedsubobject: { foo: 'value' } };
  // does some stuff with target
})();

我想截获分配给 的对象文字并修改 的值,然后再 IIFE 进一步使用它。targetfoo

到目前为止,我尝试过的所有方法都不起作用:

  • 原型似乎与此问题无关。虽然我可以覆盖全局对象原型,但这使我无法实际侦听使用该原型创建的对象。
    • 使用 on 定义 or with or 会导致在构造目标对象时抛出客户端代码。仅使用配置会导致该属性存在于新对象中,因此在原型对象中被忽略。Object.definePropertyObject.prototypenestedsubobjectfoowritable: falseget()TypeError: can't redefine non-configurable property (...)value
  • 构造函数使用对象文本进行绕过。虽然我可以重写全局对象构造函数(如重写 JavaScript 全局本机 Object() 构造函数),但文字语法似乎不使用该构造函数。

此外,我无法直接更改代码(例如,拦截和重写它的网络请求),因为我预计它将来可能会被混淆。我想直接挂钩对象创建,以使我的用户脚本更加持久。

这是在浏览器上下文中运行的。

JavaScript 用户脚本对象 文字

评论

0赞 katniss 3/26/2023
如果开发人员可以代理此类对象的构造,那将是安全违规。
0赞 trincot 3/26/2023
此代码是否在浏览器上下文中运行?
0赞 Lee 3/26/2023
@trincot这是在浏览器中运行的,我已经编辑了问题以澄清这一点。
0赞 double-beep 3/27/2023
这回答了你的问题吗?停止执行 Javascript 函数(客户端)或对其进行调整
0赞 Lee 3/31/2023
不幸的是,@double哔声并不完全是。它可以在类似的情况下工作,但我特别需要依赖于结果对象的形状(我希望它保持基本稳定),而不是直接修改负责创建它的代码(我预计这可能是不稳定的,我希望它能够防止潜在的混淆,并且我有进一步的理由不修改,我不能在这里分享)

答: 暂无答案