某店登陆参数 UA 加密逻辑分析
来源 | 咸鱼学Python
今日网站
aHR0cHM6Ly9kLndlaWRpYW4uY29tL3dlaWRpYW4tcGMvbG9naW4vIy8=
有两周没有更新,赶紧更新一波,希望不要像上次的视频一样浏览量翻车。
加密定位
输入账号密码,点击登陆,可以看到下面的请求
我们需要分析的参数是ua
这个参数
直接通过Initiator
第一个的位置先打上断点
重新提交一下,这个时候就会断住了
红框里的e
里面已经包含了生成好的ua
了
所以继续往上一层堆栈查找,直到下面这个位置
可以看到i
是由window.getUa()
生成的
所以这个时候就只要把window.getUa()
的逻辑搞出来就可以了
加密分析
跟进去看到的是 ob 混淆
这个 ob 比较简单,不用还原也可以分析这个加密,简单反混淆一下去掉类似_0x4651('0x440')
这样的代码
通过上面的截图可以看到window.getUa()
的逻辑是下面这一串
window["getUa"] = function () {
var _0x7dfc34 = new Date()["getTime"]();
if (_0x4a9622) {
_0x2644f4();
}
_0x55b608();
var _0x261229 = _0x1722c3(_0x2e98dd) + "|" + _0x1722c3(_0x420004) + "|" + _0x7dfc34["toString"](16);
_0x261229 = btoa(_0x570bef["gzip"](_0x261229, {
"to": "string"
}));
return _0x261229;
};
返回的值是_0x261229
,所以只要这个值相关的逻辑就可以了
window["getUa"] = function () {
var _0x7dfc34 = new Date()["getTime"]();
var _0x261229 = _0x1722c3(_0x2e98dd) + "|" + _0x1722c3(_0x420004) + "|" + _0x7dfc34["toString"](16);
_0x261229 = btoa(_0x570bef["gzip"](_0x261229, {
"to": "string"
}));
return _0x261229;
};
由上面的代码可以得出以下结论
_0x7dfc34
是当前的时间戳
_0x261229
是由_0x1722c3(_0x2e98dd) + "|" + _0x1722c3(_0x420004) + "|" +时间戳
拼接组成,最后返回的结果由前面的结果先压缩再经由btoa
组成
这样分析我们发现目前未知的参数就只有 3 个,分别为_0x1722c3
、_0x2e98dd
、_0x420004
接下来回到网页上分析看看这三个参数的值
首先是_0x1722c3
,这个是一个加密逻辑,不用管里面是什么,后面直接扣逻辑就行
然后是_0x2e98dd
这里面的参数是当前的环境参数,这里面包含了的系统字体,屏幕参数,电池状态,header、Navigtor等一系列的参数
其次是_0x420004
这里记录了鼠标数据,以及点击的数据
现在需要将上面的逻辑移到 node 中,这个比较简单
先扣_0x1722c3
,这个函数非常简单,因为这个方法的代码就是一个个小方法体组成的直接一块块粘贴下来就行了
然后就是_0x2e98dd
和_0x420004
这两个参数,第一个环境信息可以直接复制写死就行了,因为很多他并没有强校验这个参数的逻辑,很多获取的都是一些共有的属性。
第二个_0x420004
这个参数是获取的鼠标轨迹信息,我是直接Math.random
随机数向下取整,然后格式和他传参的格式相同,测了几次发现对于这个轨迹并没有强校验,洒洒水就过去了
这样的代码就可以得到下面的一串字符串了
然后我们在看接下来的一段
btoa(_0x570bef["gzip"](_0x261229, {"to": "string"}));
前面的btoa
之前已经分享过代码了,直接去知乎那篇文章抄一个就可以了
那_0x570bef["gzip"]
又应该怎么获取呢?
其实_0x570bef["gzip"]
也是扣就可以了,但是有可以直接偷懒的方法
先说我遇到的问题,这个问题知道的大佬麻烦给我说说
“我直接扣取的代码在
_0x570bef["gzip"]
的结果是个空串,但是我研究了一下应该不是我环境被检测了,直接在浏览器上也是没有办法获取到结果
花了半个小时研究了下问题,没整出来,我就直接偷懒了,因为是gzip
压缩算法,所以我直接套库计算了。
这个压缩算法 js 文件和简单还原的 js获取链接:https://pan.baidu.com/s/19w3bnXaxad_Ex6NdF9k6zQ 提取码:s73l
然后我写了一个zip
方法直接得到下面的加密字符串
function zip(str) {
var pako = require("./pako")
const binaryString = pako.gzip(encodeURIComponent(str), {to: 'string'})
return btoa(binaryString);
}
为了验证我们计算是否正确,直接带入脚本请求
完事~,以上就是今天的全部内容了,咱们下次再会~