前言

1
aHR0cHM6Ly93d3cuY25wY2JpZGRpbmcuY29tL2Ntcy9hcnRpY2xlL3BhZ2U=

1

1
数据加密了的,由于输入过验证码了这里没有弹出验证码

开始实战

1
打开堆栈点击这个

3

1
打上断点发现加密,从这里进去

4

1
加密部分,扣代码补全

5

6

1
解密的部分就在加密的下面(氵) 扣下代码缺啥补啥

7

JS

1
补全的部分环境 window = global;self = window;const JSEncrypt = require('jsencrypt');
js代码
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
window = global;
self = window
const JSEncrypt = require('jsencrypt');

data = {
"current": 1,
"size": 10,
"condition": {
"columnId": "1",
"title": "",
"projectType": ""
}
}
url = '/article/page'
var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64pad = "=";

var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";

function int2char(n) {
return BI_RM.charAt(n);
}

function hex2b64(h) {
var i;
var c;
var ret = "";
for (i = 0; i + 3 <= h.length; i += 3) {
c = parseInt(h.substring(i, i + 3), 16);
ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
}
if (i + 1 == h.length) {
c = parseInt(h.substring(i, i + 1), 16);
ret += b64map.charAt(c << 2);
} else if (i + 2 == h.length) {
c = parseInt(h.substring(i, i + 2), 16);
ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
}
while ((ret.length & 3) > 0) {
ret += b64pad;
}
return ret;
}

function b64tohex(s) {
var ret = "";
var i;
var k = 0;
// b64 state, 0-3
var slop = 0;
for (i = 0; i < s.length; ++i) {
if (s.charAt(i) == b64pad) {
break;
}
var v = b64map.indexOf(s.charAt(i));
if (v < 0) {
continue;
}
if (k == 0) {
ret += int2char(v >> 2);
slop = v & 3;
k = 1;
} else if (k == 1) {
ret += int2char((slop << 2) | (v >> 4));
slop = v & 0xf;
k = 2;
} else if (k == 2) {
ret += int2char(slop);
ret += int2char(v >> 2);
slop = v & 3;
k = 3;
} else {
ret += int2char((slop << 2) | (v >> 4));
ret += int2char(v & 0xf);
k = 0;
}
}
if (k == 1) {
ret += int2char(slop << 2);
}
return ret;
}

function Gets(data) {

datas = btoa(JSON.stringify(data))
var encryptor = new JSEncrypt()
encryptor.setPublicKey('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbZbsQC9T7f3kVaPShmN2b9yJK/FLVF3yuuYfyF7erOkRhRLex/aL3+IYRsp4p/WQeaBzD1ng2GyZbtqDrh4gL0srAWDOAyckc7FYA8Abj7EidFOfD3pi//XZyDm76AAf0eZGVeZxeACenzFb4uy1DYN1argQYyLlpz6EiK4h/4QIDAQAB')
JSEncrypt.prototype.encryptLong = function (str) {

var encrypted = this.getKey().encryptLong(str) || "";
var uncrypted = this.getKey().decryptLong(encrypted) || "";
var count = 0;
var reg = /null$/g;
while (reg.test(uncrypted)) {
// 如果加密出错,重新加密
count++;
encrypted = this.getKey().encryptLong(str) || "";
uncrypted = this.getKey().decryptLong(encrypted) || "";
// console.log('加密出错次数', count)
if (count > 10) {
// 重复加密不能大于10次
// console.log('加密次数过多')
break;
}
}
return encrypted;

}
encryptor.encryptLong = function (text) {
var _this = this.getKey();//之前的this指向this.getKey() 需要修改
var maxLength = ((_this.n.bitLength() + 7) >> 3) - 11;

var ct_1 = "";
if (text.length > maxLength) {
var lt = text.match(/.{1,117}/g);
lt.forEach(function (entry) {
var t1 = _this.encrypt(entry);
ct_1 += t1;
});
return hex2b64(ct_1);
}
var t = _this.encrypt(text);
var y = hex2b64(t);
return y;

}
param = encryptor.encryptLong(JSON.stringify(datas))
return param

}

console.log(Gets(data))

//----------------------------------------------------------------------------//
function base64Toutf8(base64Str) {
const binaryStr = atob(base64Str)
const bytes = new Uint8Array(binaryStr.length);
for (let i = 0; i < binaryStr.length; i++) {
bytes[i] = binaryStr.charCodeAt(i);
}
return new TextDecoder('utf-8').decode(bytes);
}
//第一次请求的密文
res = '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'
function Getc(res) {
var encryptorJm = new JSEncrypt()
encryptorJm.setPrivateKey('MIICcwIBADANBgkqhkiG9w0BAQEFAASCAl0wggJZAgEAAoGBAKNPhik2mThtSgOF6YoW2NKm2LRHSiMRPP8Bgl5E7wVSbkwdyIgSgu6djKhxFKzz8wXw++xJLh+is4lvD0tSkc3Z8Bro6s/6SXQTptnCKKppTWZs3pTLiD3ewKtZXTUFHHCx/x3Mb6DhoHKYqu5D0cwmkLf9IBFrxo7QQF2nzg1XAgMBAAECf1+wOOvtEdn+L1/hFvXSbTkAifkXzFi/wP2p5LlXqrVzly0CRn10W0N1DPWlTHgKeFsC2JmaR2xB6PCeIlgACW2knLbcXYIxb1AD0tMYgXpgxNB+SL/nL+1s+Mr1VKrI8DRASfe1+thl76MPmYXS0KywJ2W5/Uy9xMiAXREFRrECQQDQftVHOzy2/Dk3EjpbFY/SFpWUZWEKh+6Q5IoL76abgSnlMmNvIrvkQZ9MmlZ0Kfwl6rj1Eud4Fr9r59ElyzJ7AkEAyIUkZdEUBEBrll/9aDer2w876xQYIK6t1NvB2SntydpxJLR2GR+SbK1Fph1ADITUQ4BNvgEsHjyRfbIIcFwX1QJAFXBlV/zEYoCPFZWfQIx4DH9cBDVkhCO0KVwGwfFzrVvbxgCnbt8gePkyezsHlsxWbEO1nyXBfXzBVEQzInLBjwJAVq0+24gyF9hk6T6bAna2Id4G74njGBWJ7K4FsEKwmAWFzPD478k2+SU5KyIPspmkS31lnZFSKcvStDvF7BPS9QJANWWlMeBK4prlV4AfIVV9T61LqwYIInewniOJ44QdIkpQ47llMvgKBqyCIRu04WDYXYlew33tFrNdDScP1ImS6g== ')
JSEncrypt.prototype.decryptLong = function (str) {
try {
return this.getKey().decryptLong(str);
} catch (ex) {
return false;
}
};
encryptorJm.decryptLong = function (text) {
var _this = this.getKey();
var maxLength = (_this.n.bitLength() + 7) >> 3;
text = b64tohex(text);
try {
if (text.length > maxLength) {
var ct_2 = "";
var lt = text.match(/.{1,256}/g);
// 128位解密。取256位
lt.forEach(function (entry) {
var t1 = _this.decrypt(entry);
ct_2 += t1;
});
return ct_2;
}
var y = _this.decrypt(text);
return y;
} catch (ex) {
return false;
}
}
var result = encryptorJm.decryptLong(res)
const ResultData = base64Toutf8(result).toString('utf8');
const ele = JSON.parse(ResultData)
return ele
}
console.log(Getc(res))
1
运行结果,差不多了嗯对的。python验证码需要识别过一下

js