声明
本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文未经许可禁止转载,禁止任何形式的修改后进行二次传播,若有侵权,请联系作者删除!
逆向目标
- 网站:aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vZmlybS9yZWNydWl0LzBueF8zZ35+Lmh0bWw/a2E9Y29tLXJlY3J1aXQtbW9kdWxlLWV4cG9zZQ==
抓包分析
打开开发者工具或者F12,向下滑动页面加载数据接口,发现请求参数和响应数据均为密文
逆向分析
kiv参数和b参数
首先刷新页面全局搜索kiv:发现只有一个js文件存在
选中在源面板中打开,ctrl+f搜索kiv:迅速定位,断点调试
发现请求参数b和kiv分别由t和a生成,观察调试得到如下js代码并删掉其余断点
a = (0, M._A)();
t = (0, M.mA)(n, {iv: a}).replace(/\//g, "_").replace(/\+/g, "-").replace(/=/g, "~");
n控制台打印输出
a = (0, M._A)();
n = '{"encCompanyId":"0nx_3g~~","pageIndex":2}';
t = (0, M.mA)(n, {iv: a}).replace(/\//g, "_").replace(/\+/g, "-").replace(/=/g, "~");
本地运行M未定义
继续向上跟进代码找到M的位置如下,发现是一个webpack,和之前的案列一样扣就完事
刷新页面选中n发现是一个c函数继续跟进,跳到了另一个runtimeXXX.js文件,发现是一个模块为空的webpack
文件代码很少,全扣!然后继续回到断点M处,选中n(12210)不过跳到了当前文件,ctrl+f搜索12210迅速定位,找到如下位置
这时就不能只扣12210的代码了,这里是属于一个加载器的模块会同时涉及到很多其他地方的模块,层层嵌套,如果一个一个的去扣会很麻烦,简单粗暴的方法就是ctrl+a全选该文件代码复制到本地,注意该代码很长,十几万哦
注意这里的第3行的self,在js中不能通过self来进行对象指向,浏览器可以,但本地不行,这里可以替换为window,注意哈十几万的代码有点卡哈
再回到之前扣的空模块的webpack代码那里,最下面也有个self,也给它替换掉
然后全局导出c函数,调用12210模块赋值给M,记得导入12210模块文件,运行
到此,b和kiv参数就逆向完成啦~,还剩下响应密文数据未逆向了
响应数据
不管响应数据如何加密,最终响应密文数据必然会解密加载到网页,这里可以刷新页面搜索decrypt关键字,发现和参数逆向文件一样
直接源面板打开搜索decrypt关键字,快速定位断点调试如下
发现AES加密关键字,多次刷新页面发现n.key不变,t会变化,e为返回的加密密文数据,
n.key = {
"words": [
1193550929,
1635214187,
1197891916,
1111046002
],
"sigBytes": 16
}
t = 'WLj4okdRTqIMoa7D' //变化的
经过断点调试发现变量t就是参数kiv,这里我们不去扣该解密算法,先尝试标准算法库
key = {
"words": [
1193550929,
1635214187,
1197891916,
1111046002
],
"sigBytes": 16
}
r = Crypto.AES.decrypt(e.toString(), key, {
iv: Crypto.enc.Utf8.parse(kiv),
mode: Crypto.mode.CBC,
padding: Crypto.pad.Pkcs7
});
r = r.toString(Crypto.enc.Utf8)
经检验该处算法就是标准的AES,到此全部逆向完毕,结果验证成功!