【JS逆向】某建筑webpack逆向分析

查看 91|回复 10
作者:littlewhite11   
逆向目标
  • 网址:aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55
  • 目标:响应数据解密

    抓包分析
    随便翻个页,会发起一个请求,可以看到响应是加密的。


    1.png (15.22 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    逆向分析
    既然已经知道是响应加密了,那就直接开始逆向。点开启动器,按照经验(1.响应加密,2.xhr请求),那就先去响应拦截器搂一眼,一般是从xxx.request点进去即可。


    2.png (26.03 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    下断,翻页,成功断住,一气呵成。


    3.png (10.95 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    然后我们就需要找响应拦截器,其实逐个点进去看看都可以的,本案例就在下图箭头的地方,直接进去。


    4.png (22.88 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    xxx.interceptors.response.use这就是响应拦截器的一个标志,那t.data应该就是密文,b应该就是解密函数。


    5.png (8.87 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    直接下断,成功断住。


    6.png (10.98 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    然后我们直接单步进去b函数,经常玩逆向的朋友其实到这就已经秒了,这不一眼AES嘛。


    7.png (12.09 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    确实如此,其实逆向到这,拿到key,拿到iv,就可以找个加解密网站看是不是标准的AES了,经验证,算法没有被魔改。


    8.png (147.21 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    但是!!!我们这篇文章的主题是webpack,我们就不按套路出牌,否则以后遇到webpack,加解密算法不明显的时候,该不会抠还是不会抠。
    经常搞webpack的朋友都清楚,代码该怎么抠,无非就是找加载器,补齐缺失的模块,导出关键函数,最后进行加解密。
    我们先分析一下代码逻辑,在解密的时候主要用到了d对象,而d又是n.n(u),很显然第一个n就是加载器,因为前面很多对象都通过n(xxx)赋值,而xxx就是模块名称。


    9.png (21.78 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    加载器找到了,可以在u = n("3452")中下断,因为d的赋值用到了u,然后刷新页面,进去加载器,发现加载器实际是函数s。


    10.png (12.71 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    然后我们把加载器拿下来(箭头所指部分),注意,先不要拿模块,模块就是这个自执行函数传入的大对象,我们先传空。


    11.png (18.07 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    代码拿下来之后,回到加载器中分析一下逻辑,e为模块名,a为存储模块的地方,先判断有没有,有的话直接返回,没有的话就走后面的逻辑,去t对象里面拿,而t就是自执行函数的传参,包含了所有模块。
    所以,我们抠模块的时候,直接从t对象拿就行。


    12.png (24.58 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:35 上传

    下面有两种选择:
  • 运行代码,缺哪个模块补哪个,直到成功解密
  • 半自动抠webpack

    我选第二种,那么怎么半自动抠模块呢,首先我们要清楚需要构造一个怎样的字符串,才适合我们的加载器调用。

    {"模块名": 模块函数, ...},这应该没有异议吧。或者你构造成数组也没问题,不过数组是怎么调用的,要自己去看看webpack的相关知识了。

    那我就直接将字符串挂到window上了,下面是流程:

    [ol]
  • 回到u = n("3452")断点,刷新页面,重新断住
  • 将字符串挂载到window上,window.module_str = '{'
  • 在加载器的if (a[e])处下条件断点,,window.module_str += `"${e}":${t[e].toString()},`,false
  • 在目标对象后面下断(可以在这p = n("5c96")),确保成功加载了d对象
  • 将断点跳到p = n("5c96")处
  • 执行window.module_str += '}'
  • 执行copy(window.module_str)
  • 将自执行函数的空对象换成我们复制的对象
    [/ol]

    OK,到这里,我们就成功把加载器和解密相关的模块都抠下来了,接下来就是导出我们需要的东西。
    我就直接在自执行函数最后将加载器挂到window(global)上了。 剩下的就是网页上怎么解密的,我们就怎么解密就行了。


    13.png (40.45 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:36 上传

    解密结果:


    14.png (86.17 KB, 下载次数: 0)
    下载附件
    2024-11-20 20:36 上传

    成功!!!

    下载次数, 下载附件

  • 百度三文鱼   

    虽然大佬讲的清楚,但是作为前端菜鸡,还是没懂,加载器是啥,模块是啥,怎么导,怎么扣,最后怎么合成一个可执行的代码块,找的资料都是分片的,不能快速上手,有时候就是抓个加密算法,着急抓狂
    prience0118   

    你这个界面的key是怎么拿的,我自己写怎么解密不了呢
    [color=]const
    [color=]iv
    =
    CryptoJS
    .enc.
    Utf8
    .
    [color=]parse
    (
    [color=]"0123456789ABCDEF"
    ); // 16字节的IV
    const secretKey = CryptoJS.enc.Utf8.parse("jo8j9wGw%6HbxfFn");
    // 定义解密函数
    function b(t) {
        try {
            var e = CryptoJS.enc.Hex.parse(t);
            var n = CryptoJS.enc.Base64.stringify(e);
            var a = CryptoJS.AES.decrypt(n, secretKey, {
                iv: iv,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            });
            // 将解密后的 WordArray 转换为 UTF-8 字符串
            var r = a.toString(CryptoJS.enc.Utf8);
            // 返回解密后的字符串
            return r;
        } catch (error) {
            console.error("Decryption error:", error);
            return null;
        }
    }
    SVIP9大会员   

    太高产了,没几天你就凤毛麟角了!
    littlewhite11
    OP
      


    SVIP9大会员 发表于 2024-11-20 22:23
    太高产了,没几天你就凤毛麟角了!

    写文章有利于巩固知识
    SVIP9大会员   


    littlewhite11 发表于 2024-11-20 22:28
    写文章有利于巩固知识

    挺佩服的,你的js思路很清晰,今天评分给你送过了,明天接着给你送!
    littlewhite11
    OP
      


    SVIP9大会员 发表于 2024-11-20 22:29
    挺佩服的,你的js思路很清晰,今天评分给你送过了,明天接着给你送!

    其实我还处于菜鸡阶段
    kirito010   

    感谢分享
    littlewhite11
    OP
      


    百度三文鱼 发表于 2024-11-20 22:49
    虽然大佬讲的清楚,但是作为前端菜鸡,还是没懂,加载器是啥,模块是啥,怎么导,怎么扣,最后怎么合成一个可执行 ...

    我的建议是,可以看一看webpack是怎么构成的,原理懂了之后你就通透了
    DUANXI   

    大佬厉害
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部