抓包分析
随便翻个页,会发起一个请求,可以看到响应是加密的。
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的相关知识了。
那我就直接将字符串挂到window上了,下面是流程:
[ol]
[/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 上传
成功!!!