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

本文深入剖析了一个网页验证码的加密过程,涉及到MD5算法和字节数组到十六进制字符串的转换。通过调试和代码分析,揭示了数据从明文到加密字符串的完整流程,包括数据构建、加密和拼接MD5等步骤,为理解加密机制提供了实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值