马上爬7-9题

7-9题

7、中等题1

同理抓包分析,得出加密值在headers和url中都有,分别为M、Ts、x

image-20260111114432899

直接打上xhr断点

image-20260111114738255

向上找堆栈,发现此处很像,断点

image-20260111114906057

image-20260111115010105

此处就是加密点

加密函数分析

值O: O = window['eeee'](W['QCqSI'](yK(0x2eb, 'nti]'), M))

根据32的长度大致判断为MD5加密

image-20260111115745272

固定值分别为xialuo和时间戳,用MD5加密测试一下,一致

image-20260111115846205

image-20260111115855399

值M为时间戳

最后分析x的值W['uSzcs'](encodeURIComponent, dd['a'][yp(0x231, '3@lG')](W[yp(0x197, '@Q0o')](O, W['KjfHo'])))

image-20260111121123302

W[yp(0x197, '@Q0o')]实际为拼接函数

image-20260111121227223

yp(0x231, '3@lG')为SHA256,大致分析为SHA256加密

image-20260111121441893

image-20260111121451336

一致。此处忽略了一个解密函数,此函数和第六题的AES解密一致可以直接用。如果你需要找到解密点的话,从发送请求完成开始,一直向下执行

image-20260111131414792

断点后一直往下走

image-20260111131833001

可以看到解密函数

image-20260111131852831

再次进去可以看到和第六题解密函数一致

image-20260111131933644

image-20260111150331372

8、中等题2

抓包分析

image-20260111132113485

加密点为headers和cookie

T应该是base64,测试为时间戳base64加密

image-20260111132152973

接下来分析cookie中加密值的生成,直接hook cookie找到cookie的赋值点

image-20260111133129731

image-20260111133135769

cookie赋值为_0x56df28['\x47\x51\x5a\x65\x44'](_0x56df28['\x49\x6c\x43\x47\x79'](_0x56df28['\x47\x51\x5a\x65\x44'](xms, _0x56df28['\x56\x51\x55\x70\x5a'](OOOoO, Sms + _0x1167c7)), Ras), u)

实际上就为_0x56df28['\x56\x51\x55\x70\x5a'](OOOoO, Sms + _0x1167c7)

image-20260111133351425Sms值为xoxoxoxo

_0x1167c7值为时间戳

查看_0x56df28['\x56\x51\x55\x70\x5a']函数得知,加密函数最后为OOOoO(Sms + _0x1167c7)

image-20260111133559192

image-20260111133651506

直接进入此函数,扣代码,然后缺啥补啥

扣代码的步骤不展示了,基本没有难点,注意一个地方就行

image-20260111142104860

补完_0x4958ae,a0_0x4366后还是此值还是有问题

image-20260111142152870

image-20260111142220100

但是这个值是固定的,判断应该是在某个地方进行了修改,全局搜索,刚开始就进行了偏移

image-20260111142318289

扣完函数后浏览器对比一致

image-20260111142343138

image-20260111142348201

回到第一次断点的位置,分析第三个值headers[‘m’]

_0x56df28['\x4b\x54\x52\x5a\x6c'](OOOoOo, _0x56df28[_0xe8dc6(0x2a4)](_0x56df28['\x47\x7a\x66\x41\x58'](_0x1575b7, _0x1167c7), _0x416a83[Has][gas]), _0x1575b7)

_0x1575b7值为oooooo

_0x1167c7值为时间戳

_0x416a83[Has][gas]值为 页码

_0x56df28[_0xe8dc6(0x2a4)]函数为相加函数

函数实际为:OOOoOo(("oooooo" + 时间戳 + page), "oooooo")

image-20260111143837994

扣完执行:

image-20260111144223252

一致

image-20260111150112296

9、中等题3

同理抓包,加密点在请求参数上

image-20260111175832934

tt为base64加密的时间戳

通过堆栈断点的方法确定加密点

image-20260111175931186
image-20260111180017831

此时已经有了值,说明,加密点在之前

image-20260111180103639

从开始单步执行,找到加密点

image-20260111180320155

混淆过的代码,可以看到执行流程和结果

image-20260111180400265

当然,也能直接hook m的生成

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
(function () {
const _open = XMLHttpRequest.prototype.open;
const _send = XMLHttpRequest.prototype.send;

XMLHttpRequest.prototype.open = function (method, url) {
this._method = method;
this._url = url;
return _open.apply(this, arguments);
};

XMLHttpRequest.prototype.send = function (body) {
try {
if (this._method && this._method.toUpperCase() === 'POST' && body) {

// string
if (typeof body === 'string') {
if (body.includes('"m"') || body.includes('m=')) {
console.log('[xhr POST body]', body);

try {
const json = JSON.parse(body);
if (json.m !== undefined) {
console.log('[xhr m]', json.m);
debugger;
}
} catch (e) {
const params = new URLSearchParams(body);
if (params.has('m')) {
console.log('[xhr m]', params.get('m'));
debugger;
}
}
}
}

// FormData
if (body instanceof FormData && body.has('m')) {
console.log('[xhr m]', body.get('m'));
debugger;
}

// URLSearchParams
if (body instanceof URLSearchParams && body.has('m')) {
console.log('[xhr m]', body.get('m'));
debugger;
}
}
} catch (e) {}

return _send.apply(this, arguments);
};
})();

hook后同样找到m的生成位置

image-20260111180957647

恢复case的执行流程

1
2
3
4
var f = (new Date)[r(2244)]();
n.data.m = t.MqmaW(c, t[r(1881)](t[r(489)], f))
n[r(1939)].tt = btoa(f)
n[r(1939)] = JSON[r(827)](n.data);

实际有用的代码是这些,简单来说就是f为时间戳,tt为base64(时间戳),m=c(‘9527’ + 时间戳)

最重要的是c函数,好像是一个HmacSHA1加密

image-20260111182054755

image-20260111182312576

image-20260111182319339

比对一致

直接在js中实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const CryptoJS = require('crypto-js');

function c(n) {
return CryptoJS.HmacSHA1(n, "xxxooo").toString();
}

function get_data(timestamp, base64_timestamp) {
let m = c('9527' + timestamp);
let tt = base64_timestamp;
return {
'f': timestamp,
'm': m,
'tt': tt
}
}

console.log(get_data('1768124512981', 'MTc2ODEyNDUxMjk4MQ=='));

image-20260111182621552

结果一致

image-20260111183336636

更多内容也在公众号更新:码字的秃猴

tuhou