JavaScript逆向:某达网站的验证码刷新加密字段分析

声明:案例分析仅供学习交流使用,勿用于任何非法用途。如学习者进一步逆向并对版权方造成损失,请自行承担法律后果,本人概不负责。

点击验证码刷新,查看请求,会返回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>

运行,可以和官方得到相同字段。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值