声明:案例分析仅供学习交流使用,勿用于任何非法用途。如学习者进一步逆向并对版权方造成损失,请自行承担法律后果,本人概不负责。
点击验证码刷新,查看请求,会返回Base64形式的图片,其中 data 便是我们要分析的加密字段了。
data通用性太高了不好找,先在对刷新请求下断点,此时的data当然是已经加密好的。
代码混淆的厉害,从发起请求的地方没找到有用信息,根据调用栈向上摸排,沿着data的传入跟踪到此处,结果没有任何有用信息,也就是“跟丢了”。
重新细致跟踪调用栈,发现这里的p()函数对data的处理有点可疑,于是在入口下断。
从p()函数调用栈往上居然发现了构建data字段的端倪。
md5() 函数点进去看了下就是常规的MD5算法,不多赘述。bth() 函数如下,实际就是把一个字节数组转为Hex形式的字符串。那么data的生成方式就是——某字节数组转为Hex字符串之后再拼接字符串的MD5。
function bth(byte_arr) {
if (!isArray(byte_arr)) {
return false
}
;var hex_str = _$_480d[337], i, len, tmp_hex;
len = byte_arr[_$_480d[346]];
for (i = 0; i < len; ++i) {
if (byte_arr[i] < 0) {
byte_arr[i] = byte_arr[i] + 256
}
;tmp_hex = byte_arr[i][_$_480d[585]](16);
if (tmp_hex[_$_480d[346]] === 1) {
tmp_hex = _$_480d[1045] + tmp_hex //长度为1就补0
}
;hex_str += tmp_hex
}
;return hex_str[_$_480d[1705]]()
}
继续往上找传入字节数组,可以发现明文转密文的过程。这里简单来说就是用 ‘{“data”:{“item1”:“chrome78.0.3904.108”},“time”:1619516605269,“user”:""}’ (user是用户名,为空是因为我没输入)加密生成一个字节数组,即后面用来转Hex的字节数组。
再往上跟就能从 angular.js 中发现data在原程序的构建入口 yt(明文, 3, 完成回调function, null) :
简要概括其加密流程:
这里我就直接把源码中的 angular.js 和 VM11.js 拿出来用。如果要自己局部改写,需注意setTimeout(fn, 0)的执行规则,参考【https://www.cnblogs.com/gaojian0927/p/9722847.html】。
<!DOCTYPE html>
<hr />
<!-- 主要是加密算法相关量 -->
<script src="angular.js"></script>
<!-- 需要里面一些常量 -->
<script src="VM11.js"></script>
<script>
function bth(byte_arr) {
if (!Array.isArray(byte_arr)) {
return false
};
var hex_str = _$_480d[337],
i, len, tmp_hex;
len = byte_arr[_$_480d[346]];
for (i = 0; i < len; ++i) {
if (byte_arr[i] < 0) {
byte_arr[i] = byte_arr[i] + 256
};
tmp_hex = byte_arr[i][_$_480d[585]](16);
if (tmp_hex[_$_480d[346]] === 1) {
tmp_hex = _$_480d[1045] + tmp_hex
};
hex_str += tmp_hex
};
return hex_str[_$_480d[1705]]()
}
function md5(str) {
//... VM11.js中拿或者自己实现都行,这里省略 ...
}
let data = '{"data":{"item1":"chrome78.0.3904.108"},"time":1619516605269,"user":""}';
let cp = function(result) {
console.log(result);
var hex = bth(result);
console.log(hex);
var data = hex + md5(hex);
console.log(data);
}
myYt(data, 3, cp, null); //myYt() 只是用了个全局变量接受angular.js中 yt() 以扩大作用域
</script>
运行,可以和官方得到相同字段。