JS逆向之webpack 通用扣取思路

查看 96|回复 9
作者:cenjy9   
本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!

标题

环境
  • win10
  • chrome106


    目标站:aHR0cHM6Ly93d3cuZ205OS5jb20v
    加密参数 password: K6YEmQrNy%2FQgdnacXhdIZ1upCj4UU562IW89oOZquLkZ%2F16JDNyMqEU7pGVemvQzjfAlOzh7nSOLPkJp3kxbTm8XtWrHp9K%2BmMClOmmhkbdjAyax5xLBWC6PJiD6o8H
    随便输入一些信息,触发登录,抓包找到接口

    全局搜索password,没有找到明显的有用信息,使用xhr堆栈随便找个疑似位置打个断点跟进去

    明显分析出a.encode就是加密方法
    ,查看结构可以看出是webpack结构

    1.定位加载模块的方法(加载器)
    webpack必有一个加载模块的方法:call或apply,找到加载器先抠出来

    function e(s) {
        if (i)
            return i.exports;
        var n = i = {
            exports: {},
            id: s,
            loaded: !1
        };
        return t.call(n.exports, n, n.exports, e),
    }
    2.构造成自执行方法
    在控制台调试一下缺什么补什么
    !function(t) {
        function e(s) {
            var i = {};
            if (i)
                return i.exports;
            var n = i = {
                exports: {},
                id: s,
                loaded: !1
            };
            return t.call(n.exports, n, n.exports, e),
        }
    }()
    3.定位并扣除调用的加密方法
    在a.encode处下断点,跟进去找到最终的加密方法
    分析得知jsencrypt.encrypt就是最终的加密方法

    将jsencrypt.encrypt的方法整段扣出来,然后作为参数填入自执行加载器中,然后在将调用jsencrypt.encrypt的方法也抠出来

    代码太长就不贴了,最终的格式就是下面的样子,
    !(function(t) {
        var i = {};
        function e(s) {
            if (i) return i.exports;
            var n = i = {
                exports: {},
                id: s,
                loaded: !1
            };
            return t.call(n.exports, n, n.exports, e), n.loaded = !0, n.exports
        }
        _e = e;
    })({
        encrypt: function(t, e, i) {},
        diaoyong: function(t, e, i) {}
    });
    4.导出加密方法
    var _e;
    !(function(t) {
        var i = {};
        function e(s) {
            if (i) return i.exports;
            var n = i = {
                exports: {},
                id: s,
                loaded: !1
            };
            return t.call(n.exports, n, n.exports, e), n.loaded = !0, n.exports
        }
        _e = e;
    })({
        encrypt: function(t, e, i) {},
        diaoyong: function(t, e, i) {}
    });
    5.编写自定义方法 按照流程加密
    function getkey(pass, time) {
        var diaoyong= _e("diaoyong");
        //这儿需要new一下调用方法,不然获取不到方法属性
        var new_diaoyong = (new diaoyong);
        return new_diaoyong.encode(pass, time)
    }
    效果

    本文仅供学习交流使用,如侵立删!

    方法, 在这里

  • HongChenBaBa   

    为啥我提示Uncaught TypeError: Cannot read properties of undefined (reading 'call'),这个呢。
    刚学不知道是哪里扣错了。
    [HTML] 纯文本查看 复制代码
       
       
       
        Document


    helian147   


    HongChenBaBa 发表于 2023-1-9 17:54
    为啥我提示Uncaught TypeError: Cannot read properties of undefined (reading 'call'),这个呢。
    刚学 ...

    2832行  var r = i(4);  所以那个encyrpt部分,还是要用原来的 4
    2850行  var new_diaoyong = new (diaoyong);  改  var new_diaoyong = new diaoyong();
    Arcticlyc   

    支持学习
    feiyu361   

    兄弟,发个网站练练手
    wolfren   

    学习了,感谢。
    cenjy9
    OP
      


    feiyu361 发表于 2022-12-8 14:12
    兄弟,发个网站练练手

    aHR0cHM6Ly93d3cuZ205OS5jb20v
    feiyu361   


    cenjy9 发表于 2022-12-9 01:02
    aHR0cHM6Ly93d3cuZ205OS5jb20v

    收到,感谢了
    zhangsf123   

    学习到了。感谢。
    larva110   

    学习学习
    您需要登录后才可以回帖 登录 | 立即注册