网站首页:aHR0cHM6Ly93d3cuaXp1aXlvdS5jb20v
打开浏览器,F12打开开发者工具,控制台用atob方法进行解密
逆向目标:请求头Authorization,每次请求都会改变,看起来是个签名,所有接口都有这个请求头
先搜搜看,
搜到了,发现有两个文件都会出现,但是第一个文件有混淆,可以基本确定是加密的代码,点进去断点看看是不是我们要的参数
直接在上面断点,发现是算法生成的位置
控制台打印一下可以看到,是拼接成的,加密参数在上面生成了,直接就能看到加密位置,就在这里
这里的_0x1e0843,_0x2ca19d是return 上一行的var 定义了一堆东西里定义出来的,
稍微分析一下可以得出 timestamp是时间戳差不多的数字,nonceStr把timestamp加密了,sign是把params,nonceStr,timestamp,ua用_分割加密,params是当前就接口的请求参数,如果是post请求,但是没携带请求参数 ,params就是 “{}”
timestamp= _0x102a95()()[_0x36be68(0x33d)]()
先看一下timestamp怎么生成的,直接搜索_0x102a95
只有两个,很轻松
刷新网页断点调试下
跟进去_0x102a95 = _0x2bacfa['n'](_0x5488c5)发现是混淆用的,实际执行的是_0x5488c5,那就看看_0x5488c5怎么生成的,这段代码的上一行就是_0x5488c5 = _0x2bacfa(0xa7e),0xa7e=2686,点进_0x2bacfa看一下
是个webpack的加载器函数,先把加载器全都扣下来
然后写一个自执行函数包裹住
就像这样,我自己改写了一些变量名
!function (_0x5e21b2) {
var _0x4c311c={};
function _0x12a2e9(_0x275489) {
if (_0x4c311c[_0x275489])
return _0x4c311c[_0x275489].exports;
var _0x4d93cd = _0x4c311c[_0x275489] = {
'id': _0x275489,
'loaded': !0x1,
'exports': {}
};
return _0x5e21b2[_0x275489]["call"](_0x4d93cd['exports'], _0x4d93cd, _0x4d93cd['exports'], _0x12a2e9),
_0x4d93cd['loaded'] = !0x0,
_0x4d93cd['exports'];
};
}(
//这里放扣下来的字典
)
加载器扣取完成,现在看看2686的文件在哪里,选中_0x2bacfa(0xa7e)直接点进去,
往上拉就能看见
这里就是生成timestamp的地方,拉到最上面可以看到这里是个大字典,直接6万多行的大字典全扣下来放在上面代码的自执行函数的传参里然后定义一个全局变量,加载器下面用全局变量接收 加载器函数(2686)
分析代码可以知道另外两个参数的加密位置,最后分析本文第二张图片Authorization拼接的位置,封装成参数调用可以得出结果,固定时间戳对比浏览器生成的参数是否一致,
结果如图
收工