某店登陆加密参数 UA 加密逻辑分析
## 今日网站aHR0cHM6Ly9kLndlaWRpYW4uY29tL3dlaWRpYW4tcGMvbG9naW4vIy8=
有两周没有更新,赶紧更新一波,希望不要像上次的视频一样浏览量翻车。
### 加密定位
输入账号密码,点击登陆,可以看到下面的请求
![](https://tc.xianyucoder.cn/blog20210908155601.png)
我们需要分析的参数是`ua`这个参数
直接通过`Initiator`第一个的位置先打上断点
![](https://tc.xianyucoder.cn/blog20210908160228.png)
重新提交一下,这个时候就会断住了
![](https://tc.xianyucoder.cn/blog20210908160518.png)
红框里的`e`里面已经包含了生成好的`ua`了
所以继续往上一层堆栈查找,直到下面这个位置
![](https://tc.xianyucoder.cn/blog20210908161103.png)
![](https://tc.xianyucoder.cn/blog20210908161049.png)
可以看到`i`是由`window.getUa()`生成的
![](https://tc.xianyucoder.cn/blog20210908161147.png)
所以这个时候就只要把`window.getUa()`的逻辑搞出来就可以了
### 加密分析
![](https://tc.xianyucoder.cn/blog20210908161249.png)
跟进去看到的是 ob 混淆
![](https://tc.xianyucoder.cn/blog20210908161635.png)
![](https://tc.xianyucoder.cn/blog20210908161923.png)
这个 ob 比较简单,不用还原也可以分析这个加密,简单反混淆一下去掉类似`_0x4651('0x440')`这样的代码
通过上面的截图可以看到`window.getUa()`的逻辑是下面这一串
```js
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`,所以只要这个值相关的逻辑就可以了
```js
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`
![](https://tc.xianyucoder.cn/blog20210909093716.png)
这里面的参数是当前的环境参数,这里面包含了的系统字体,屏幕参数,电池状态,header、Navigtor等一系列的参数
![](https://tc.xianyucoder.cn/blog20210909095023.png)
其次是`_0x420004`
![](https://tc.xianyucoder.cn/blog20210909095058.png)
这里记录了鼠标数据,以及点击的数据
![](https://tc.xianyucoder.cn/blog20210909100607.png)
![](https://tc.xianyucoder.cn/blog20210909100641.png)
现在需要将上面的逻辑移到 node 中,这个比较简单
先扣`_0x1722c3`,这个函数非常简单,因为这个方法的代码就是一个个小方法体组成的直接一块块粘贴下来就行了
然后就是`_0x2e98dd`和`_0x420004`这两个参数,第一个环境信息可以直接复制写死就行了,因为很多他并没有强校验这个参数的逻辑,很多获取的都是一些共有的属性。
第二个`_0x420004`这个参数是获取的鼠标轨迹信息,我是直接`Math.random`随机数向下取整,然后格式和他传参的格式相同,测了几次发现对于这个轨迹并没有强校验,洒洒水就过去了
这样的代码就可以得到下面的一串字符串了
![](https://tc.xianyucoder.cn/blog20210909205025.png)
然后我们在看接下来的一段
```bash
btoa(_0x570bef["gzip"](_0x261229, {"to": "string"}));
```
前面的`btoa`之前已经分享过代码了,直接去知乎那篇文章抄一个就可以了
那`_0x570bef["gzip"]`又应该怎么获取呢?
其实`_0x570bef["gzip"]`也是扣就可以了,但是有可以直接偷懒的方法
因为是`gzip`压缩算法,所以我直接套库计算,不费工夫去扣代码了
这个文件我等会放到云盘
链接:https://pan.baidu.com/s/1v6FaDWP2sGdjWbRAcpfu-g
提取码:l2fi
获取压缩算法 js 文件和简单还原的 js
然后我写了一个`zip`方法直接得到下面的加密字符串
```js
function zip(str) {
var pako = require("./pako")
const binaryString = pako.gzip(encodeURIComponent(str), {to: 'string'})
return btoa(binaryString);
}
```
![](https://tc.xianyucoder.cn/blog20210909205827.png)
为了验证我们计算是否正确,直接带入脚本请求
![](https://tc.xianyucoder.cn/blog20210909205914.png)
完事~,以上就是今天的全部内容了,咱们下次再会~ tb的getUa也分析下? moda 发表于 2021-9-13 09:58
都不知道有啥好分析的,看到H4sIAAAAA就知道是压缩后base64编码
好吧 大佬还是厉害 通过加密结果知道加密内容 好厉害的,牛人 都不知道有啥好分析的,看到H4sIAAAAA就知道是压缩后base64编码 不错不错,收藏了 mosou 发表于 2021-9-13 09:49
tb的getUa也分析下?
下次一定 厉害了!厉害了!厉害了!{:1_893:} {:1_937:}压缩包密码多少啊老大 trynewdream 发表于 2021-9-13 11:56
压缩包密码多少啊老大
解压密码是 yyds