本文案例:MD5+DES+Webpack:考试宝
加密参数


标头sign和响应都是加密数据,下面先来逆向一下sign值
定位sign加密位置+复现加密js代码
我们直接用xhr定位,触发断点:

查看入参:

没有入参往上一个栈看:

这里数据加密好了,继续向上跟栈:

最后一个栈还是加密的,咱们在异步前打上断点触发接口进入异步前:

这里应该是请求拦截器,咱么进入第2个函数(第一个0函数没有,进第三个,先进异步成功执行的函数):

就是请求拦截器,打上断点(一定要打在return的位置,不然断不下来)运行进来看看参数:

放掉,重新触发断点到异步前,再进入第6个函数(其实还是刚才那个函数),运行进来(第二次断下来才是第六个函数)看参数:

这次就有了呢,但是看这里也没有加密的函数啊,我们在这个文件中搜索一下sign看看是不是在哪儿赋值了,然后填入的:

这里请求头填入了个sign值为h,打个断点看看h是否是密文:

说明这里很可能就是赋值加密值的位置,接下来我们看看h从哪儿来:

打断点进来,然后在控制台上输出一下:

符合什么,md5吧,咱来确定一下是不是标准md5:

ok,标准md5加密,咱直接自己写一下代码,再补一下参数,封装一下即可:
javascript
var CryptoJS = require("crypto-js");
function encMD5() {
var n = Date.now()
h = CryptoJS.MD5("12b6bb84e093532fb72b4d65fec3f00b" + "0ab341e5-6d3a-4b4d-8808-ae5daee96a64" + "/questions/lists" + n + "12b6bb84e093532fb72b4d65fec3f00b").toString()
return {
'timetimestamp': n,
'sign': h
}
}
console.log(encMD5())
result:

验证一下能不能拿到数据:

虽然直接拿到了明文数据,但咱还是再逆向一下响应数据试试
找响应解密位置
响应数据直接hook:

点了好多次才找到这个,但是不是...hook不行试试关键字搜索吧:

翻页看看触发哪个断点吧:

触发了这个看样子像是DES加密(对称加密),咱直接扣代码吧
扣代码+补环境
核心代码如下:

运行:

咱直接全扣代码,找一下o在哪儿赋值的:

打上断点,然后翻页重新触发断点,发现触发不了,这时就应该想可能是webpack了,刷新网页断下来了:

进去之后发现webpack标志:

观察一下这个js文件:

标准外链式webpack打包,全扣下来,运行:

window = global;o = n(302)别忘记补,接着运行:

将加载器导出到全局:

这里一定要看一下加载器名字到底叫什么,不一定就是n,bc在最上面(全局)定义上即可,再运行:

开始拿模块了,写上这句话:

运行:

拿下来发现还要拿好多模块,咱直接使用批量获取模块的方法:
第一步:先刷新页面让断点到这里:

第二步:进n中在if这里打上断点,运行过来:

第三步:将c赋值为空(清除缓存):

第四步:设置变量准备接收所需要的模块:

第五步:设置条件断点:

第六步:寻找运行区间:


第六步:运行

第七步:控制台输出一下aaa:

第八步:拿下来所有的模块:
javascript
// 输入此行代码即可将模块拼接成字符串再copy下来
result = '{'; for(let x of Object.keys(aaa)){result = result + '"' + x + '"' + ":" + aaa[x] + ','}; result = result + '}'

粘贴下来将引号去掉再将其粘贴在webpack的模块位置即可,vs可能做不了,还带是pycharm,粘贴好之后整理一下如图:

接着运行会报这个错:

接着运行,缺啥补啥即可:

然后会报错,应该是密钥不正确(我们之前拿到的t在刷新完网页之后就会变),之前讲过,密钥要不是前端写死的要不就是后端传过来然后前端从接口中拿到,这里我们写死发现不对,那就只可能是后端传入后前端请求的,我们顺着t来找在哪儿请求,请求的什么接口,这里t是参数传入的,就进入上一个栈:

进入之后发现是这里生成的(下面有个No.a的方法,那里是刚我们过来的地方,即解密位置),打上断点重新翻页运行过来:

这里看不出什么,进函数:


然后这里是拿出localStorage里面的e(passphrase),这里传入的:

获取的就是这个接口的这个值:

py发请求将它拿下来在传入js解密然后就能得到结果了
小结
本文主要讲的是批量获取webpack模块,还有注意的就是发两次请求,一次拿密钥一次拿数据,本文到此就结束了,webpack以后会经常遇到,但不是说遇到就要用webpack,这是一种思路,类似于代码全扣,我们也可以一点一点扣,只要能逆向出来就OK