某度点选VMP逆向分析

底图解密

由于底图是乱序的。所以要先找到还原位置。

这里直接看插装日志

具体如何实现看一眼日志就知道了

1
this.q.A("arguments", n || []); ; )

C 函数解密

如下图

断点定位

继续

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
t.prototype.get = function(t) {
var e = this.g(t);
return e || (e = this.p(t),
this.m(t, e),
e)
}
,
t.prototype.set = function(t, e) {
var n = this.get(t);
if (!n)
throw new ReferenceError("".concat(t, " is not defined"));
n.set(e)
}


================================
t.prototype.set = function(t) {
if (2 === this.kind)
throw new TypeError("Assignment to constant variable");
this.value = t
}
,
t.prototype.get = function() {
return this.value
}

找到C的

简单看下流程

经过验证。可知 IV是固定。

key为动态值。

如图所值。 key 是分割而来 40位

分析得知为sha1。

===>

值由来如下图

然后经过一层 AES.

key为动态值,IV写死。

得到最终的 C值。

AES加密前的值为

===>

如下图所示

值为一个一个跳出。

可以看到

有个特殊值。 MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKL。应该是修改了base64的码表

经过分析。可知每次码表都不一样。

规则如下

这里我们先来了解下 何为base64,AI简单概括几句话

1、分组基础: Base64 将输入数据按每 3 个字节(共 24 位二进制)进行一组处理。

2、重新划分: 将这 24 位二进制流重新划分为 4 组,每组 6 位

3、查表映射: 每组 6 位(数值范围 $0-63$)作为索引,去查 Base64 专用的 64 字符表,得到一个可见字符。

4、数据比例: 最终,每 3 个输入字节对应 4 个输出字符,因此编码后的数据体积增大 $1/3$。

5、末尾填充: 如果输入数据不足 3 个字节,则在二进制末尾补零,并在 Base64 字符串末尾使用一个或两个 = 符号进行占位填充。

具体不多说了。

最后看结果。

页面也不校验,成功率也低。可以当个练练手的项目