Android逆向分析中我们能够对APP应用进行Hook,那么JS有没有一种方式实现同Frida的功能呢?
在ES6发布之前,这显然难以实现。现在,借助ES6新增的Proxy,我们可以较为方便的实现对相关对象甚至全局进行Hook
2021-04-11
有什么用:借助Proxy的中间代理,开发者能够清楚的了解调用了哪些的对象和属性,检测了哪些特征,没有补全的环境,能够方便的进行环境的补充以及检测点去特征化。
关于Proxy就不介绍了,可以参看MDN – Proxy,直接上代码:
require("./console") // 打印美化文件 let env = require("./NodeEnv") // 浏览器模拟环境 const RunStacks = new Set(); const ownProxy = (rootPath, name ,runKeys)=>{ if(rootPath.toString().indexOf("function") + 1){ return rootPath; } // 判断 匿名函数 if(typeof rootPath[runKeys] === "undefined" && runKeys !== ""){ rootPath[runKeys] = rootPath || global; } // 预处理 未定义节点 const proxy = new Proxy(rootPath, { get() { let stacks = Reflect.get(...arguments); let args2 = typeof arguments[1] !== "symbol" && isNaN(parseInt(arguments[1]))?name + "." + arguments[1].toString():name + `[${arguments[1].toString()}]`; if (stacks === undefined && typeof arguments[1] !== "symbol"){ !(RunStacks.has(args2)) && RunStacks.add(args2) && console.error(args2, " not define"); return stacks; } !(RunStacks.has(args2)) && RunStacks.add(args2) && console.debug("SystemCall:", args2); if(arguments[1] === "prototype"){ return stacks; } if(stacks instanceof Object /* && !Array.isArray(stacks) */){ return ownProxy(stacks,args2,arguments[1]); } return stacks; }, }); return proxy; } Object.keys(env).map( (value)=>{ global[value] = ownProxy(env[value] ,`${value}`,""); // global[value] = env[value]; } ) module.exports = global
值得注意的是,Proxy需要特别关注this的问题,如果处理不当那么目标对象内部的this
关键字会指向 Proxy 代理,从而会引发错误,可以参考阮一峰大佬在 ECMAScript6中关于Proxy的this问题讲解
发表回复