Hook JavaScript对象字面量构造器,修改不可访问上下文创建的对象
拦截对象字面量并修改属性的解决方案
由于对象字面量的属性初始化最终会调用全局的Object.defineProperty方法,我们可以通过Hook这个方法监控属性定义过程,在目标属性被设置时修改其值。这种方法不依赖目标代码的结构,即使代码被混淆也能生效,适合用书签工具或用户脚本实现。
书签工具版本(可直接添加为浏览器书签)
javascript:(function(){const o=Object.defineProperty;Object.defineProperty=function(e,r,t){if(r==='nestedsubobject'&&t.value&&t.value.foo==='value')t.value.foo='modified value';return o(e,r,t)}})();
用户脚本版本(适配Tampermonkey/Greasemonkey)
// ==UserScript== // @name 修改目标对象的Foo属性 // @namespace local // @version 0.1 // @description 拦截IIFE中的对象字面量,修改其嵌套属性foo的值 // @match https://目标网站域名/* // @grant none // ==/UserScript== (function() { 'use strict'; const originalDefineProperty = Object.defineProperty; Object.defineProperty = function(obj, prop, descriptor) { // 检测是否是目标嵌套对象的定义 if (prop === 'nestedsubobject' && descriptor.value) { const nestedObj = descriptor.value; // 匹配初始值,避免误修改其他对象 if (nestedObj.foo === 'value') { nestedObj.foo = 'modified value'; } } return originalDefineProperty(obj, prop, descriptor); }; })();
注意事项
- 若目标代码被混淆,属性名(如
nestedsubobject或foo)发生变化,只需将代码中的对应名称替换为混淆后的名称即可。 - 如果需要更精准的拦截,可以结合属性的特性(如
enumerable、writable)进行判断,避免影响其他对象。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

