JS 逆向之代码补全,Proxy使用 (二)

文章目录

特别注意点

注意点:在补全代码的使用,是属性就补对象,是方法就补方法 。 案例如下:

是属性就补对象
document = {
   
   
    getElementById:{
   
   }
}
是方法就补方法
document = {
   
   
    getElementById:function () {
   
   
        
    }
}

案例

代理小案例

function enc3() {
   
   
 
    // 校验
    try {
   
   
        if (navigator.toString() === '[object Navigator]') {
   
   
 
            window.addEventListener()
            // 搜索框
            let kw = document.getElementById("kw")
            let val = kw.getAttribute("class")
            // 创建画布
            let canvas = document.createElement("canvas")
            var ctx = canvas.getContext("2d"
### 配置JavaScript逆向中的Proxy代理环境 在进行JavaScript逆向工程时,配置`Proxy`代理环境可以有效拦截并监控目标对象的操作行为。这不仅有助于理解程序逻辑,还能用于检测或绕过某些安全机制。 #### 创建基础的Proxy实例 为了创建一个能够监听特定操作(如获取属性、设置属性等)的基础`Proxy`实例,需提供两个参数:被代理的目标对象和处理器对象。处理器对象定义了一系列陷阱函数来捕获对目标执行的各种操作[^1]。 ```javascript const target = {}; // 被代理的对象 const handler = { get(target, propKey, receiver) { console.log(`getting ${propKey}`); return Reflect.get(target, propKey, receiver); }, set(target, propKey, value, receiver) { console.log(`setting ${propKey} to`, value); return Reflect.set(target, propKey, value, receiver); } }; const proxyInstance = new Proxy(target, handler); ``` #### 构建复杂的链式代理结构 对于更复杂的应用场景,比如模拟浏览器窗口环境下的全局变量访问,则可以通过构建多层嵌套的`Proxy`实现更加灵活的数据处理方式。例如,在给定的例子中展示了如何构造带有自定义名称空间的伪`window`对象及其内部成员,并利用`chainedProxy()`辅助函数完成整个层次结构的封装[^3]。 ```javascript function chainedProxy(obj, nameSpace){ const handlers = {}; (function buildHandlers(currentObj, path=[]){ for(let key of Object.keys(currentObj)){ if(typeof currentObj[key]==='object' && !Array.isArray(currentObj[key])){ buildHandlers(currentObj[key], [...path,key]); handlers[path.join('.')] ||= {}; handlers[path.join('.')][key] = function(...args){ console.groupCollapsed(`${nameSpace}.${path.concat(key).join('.')}`, ...args); try{ let result = this[key](...args); console.log('Result:',result); return result; }finally{ console.groupEnd(); } }; } } obj.__proto__=new Proxy({},handlers[path.join('.')]?handlers[path.join('.')]:{}); })(obj); return new Proxy(obj,{ apply(target,thisArg,args){return target.apply(thisArg,args)}, construct(target,args,newTarget){return Reflect.construct(target,args,newTarget)} }); } let window2 = {"name":"CC11001100","location":{"document":{"all":[{"name":""}],all2:false,all3(){}}}}; window2 = chainedProxy(window2,'window2'); console.dir(window2,{depth:null}); ``` 上述代码片段实现了对任意深度的对象树建立全面的日志记录功能,每当发生任何读写请求时都会打印相应的上下文信息到控制台,这对于分析第三方库的行为模式非常有用。 #### 处理潜在的安全挑战 当面对设置了断点或其他形式干扰正常流程的情况时,除了直接移除可疑代码外,还可以考虑采用间接手段规避这些问题的发生。例如,通过重载内置API的方式阻止未授权的调试指令被执行;或者引入额外一层抽象使得原始逻辑难以被轻易识别出来[^2]。 ```javascript // 替换原生alert方法防止弹窗打断自动化测试过程 (function(){ var originalAlert = globalThis.alert.bind(globalThis); globalThis.alert=function(msg){ /* 自定义日志收集 */ console.warn('[ALERT]',msg); // 可选地恢复默认行为 //originalAlert(msg); }; })(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值