【JS逆向】某建筑webpack逆向分析
**逆向目标**- 网址:`aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55`
- 目标:响应数据解密
**抓包分析**
随便翻个页,会发起一个请求,可以看到响应是加密的。
**逆向分析**
既然已经知道是响应加密了,那就直接开始逆向。点开启动器,按照经验(1.响应加密,2.xhr请求),那就先去响应拦截器搂一眼,一般是从`xxx.request`点进去即可。
下断,翻页,成功断住,一气呵成。
然后我们就需要找响应拦截器,其实逐个点进去看看都可以的,本案例就在下图箭头的地方,直接进去。
`xxx.interceptors.response.use`这就是响应拦截器的一个标志,那`t.data`应该就是密文,`b`应该就是解密函数。
直接下断,成功断住。
然后我们直接单步进去`b`函数,经常玩逆向的朋友其实到这就已经秒了,这不一眼AES嘛。
确实如此,其实逆向到这,拿到`key`,拿到`iv`,就可以找个加解密网站看是不是标准的AES了,经验证,算法没有被魔改。
但是!!!我们这篇文章的主题是webpack,我们就不按套路出牌,否则以后遇到webpack,加解密算法不明显的时候,该不会抠还是不会抠。
经常搞webpack的朋友都清楚,代码该怎么抠,无非就是找加载器,补齐缺失的模块,导出关键函数,最后进行加解密。
我们先分析一下代码逻辑,在解密的时候主要用到了`d`对象,而`d`又是`n.n(u)`,很显然第一个`n`就是加载器,因为前面很多对象都通过`n(xxx)`赋值,而`xxx`就是模块名称。
加载器找到了,可以在`u = n("3452")`中下断,因为`d`的赋值用到了`u`,然后刷新页面,进去加载器,发现加载器实际是函数`s`。
然后我们把加载器拿下来(箭头所指部分),注意,先不要拿模块,模块就是这个自执行函数传入的大对象,我们先传空。
代码拿下来之后,回到加载器中分析一下逻辑,`e`为模块名,`a`为存储模块的地方,先判断有没有,有的话直接返回,没有的话就走后面的逻辑,去`t`对象里面拿,而`t`就是自执行函数的传参,包含了所有模块。
所以,我们抠模块的时候,直接从`t`对象拿就行。
下面有两种选择:
- 运行代码,缺哪个模块补哪个,直到成功解密
- 半自动抠webpack
我选第二种,那么怎么半自动抠模块呢,首先我们要清楚需要构造一个怎样的字符串,才适合我们的加载器调用。
> {"模块名": 模块函数, ...},这应该没有异议吧。或者你构造成数组也没问题,不过数组是怎么调用的,要自己去看看webpack的相关知识了。
那我就直接将字符串挂到window上了,下面是流程:
> 1. 回到`u = n("3452")`断点,刷新页面,重新断住
> 2. 将字符串挂载到window上,window.module_str = '{'
> 3. 在加载器的`if (a)`处下条件断点,,`` window.module_str += `"${e}":${t.toString()},`,false ``
> 4. 在目标对象后面下断(可以在这`p = n("5c96")`),确保成功加载了`d`对象
> 5. 将断点跳到`p = n("5c96")`处
> 6. 执行`window.module_str += '}'`
> 7. 执行`copy(window.module_str)`
> 8. 将自执行函数的空对象换成我们复制的对象
OK,到这里,我们就成功把加载器和解密相关的模块都抠下来了,接下来就是导出我们需要的东西。
我就直接在自执行函数最后将加载器挂到window(global)上了。 剩下的就是网页上怎么解密的,我们就怎么解密就行了。
解密结果:
成功!!! 虽然大佬讲的清楚,但是作为前端菜鸡,还是没懂,加载器是啥,模块是啥,怎么导,怎么扣,最后怎么合成一个可执行的代码块,找的资料都是分片的,不能快速上手,有时候就是抓个加密算法,着急抓狂 本帖最后由 prience0118 于 2024-11-22 14:31 编辑
你这个界面的key是怎么拿的,我自己写怎么解密不了呢
```
const iv = CryptoJS.enc.Utf8.parse("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大会员 发表于 2024-11-20 22:23
太高产了,没几天你就凤毛麟角了!
写文章有利于巩固知识{:1_918:} littlewhite11 发表于 2024-11-20 22:28
写文章有利于巩固知识
挺佩服的,你的js思路很清晰,今天评分给你送过了,明天接着给你送! SVIP9大会员 发表于 2024-11-20 22:29
挺佩服的,你的js思路很清晰,今天评分给你送过了,明天接着给你送!
其实我还处于菜鸡阶段:(eew 感谢分享 百度三文鱼 发表于 2024-11-20 22:49
虽然大佬讲的清楚,但是作为前端菜鸡,还是没懂,加载器是啥,模块是啥,怎么导,怎么扣,最后怎么合成一个可执行 ...
我的建议是,可以看一看webpack是怎么构成的,原理懂了之后你就通透了 大佬厉害 支持,感谢分享思路