Mas0n
mailto:MasonShi@88.com
翻车鱼

浏览器环境补充之Proxy

浏览器环境补充之Proxy

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问题讲解

实录 – 携程Cookie

https://cdn.shi1011.cn/2021/04/9581bb1dda241ff6a29a2cf1d91eaa38.png?imageMogr2/format/webp/interlace/0/quality/90|watermark/2/text/wqlNYXMwbg/font/bXN5aGJkLnR0Zg/fontsize/14/fill/IzMzMzMzMw/dissolve/80/gravity/southeast/dx/5/dy/5
清晰的调用浏览器对象流程

封面源自网络~如有侵权请联系作者删除~

Mas0n

文章作者

发表评论

textsms
account_circle
email

翻车鱼

浏览器环境补充之Proxy
Android逆向分析中我们能够对APP应用进行Hook,那么JS有没有一种方式实现同Frida的功能呢?在ES6发布之前,这显然难以实现。现在,借助ES6新增的Proxy,我们可以较为方便的实现对相关对象…
扫描二维码继续阅读
2021-04-11