某盾滑块验证:从0到1,逐步分析 (图片还原、轨迹模拟)
本帖最后由 xiaopacai888 于 2024-2-22 14:45 编辑某盾滑块验证:从0到1,逐步分析 (图片还原、轨迹模拟)
一、目标网址:aHR0cHM6Ly9zZWMueGlhb2R1bi5jb20vb25saW5lRXhwZXJpZW5jZS9zbGlkaW5nUHV6emxl
二、接口分析
三、构建第一个接口请求------>获取滑块图片
1、对p1-p9参数逐个分析,还原
2、上面已经把所有的请求参数分析还原出来了,下面整理构造一个方法,方便python调用即可
// 完整的js代码
const Crypto = require('crypto-js');
token = 'tongdun' + '-' + new Date().getTime() + '-' + Math.random().toString(16).substr(2);
oOoQQ0 = 'b37uCyfyme4S7TF/MVDRqSRxP4CB2BjsnDxr4bSxz0vSL/~hXNGID9Tr7vzaBm~F'
var oQO0Q0 = (oOoQQ0 || '|') + '^^' + (token || '|') + '^^' + ('tongdun' || '|') + '^^' + ('x_tongdun2_web' || '|');
oQO0Q0 = oQO0Q0 + '';
var OoOQ0O = ('nWPHb170847576679YyhGqayf0' || '|') + '^^' + 1 + '^^' + 1 + '^^' + 1;
function QQ00QO(oQQ0Qo) {
var QQoooQ = '';
for (var ooQOQO = 0; ooQOQO < oQQ0Qo.length; ooQOQO++) {
var QOoOOO = oQQ0Qo.charCodeAt(ooQOQO);
if (QOoOOO >= 97 && QOoOOO <= 122) {
if (QOoOOO == 97) {
QOoOOO = 123;
}
;QQoooQ += String.fromCharCode(QOoOOO - 1);
} else {
QQoooQ += oQQ0Qo;
}
}
return QQoooQ;
}
// 目测AES加密
var OQoQ0o = function(oQQ0Qo, QQoooQ) {
// oOQoo0(); 这里是环境监测,可以注释掉不执行
var OOo0OQ = OOo0OQ || function(QOQ0Qo, OQOO0Q) {
var ooQOQO = {};
var QOoOOO = ooQOQO.lib = {};
var ooooOO = QOoOOO.Base = function() {
function OO00oO() {}
return {
tp: function(oQQ0Qo) {
OO00oO.prototype = this;
var oOoQO0 = new OO00oO();
if (oQQ0Qo) {
oOoQO0.Gv(oQQ0Qo);
}
if (!oOoQO0.hasOwnProperty('fE')) {
oOoQO0.fE = function() {
oOoQO0.$super.fE.apply(this, arguments);
}
;
}
oOoQO0.fE.prototype = oOoQO0;
oOoQO0.$super = this;
return oOoQO0;
},
xA: function() {
var oQQ0Qo = this.tp();
oQQ0Qo.fE.apply(oQQ0Qo, arguments);
return oQQ0Qo;
},
fE: function() {},
Gv: function(oQQ0Qo) {
for (var QQoooQ in oQQ0Qo) {
if (oQQ0Qo.hasOwnProperty(QQoooQ)) {
this = oQQ0Qo;
}
}
if (oQQ0Qo.hasOwnProperty(QQ00QO('upSusjoh'))) {
this.fF = oQQ0Qo.fF;
}
},
yH: function() {
return this.fE.prototype.tp(this);
}
};
}();
var QOoOQO = QOoOOO.WordArray = ooooOO.tp({
fE: function(oQQ0Qo, QQoooQ) {
oQQ0Qo = this.words = oQQ0Qo || [];
if (QQoooQ != OQOO0Q) {
this.sigBytes = QQoooQ;
} else {
this.sigBytes = oQQ0Qo.length * 4;
}
},
fF: function(oQQ0Qo) {
return (oQQ0Qo || Qoo0QO).fe(this);
},
Fj: function(oQQ0Qo) {
var QQoooQ = this.words;
var ooQOQO = oQQ0Qo.words;
var QOoOOO = this.sigBytes;
var oQO0Q0 = oQQ0Qo.sigBytes;
this.mb();
if (QOoOOO % 4) {
for (var OoOQ0O = 0; OoOQ0O < oQO0Q0; OoOQ0O++) {
var oOOoQO = ooQOQO >>> 24 - OoOQ0O % 4 * 8 & 255;
QQoooQ |= oOOoQO << 24 - (QOoOOO + OoOQ0O) % 4 * 8;
}
} else {
for (var OoOQ0O = 0; OoOQ0O < oQO0Q0; OoOQ0O += 4) {
QQoooQ = ooQOQO;
}
}
this.sigBytes += oQO0Q0;
return this;
},
mb: function() {
var oQQ0Qo = this.words;
var QQoooQ = this.sigBytes;
oQQ0Qo &= 4294967295 << 32 - QQoooQ % 4 * 8;
oQQ0Qo.length = QOQ0Qo.ceil(QQoooQ / 4);
},
yH: function() {
var oQQ0Qo = ooooOO.yH.call(this);
oQQ0Qo.words = this.words.slice(0);
return oQQ0Qo;
},
Bu: function(oQQ0Qo) {
var QQoooQ = [];
var ooQOQO = function(oOoQoQ) {
var oOoQoQ = oOoQoQ;
var QooOoO = 987654321;
var OoO00O = 4294967295;
return function() {
QooOoO = 36969 * (QooOoO & 65535) + (QooOoO >> 16) & OoO00O;
oOoQoQ = 18000 * (oOoQoQ & 65535) + (oOoQoQ >> 16) & OoO00O;
var oQQ0Qo = (QooOoO << 16) + oOoQoQ & OoO00O;
oQQ0Qo /= 4294967296;
oQQ0Qo += 0.5;
return oQQ0Qo * (QOQ0Qo.Bu() > 0.5 ? 1 : -1);
}
;
};
for (var QOoOOO = 0, oQO0Q0; QOoOOO < oQQ0Qo; QOoOOO += 4) {
var OoOQ0O = ooQOQO((oQO0Q0 || QOQ0Qo.Bu()) * 4294967296);
oQO0Q0 = OoOQ0O() * 987654071;
QQoooQ.push(OoOQ0O() * 4294967296 | 0);
}
return new QOoOQO.fE(QQoooQ,oQQ0Qo);
}
});
var oOOoQO = ooQOQO.enc = {};
var Qoo0QO = oOOoQO.Hex = {
fe: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.words;
var ooQOQO = oQQ0Qo.sigBytes;
var QOoOOO = [];
for (var oQO0Q0 = 0; oQO0Q0 < ooQOQO; oQO0Q0++) {
var OoOQ0O = QQoooQ >>> 24 - oQO0Q0 % 4 * 8 & 255;
QOoOOO.push((OoOQ0O >>> 4).fF(16));
QOoOOO.push((OoOQ0O & 15).fF(16));
}
return QOoOOO.join('');
},
ty: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.length;
var ooQOQO = [];
for (var QOoOOO = 0; QOoOOO < QQoooQ; QOoOOO += 2) {
ooQOQO |= parseInt(oQQ0Qo.substr(QOoOOO, 2), 16) << 24 - QOoOOO % 8 * 4;
}
return new QOoOQO.fE(ooQOQO,QQoooQ / 2);
}
};
var QooooQ = oOOoQO.Latin1 = {
fe: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.words;
var ooQOQO = oQQ0Qo.sigBytes;
var QOoOOO = [];
for (var oQO0Q0 = 0; oQO0Q0 < ooQOQO; oQO0Q0++) {
var OoOQ0O = QQoooQ >>> 24 - oQO0Q0 % 4 * 8 & 255;
QOoOOO.push(String.fromCharCode(OoOQ0O));
}
return QOoOOO.join('');
},
ty: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.length;
var ooQOQO = [];
for (var QOoOOO = 0; QOoOOO < QQoooQ; QOoOOO++) {
ooQOQO |= (oQQ0Qo.charCodeAt(QOoOOO) & 255) << 24 - QOoOOO % 4 * 8;
}
return new QOoOQO.fE(ooQOQO,QQoooQ);
}
};
var QO0Qo0 = oOOoQO.Utf8 = {
fe: function(oQQ0Qo) {
try {
return decodeURIComponent(escape(QooooQ.fe(oQQ0Qo)));
} catch (e) {
throw new Error(QQ00QO('Mbmgpsnfe UTF-8 ebub'));
}
},
ty: function(oQQ0Qo) {
return QooooQ.ty(unescape(encodeURIComponent(oQQ0Qo)));
}
};
var OOOOQo = QOoOOO.BufferedBlockAlgorithm = ooooOO.tp({
gK: function() {
this._data = new QOoOQO.fE();
this._nDataBytes = 0;
},
KF: function(oQQ0Qo) {
if (typeof oQQ0Qo == QQ00QO('tusjoh')) {
oQQ0Qo = QO0Qo0.ty(oQQ0Qo);
}
this._data.Fj(oQQ0Qo);
this._nDataBytes += oQQ0Qo.sigBytes;
},
Pu: function(oQQ0Qo) {
var QQoooQ = this._data;
var ooQOQO = QQoooQ.words;
var QOoOOO = QQoooQ.sigBytes;
var oQO0Q0 = this.Lr;
var OoOQ0O = oQO0Q0 * 4;
var oOOoQO = QOoOOO / OoOQ0O;
if (oQQ0Qo) {
oOOoQO = QOQ0Qo.ceil(oOOoQO);
} else {
oOOoQO = QOQ0Qo.max((oOOoQO | 0) - this.eL, 0);
}
var ooQQ0Q = oOOoQO * oQO0Q0;
var QOo0Oo = QOQ0Qo.min(ooQQ0Q * 4, QOoOOO);
if (ooQQ0Q) {
for (var OOOQOQ = 0; OOOQOQ < ooQQ0Q; OOOQOQ += oQO0Q0) {
this.zH(ooQOQO, OOOQOQ);
}
var QoQQo0 = ooQOQO.splice(0, ooQQ0Q);
QQoooQ.sigBytes -= QOo0Oo;
}
return new QOoOQO.fE(QoQQo0,QOo0Oo);
},
yH: function() {
var oQQ0Qo = ooooOO.yH.call(this);
oQQ0Qo._data = this._data.yH();
return oQQ0Qo;
},
eL: 0
});
var QQQOQO = QOoOOO.Hasher = OOOOQo.tp({
uu: ooooOO.tp(),
fE: function(oQQ0Qo) {
this.uu = this.uu.tp(oQQ0Qo);
this.gK();
},
gK: function() {
OOOOQo.gK.call(this);
this.fP();
},
Hu: function(oQQ0Qo) {
this.KF(oQQ0Qo);
this.Pu();
return this;
},
ds: function(oQQ0Qo) {
if (oQQ0Qo) {
this.KF(oQQ0Qo);
}
var QQoooQ = this.fz();
return QQoooQ;
},
Lr: 512 / 32,
tq: function(OQ0OQ0) {
return function(oQQ0Qo, QQoooQ) {
return new OQ0OQ0.fE(QQoooQ).ds(oQQ0Qo);
}
;
},
Jf: function(OQ0OQ0) {
return function(oQQ0Qo, QQoooQ) {
return new OQ0O00.HMAC.fE(OQ0OQ0,QQoooQ).ds(oQQ0Qo);
}
;
}
});
var OQ0O00 = ooQOQO.algo = {};
return ooQOQO;
}(Math);
(function() {
var oQQ0Qo = OOo0OQ;
var QQoooQ = oQQ0Qo.lib;
var QOoOQO = QQoooQ.WordArray;
var QOoOOO = oQQ0Qo.enc;
var oQO0Q0 = QOoOOO.Base64 = {
fe: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.words;
var ooQOQO = oQQ0Qo.sigBytes;
var QOoOOO = this.Ky;
oQQ0Qo.mb();
var oQO0Q0 = [];
for (var OoOQ0O = 0; OoOQ0O < ooQOQO; OoOQ0O += 3) {
var oOOoQO = QQoooQ >>> 24 - OoOQ0O % 4 * 8 & 255;
var ooQQ0Q = QQoooQ >>> 24 - (OoOQ0O + 1) % 4 * 8 & 255;
var QOo0Oo = QQoooQ >>> 24 - (OoOQ0O + 2) % 4 * 8 & 255;
var OOOQOQ = oOOoQO << 16 | ooQQ0Q << 8 | QOo0Oo;
for (var QoQQo0 = 0; QoQQo0 < 4 && OoOQ0O + QoQQo0 * 0.75 < ooQOQO; QoQQo0++) {
oQO0Q0.push(QOoOOO.charAt(OOOQOQ >>> 6 * (3 - QoQQo0) & 63));
}
}
var QQQOQO = QOoOOO.charAt(64);
if (QQQOQO) {
while (oQO0Q0.length % 4) {
oQO0Q0.push(QQQOQO);
}
}
return oQO0Q0.join('');
},
ty: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.length;
var ooQOQO = this.Ky;
var QOoOOO = ooQOQO.charAt(64);
if (QOoOOO) {
var oQO0Q0 = oQQ0Qo.indexOf(QOoOOO);
if (oQO0Q0 != -1) {
QQoooQ = oQO0Q0;
}
}
var OoOQ0O = [];
var oOOoQO = 0;
for (var ooQQ0Q = 0; ooQQ0Q < QQoooQ; ooQQ0Q++) {
if (ooQQ0Q % 4) {
var QOo0Oo = ooQOQO.indexOf(oQQ0Qo.charAt(ooQQ0Q - 1)) << ooQQ0Q % 4 * 2;
var OOOQOQ = ooQOQO.indexOf(oQQ0Qo.charAt(ooQQ0Q)) >>> 6 - ooQQ0Q % 4 * 2;
var QoQQo0 = QOo0Oo | OOOQOQ;
OoOQ0O |= QoQQo0 << 24 - oOOoQO % 4 * 8;
oOOoQO++;
}
}
return QOoOQO.xA(OoOQ0O, oOOoQO);
},
Ky: 'abcdefghijklmnoqprstuvwxyzABCDEFGHJIKLMNOPQRSTUVWXYZ0123456789' + '~' + '/='
};
}());
OOo0OQ.lib.Cipher || function(OQOO0Q) {
var QQoooQ = OOo0OQ;
var ooQOQO = QQoooQ.lib;
var QOoOOO = ooQOQO.Base;
var QOoOQO = ooQOQO.WordArray;
var OOOOQo = ooQOQO.BufferedBlockAlgorithm;
var oOOoQO = QQoooQ.enc;
var ooQQ0Q = oOOoQO.Utf8;
var OOoo0Q = oOOoQO.Base64;
var OOOQOQ = QQoooQ.algo;
var O0O0o0 = OOOQOQ.EvpKDF;
var oOOoQo = ooQOQO.Cipher = OOOOQo.tp({
uu: QOoOOO.tp(),
Jr: function(oQQ0Qo, QQoooQ) {
return this.xA(this.Gj, oQQ0Qo, QQoooQ);
},
ch: function(oQQ0Qo, QQoooQ) {
return this.xA(this.zm, oQQ0Qo, QQoooQ);
},
fE: function(oQQ0Qo, QQoooQ, ooQOQO) {
this.uu = this.uu.tp(ooQOQO);
this._xformMode = oQQ0Qo;
this._key = QQoooQ;
this.gK();
},
gK: function() {
OOOOQo.gK.call(this);
this.fP();
},
ux: function(oQQ0Qo) {
this.KF(oQQ0Qo);
return this.Pu();
},
ds: function(oQQ0Qo) {
if (oQQ0Qo) {
this.KF(oQQ0Qo);
}
var QQoooQ = this.fz();
return QQoooQ;
},
Jv: 128 / 32,
lk: 128 / 32,
Gj: 1,
zm: 2,
tq: function() {
function QoOOOo(oQQ0Qo) {
if (typeof oQQ0Qo == QQ00QO('tusjoh')) {
return oOQQ0o;
} else {
return OQoo0o;
}
}
return function(oQO0OQ) {
return {
jq: function(oQQ0Qo, QQoooQ, ooQOQO) {
return QoOOOo(QQoooQ).jq(oQO0OQ, oQQ0Qo, QQoooQ, ooQOQO);
},
qm: function(oQQ0Qo, QQoooQ, ooQOQO) {
return QoOOOo(QQoooQ).qm(oQO0OQ, oQQ0Qo, QQoooQ, ooQOQO);
}
};
}
;
}()
});
var QOQQO0 = ooQOQO.StreamCipher = oOOoQo.tp({
fz: function() {
var oQQ0Qo = this.Pu(!!QQ00QO('gmvti'));
return oQQ0Qo;
},
Lr: 1
});
var Qoo0Q0 = QQoooQ.ed = {};
var ooQ00Q = ooQOQO.BlockCipherMode = QOoOOO.tp({
Jr: function(oQQ0Qo, QQoooQ) {
return this.Encryptor.xA(oQQ0Qo, QQoooQ);
},
ch: function(oQQ0Qo, QQoooQ) {
return this.Decryptor.xA(oQQ0Qo, QQoooQ);
},
fE: function(oQQ0Qo, QQoooQ) {
this._cipher = oQQ0Qo;
this._iv = QQoooQ;
}
});
var oOOOoo = Qoo0Q0.PD = function() {
var oQQ0Qo = ooQ00Q.tp();
oQQ0Qo.Encryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
var ooQOQO = this._cipher;
var QOoOOO = ooQOQO.Lr;
oQo0OQ.call(this, oQQ0Qo, QQoooQ, QOoOOO);
ooQOQO.Bc(oQQ0Qo, QQoooQ);
this._prevBlock = oQQ0Qo.slice(QQoooQ, QQoooQ + QOoOOO);
}
});
oQQ0Qo.Decryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
var ooQOQO = this._cipher;
var QOoOOO = ooQOQO.Lr;
var oQO0Q0 = oQQ0Qo.slice(QQoooQ, QQoooQ + QOoOOO);
ooQOQO.hx(oQQ0Qo, QQoooQ);
oQo0OQ.call(this, oQQ0Qo, QQoooQ, QOoOOO);
this._prevBlock = oQO0Q0;
}
});
function oQo0OQ(oQQ0Qo, QQoooQ, ooQOQO) {
var QOoOOO = this._iv;
if (QOoOOO) {
var oQO0Q0 = QOoOOO;
this._iv = OQOO0Q;
} else {
var oQO0Q0 = this._prevBlock;
}
for (var oOOoQO = 0; oOOoQO < ooQOQO; oOOoQO++) {
oQQ0Qo ^= oQO0Q0;
}
}
return oQQ0Qo;
}();
var QoOO00 = QQoooQ.mP = {};
var OO0OO0 = QoOO00.lJ = {
mP: function(oQQ0Qo, QQoooQ) {
var ooQOQO = QQoooQ * 4;
var QOoOOO = ooQOQO - oQQ0Qo.sigBytes % ooQOQO;
var oQO0Q0 = QOoOOO << 24 | QOoOOO << 16 | QOoOOO << 8 | QOoOOO;
var OoOQ0O = [];
for (var oOOoQO = 0; oOOoQO < QOoOOO; oOOoQO += 4) {
OoOQ0O.push(oQO0Q0);
}
var ooQQ0Q = QOoOQO.xA(OoOQ0O, QOoOOO);
oQQ0Qo.Fj(ooQQ0Q);
},
xq: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.words & 255;
oQQ0Qo.sigBytes -= QQoooQ;
}
};
var OO00QQ = ooQOQO.BlockCipher = oOOoQo.tp({
uu: oOOoQo.uu.tp({
ed: oOOOoo,
HL: OO0OO0
}),
gK: function() {
oOOoQo.gK.call(this);
var oQQ0Qo = this.uu;
var QQoooQ = oQQ0Qo.jh;
var ooQOQO = oQQ0Qo.ed;
if (this._xformMode == this.Gj) {
var QOoOOO = ooQOQO.Jr;
} else {
var QOoOOO = ooQOQO.ch;
this.eL = 1;
}
this._mode = QOoOOO.call(ooQOQO, this, QQoooQ && QQoooQ.words);
},
zH: function(oQQ0Qo, QQoooQ) {
this._mode.yr(oQQ0Qo, QQoooQ);
},
fz: function() {
var oQQ0Qo = this.uu.HL;
if (this._xformMode == this.Gj) {
oQQ0Qo.mP(this._data, this.Lr);
var QQoooQ = this.Pu(!!QQ00QO('gmvti'));
} else {
var QQoooQ = this.Pu(!!QQ00QO('gmvti'));
oQQ0Qo.xq(QQoooQ);
}
return QQoooQ;
},
Lr: 128 / 32
});
var OOQOOQ = ooQOQO.CipherParams = QOoOOO.tp({
fE: function(oQQ0Qo) {
this.Gv(oQQ0Qo);
},
fF: function(oQQ0Qo) {
return (oQQ0Qo || this.yD).fe(this);
}
});
var o000oQ = QQoooQ.yJ = {};
var oQo0Qo = o000oQ.OpenSSL = {
fe: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.lm;
var ooQOQO = oQQ0Qo.MB;
if (ooQOQO) {
var QOoOOO = QOoOQO.xA().Fj(ooQOQO).Fj(QQoooQ);
} else {
var QOoOOO = QQoooQ;
}
return QOoOOO.fF(OOoo0Q);
},
ty: function(oQQ0Qo) {
var QQoooQ = OOoo0Q.ty(oQQ0Qo);
var ooQOQO = QQoooQ.words;
if (ooQOQO == 1398893684 && ooQOQO == 1701076831) {
var QOoOOO = QOoOQO.xA(ooQOQO.slice(2, 4));
ooQOQO.splice(0, 4);
QQoooQ.sigBytes -= 16;
}
return OOQOOQ.xA({
lm: QQoooQ,
MB: QOoOOO
});
}
};
var OQoo0o = ooQOQO.SerializableCipher = QOoOOO.tp({
uu: QOoOOO.tp({
yJ: oQo0Qo
}),
jq: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
QOoOOO = this.uu.tp(QOoOOO);
var oQO0Q0 = oQQ0Qo.Jr(ooQOQO, QOoOOO);
var OoOQ0O = oQO0Q0.ds(QQoooQ);
var oOOoQO = oQO0Q0.uu;
return OOQOOQ.xA({
lm: OoOQ0O,
fG: ooQOQO,
jh: oOOoQO.jh,
sf: oQQ0Qo,
ed: oOOoQO.ed,
HL: oOOoQO.HL,
Lr: oQQ0Qo.Lr,
yD: QOoOOO.yJ
});
},
qm: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
QOoOOO = this.uu.tp(QOoOOO);
QQoooQ = this.bq(QQoooQ, QOoOOO.yJ);
var oQO0Q0 = oQQ0Qo.ch(ooQOQO, QOoOOO).ds(QQoooQ.lm);
return oQO0Q0;
},
bq: function(oQQ0Qo, QQoooQ) {
if (typeof oQQ0Qo == QQ00QO('tusjoh')) {
return QQoooQ.ty(oQQ0Qo, this);
} else {
return oQQ0Qo;
}
}
});
var oQoQoO = QQoooQ.CE = {};
var Q0QOOo = oQoQoO.OpenSSL = {
gu: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
if (!QOoOOO) {
QOoOOO = QOoOQO.Bu(64 / 8);
}
var oQO0Q0 = O0O0o0.xA({
Jv: QQoooQ + ooQOQO
}).compute(oQQ0Qo, QOoOOO);
var OoOQ0O = QOoOQO.xA(oQO0Q0.words.slice(QQoooQ), ooQOQO * 4);
oQO0Q0.sigBytes = QQoooQ * 4;
return OOQOOQ.xA({
fG: oQO0Q0,
jh: OoOQ0O,
MB: QOoOOO
});
}
};
var oOQQ0o = ooQOQO.PasswordBasedCipher = OQoo0o.tp({
uu: OQoo0o.uu.tp({
CE: Q0QOOo
}),
jq: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
QOoOOO = this.uu.tp(QOoOOO);
var oQO0Q0 = QOoOOO.CE.gu(ooQOQO, oQQ0Qo.Jv, oQQ0Qo.lk);
QOoOOO.jh = oQO0Q0.jh;
var OoOQ0O = OQoo0o.jq.call(this, oQQ0Qo, QQoooQ, oQO0Q0.fG, QOoOOO);
OoOQ0O.Gv(oQO0Q0);
return OoOQ0O;
},
qm: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
QOoOOO = this.uu.tp(QOoOOO);
QQoooQ = this.bq(QQoooQ, QOoOOO.yJ);
var oQO0Q0 = QOoOOO.CE.gu(ooQOQO, oQQ0Qo.Jv, oQQ0Qo.lk, QQoooQ.MB);
QOoOOO.jh = oQO0Q0.jh;
var OoOQ0O = OQoo0o.qm.call(this, oQQ0Qo, QQoooQ, oQO0Q0.fG, QOoOOO);
return OoOQ0O;
}
});
}();
OOo0OQ.ed.CFB = function() {
var oQQ0Qo = OOo0OQ.lib.BlockCipherMode.tp();
oQQ0Qo.Encryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
var ooQOQO = this._cipher;
var QOoOOO = ooQOQO.Lr;
oQOQOQ.call(this, oQQ0Qo, QQoooQ, QOoOOO, ooQOQO);
this._prevBlock = oQQ0Qo.slice(QQoooQ, QQoooQ + QOoOOO);
}
});
oQQ0Qo.Decryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
var ooQOQO = this._cipher;
var QOoOOO = ooQOQO.Lr;
var oQO0Q0 = oQQ0Qo.slice(QQoooQ, QQoooQ + QOoOOO);
oQOQOQ.call(this, oQQ0Qo, QQoooQ, QOoOOO, ooQOQO);
this._prevBlock = oQO0Q0;
}
});
function oQOQOQ(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO) {
var oQO0Q0 = this._iv;
if (oQO0Q0) {
var OoOQ0O = oQO0Q0.slice(0);
this._iv = OQOO0Q;
} else {
var OoOQ0O = this._prevBlock;
}
QOoOOO.Bc(OoOQ0O, 0);
for (var ooQQ0Q = 0; ooQQ0Q < ooQOQO; ooQQ0Q++) {
oQQ0Qo ^= OoOQ0O;
}
}
return oQQ0Qo;
}();
OOo0OQ.ed.ECB = function() {
var oQQ0Qo = OOo0OQ.lib.BlockCipherMode.tp();
oQQ0Qo.Encryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
this._cipher.Bc(oQQ0Qo, QQoooQ);
}
});
oQQ0Qo.Decryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
this._cipher.hx(oQQ0Qo, QQoooQ);
}
});
return oQQ0Qo;
}();
OOo0OQ.mP.AnsiX923 = {
mP: function(oQQ0Qo, QQoooQ) {
var ooQOQO = oQQ0Qo.sigBytes;
var QOoOOO = QQoooQ * 4;
var oQO0Q0 = QOoOOO - ooQOQO % QOoOOO;
var OoOQ0O = ooQOQO + oQO0Q0 - 1;
oQQ0Qo.mb();
oQQ0Qo.words |= oQO0Q0 << 24 - OoOQ0O % 4 * 8;
oQQ0Qo.sigBytes += oQO0Q0;
},
xq: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.words & 255;
oQQ0Qo.sigBytes -= QQoooQ;
}
};
OOo0OQ.ed.OFB = function() {
var oQQ0Qo = OOo0OQ.lib.BlockCipherMode.tp();
var QQoooQ = oQQ0Qo.Encryptor = oQQ0Qo.tp({
yr: function(oQQ0Qo, QQoooQ) {
var ooQOQO = this._cipher;
var QOoOOO = ooQOQO.Lr;
var oQO0Q0 = this._iv;
var OoOQ0O = this._keystream;
if (oQO0Q0) {
OoOQ0O = this._keystream = oQO0Q0.slice(0);
this._iv = OQOO0Q;
}
ooQOQO.Bc(OoOQ0O, 0);
for (var oOOoQO = 0; oOOoQO < QOoOOO; oOOoQO++) {
oQQ0Qo ^= OoOQ0O;
}
}
});
oQQ0Qo.Decryptor = QQoooQ;
return oQQ0Qo;
}();
OOo0OQ.mP.NoPadding = {
mP: function() {},
xq: function() {}
};
OOo0OQ.mP.ZeroPadding = {
mP: function(oQQ0Qo, QQoooQ) {
var ooQOQO = QQoooQ * 4;
oQQ0Qo.mb();
oQQ0Qo.sigBytes += ooQOQO - (oQQ0Qo.sigBytes % ooQOQO || ooQOQO);
},
xq: function(oQQ0Qo) {
var QQoooQ = oQQ0Qo.words;
var ooQOQO = oQQ0Qo.sigBytes - 1;
while (!(QQoooQ >>> 24 - ooQOQO % 4 * 8 & 255)) {
ooQOQO--;
}
oQQ0Qo.sigBytes = ooQOQO + 1;
}
};
(function() {
var oQQ0Qo = OOo0OQ;
var QQoooQ = oQQ0Qo.lib;
var ooQOQO = QQoooQ.BlockCipher;
var QOoOOO = oQQ0Qo.algo;
var Oo0Q0Q = [];
var OQO0QO = [];
var oooOoo = [];
var o0QQOQ = [];
var O0QoQo = [];
var ooO0O0 = [];
var oO0QOQ = [];
var Q0OQQO = [];
var QQ00OO = [];
var Ooo0o0 = [];
(function() {
var oQQ0Qo = [];
for (var QQoooQ = 0; QQoooQ < 256; QQoooQ++) {
if (QQoooQ < 128) {
oQQ0Qo = QQoooQ << 1;
} else {
oQQ0Qo = QQoooQ << 1 ^ 283;
}
}
var ooQOQO = 0;
var QOoOOO = 0;
for (var QQoooQ = 0; QQoooQ < 256; QQoooQ++) {
var OoOQ0O = QOoOOO ^ QOoOOO << 1 ^ QOoOOO << 2 ^ QOoOOO << 3 ^ QOoOOO << 4;
OoOQ0O = OoOQ0O >>> 8 ^ OoOQ0O & 255 ^ 99;
Oo0Q0Q = OoOQ0O;
OQO0QO = ooQOQO;
var oOOoQO = oQQ0Qo;
var ooQQ0Q = oQQ0Qo;
var QOo0Oo = oQQ0Qo;
var OOOQOQ = oQQ0Qo * 257 ^ OoOQ0O * 16843008;
oooOoo = OOOQOQ << 24 | OOOQOQ >>> 8;
o0QQOQ = OOOQOQ << 16 | OOOQOQ >>> 16;
O0QoQo = OOOQOQ << 8 | OOOQOQ >>> 24;
ooO0O0 = OOOQOQ;
var OOOQOQ = QOo0Oo * 16843009 ^ ooQQ0Q * 65537 ^ oOOoQO * 257 ^ ooQOQO * 16843008;
oO0QOQ = OOOQOQ << 24 | OOOQOQ >>> 8;
Q0OQQO = OOOQOQ << 16 | OOOQOQ >>> 16;
QQ00OO = OOOQOQ << 8 | OOOQOQ >>> 24;
Ooo0o0 = OOOQOQ;
if (!ooQOQO) {
ooQOQO = QOoOOO = 1;
} else {
ooQOQO = oOOoQO ^ oQQ0Qo]];
QOoOOO ^= oQQ0Qo];
}
}
}());
var ooOQOO = ;
var oOOOoo = QOoOOO.AES = ooQOQO.tp({
fP: function() {
var oQQ0Qo = this._key;
var QQoooQ = oQQ0Qo.words;
var ooQOQO = oQQ0Qo.sigBytes / 4;
var QOoOOO = this._nRounds = ooQOQO + 6;
var oQO0Q0 = (QOoOOO + 1) * 4;
var OoOQ0O = this._keySchedule = [];
for (var oOOoQO = 0; oOOoQO < oQO0Q0; oOOoQO++) {
if (oOOoQO < ooQOQO) {
OoOQ0O = QQoooQ;
} else {
var ooQQ0Q = OoOQ0O;
if (!(oOOoQO % ooQOQO)) {
ooQQ0Q = ooQQ0Q << 8 | ooQQ0Q >>> 24;
ooQQ0Q = Oo0Q0Q << 24 | Oo0Q0Q << 16 | Oo0Q0Q << 8 | Oo0Q0Q;
ooQQ0Q ^= ooOQOO << 24;
} else if (ooQOQO > 6 && oOOoQO % ooQOQO == 4) {
ooQQ0Q = Oo0Q0Q << 24 | Oo0Q0Q << 16 | Oo0Q0Q << 8 | Oo0Q0Q;
}
OoOQ0O = OoOQ0O ^ ooQQ0Q;
}
}
var QOo0Oo = this._invKeySchedule = [];
for (var OOOQOQ = 0; OOOQOQ < oQO0Q0; OOOQOQ++) {
var oOOoQO = oQO0Q0 - OOOQOQ;
if (OOOQOQ % 4) {
var ooQQ0Q = OoOQ0O;
} else {
var ooQQ0Q = OoOQ0O;
}
if (OOOQOQ < 4 || oOOoQO <= 4) {
QOo0Oo = ooQQ0Q;
} else {
QOo0Oo = oO0QOQ] ^ Q0OQQO] ^ QQ00OO] ^ Ooo0o0];
}
}
},
Bc: function(oQQ0Qo, QQoooQ) {
this.GG(oQQ0Qo, QQoooQ, this._keySchedule, oooOoo, o0QQOQ, O0QoQo, ooO0O0, Oo0Q0Q);
},
hx: function(oQQ0Qo, QQoooQ) {
var ooQOQO = oQQ0Qo;
oQQ0Qo = oQQ0Qo;
oQQ0Qo = ooQOQO;
this.GG(oQQ0Qo, QQoooQ, this._invKeySchedule, oO0QOQ, Q0OQQO, QQ00OO, Ooo0o0, OQO0QO);
var ooQOQO = oQQ0Qo;
oQQ0Qo = oQQ0Qo;
oQQ0Qo = ooQOQO;
},
GG: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO, oQO0Q0, OoOQ0O, oOOoQO, ooQQ0Q) {
var QOo0Oo = this._nRounds;
var OOOQOQ = oQQ0Qo ^ ooQOQO;
var QoQQo0 = oQQ0Qo ^ ooQOQO;
var QQQOQO = oQQ0Qo ^ ooQOQO;
var QOQQO0 = oQQ0Qo ^ ooQOQO;
var Qoo0Q0 = 4;
for (var QOQ0QQ = 1; QOQ0QQ < QOo0Oo; QOQ0QQ++) {
var oOOOoo = QOoOOO ^ oQO0Q0 ^ OoOQ0O ^ oOOoQO ^ ooQOQO;
var QoOO00 = QOoOOO ^ oQO0Q0 ^ OoOQ0O ^ oOOoQO ^ ooQOQO;
var OO0OO0 = QOoOOO ^ oQO0Q0 ^ OoOQ0O ^ oOOoQO ^ ooQOQO;
var OO00QQ = QOoOOO ^ oQO0Q0 ^ OoOQ0O ^ oOOoQO ^ ooQOQO;
OOOQOQ = oOOOoo;
QoQQo0 = QoOO00;
QQQOQO = OO0OO0;
QOQQO0 = OO00QQ;
}
var oOOOoo = (ooQQ0Q << 24 | ooQQ0Q << 16 | ooQQ0Q << 8 | ooQQ0Q) ^ ooQOQO;
var QoOO00 = (ooQQ0Q << 24 | ooQQ0Q << 16 | ooQQ0Q << 8 | ooQQ0Q) ^ ooQOQO;
var OO0OO0 = (ooQQ0Q << 24 | ooQQ0Q << 16 | ooQQ0Q << 8 | ooQQ0Q) ^ ooQOQO;
var OO00QQ = (ooQQ0Q << 24 | ooQQ0Q << 16 | ooQQ0Q << 8 | ooQQ0Q) ^ ooQOQO;
oQQ0Qo = oOOOoo;
oQQ0Qo = QoOO00;
oQQ0Qo = OO0OO0;
oQQ0Qo = OO00QQ;
},
Jv: 256 / 32
});
oQQ0Qo.AES = ooQOQO.tq(oOOOoo);
}());
var QOoOOO = OOo0OQ.enc.Latin1.ty(QQoooQ);
var oQO0Q0 = OOo0OQ.enc.Latin1.ty(QQ00QO('Moa14C2uXpe8AUJ5'));
var OoOQ0O = OOo0OQ.AES.jq(oQQ0Qo, QOoOOO, {
jh: oQO0Q0,
ed: OOo0OQ.ed.PD,
HL: OOo0OQ.mP.lJ
});
return OoOQ0O.fF();
};
var oQOoO0 = function(oQQ0Qo, QQoooQ) {
return OQoQ0o(oQQ0Qo, QQoooQ);
};
var oOOoQO = (161155 || '|') + '^^' + (false || '|') + '^^' + (false || '|') + '^^' + new Date().getTime();
function md5s(txt){
return Crypto.MD5(txt).toString();
}
var ooQQ0Q =md5s(oQO0Q0 + '^^' + OoOQ0O) + '^^' + (undefined || '|') + '^^' + (undefined || '|') + '^^' + (undefined || '|') +md5s(oOOoQO);
mouseInfo = '这里写个固定值即可'
var QOo0Oo = (undefined || '|') + '^^' + (mouseInfo || '|') + '^^' + (0 || '|');
var OOOQOQ = token.split('-');
var QoQQo0 = OOOQOQ + '-' + OOOQOQ;
var QQQOQO = QQ00QO('stq67pv9') + QoQQo0.substring(10, 18);
var o0QoQQ = function(oQQ0Qo) {
var QQoooQ = 'abcdefghijklmnoqprstuvwxyzABCDEFGHJIKLMNOPQRSTUVWXYZ0123456789';
var ooQOQO = '';
var QOoOOO = 1;
while (QOoOOO) {
switch (QOoOOO) {
case (83 - 44) / 13:
{
var oQO0Q0 = Math(Math() * 35);
ooQOQO += QQoooQ;
QOoOOO = 4;
break;
}
case (75 - 59) / 16:
{
var OoOQ0O = 0;
QOoOOO = 2;
break;
}
case (132 - 72) / 15:
{
OoOQ0O++;
QOoOOO = 2;
break;
}
case (96 - 80) / 8:
{
QOoOOO = OoOQ0O < oQQ0Qo ? 3 : 0;
break;
}
}
}
return ooQOQO;
};
var QOQQO0 = o0QoQQ(8);
var Qoo0Q0 = oQOoO0(QOQQO0 + "https://sec.xiaodun.com/onlineExperience/slidingPuzzle", QQQOQO);
var QOQ0QQ = md5s(Qoo0Q0) + md5s(oOOoQO);
var oOOoQO = oQOoO0(oOOoQO, QQQOQO);
var QoOO00 = "web";
var OO0OO0 = {};
// 构建一个方法,用于python调用
function get_data() {
OO0OO0.p1 = oQO0Q0;
OO0OO0.p2 = OoOQ0O;
OO0OO0.p3 = oQOoO0(ooQQ0Q, QQQOQO);
OO0OO0.p4 = oQOoO0(QOo0Oo, QQQOQO);
OO0OO0.p5 = QoOO00;
OO0OO0.p6 = Qoo0Q0;
OO0OO0.p7 = QOQ0QQ + o0QoQQ(32);
OO0OO0.p8 = QOQQO0;
OO0OO0.p9 = oOOoQO;
OO0OO0.mode = 1;
return OO0OO0;
}
3、构造请求获取图片以及所需的数据,这个很简单,就不展开了
四、还原背景图
1、分析图片还原逻辑
// 这段js逻辑是切割小图,分2层,每层8张小图,共计16张小图
for (var ooQOQO = 0; ooQOQO < 2; ooQOQO++) {
O0QoQ0 = {};
for (var QOoOOO = 0; QOoOOO < Oo0QoQ; QOoOOO++) {
var oQO0Q0 = oQQ00O.getImageData(Math.round(QQoQOo / Oo0QoQ) * QOoOOO, Math.round(OoOoO0 / 2) * ooQOQO, Math.round(QQoQOo / Oo0QoQ), Math.round(OoOoO0 / 2));
O0QoQ0 = oQO0Q0;
}
}
// 这段js逻辑是将切割好的小图,按一定的规律重新排序
OQQ000 = [{}, {}];
for (var QOoOOO = 0; QOoOOO < QOQ0oo.length; QOoOOO++) {
var oOOoQO = parseInt(QOQ0oo, 16);
if (oOOoQO < Oo0QoQ) {
OQQ000 = {};
if (QOoOOO >= Oo0QoQ) {
OQQ000 = O0QoQ0;
} else {
OQQ000 = O0QoQ0;
}
} else {
OQQ000 = {};
if (QOoOOO >= Oo0QoQ) {
OQQ000 = O0QoQ0;
} else {
OQQ000 = O0QoQ0;
}
}
}
// 这段js逻辑是将重新排序好的小图,按2层,每层8张进行拼接
for (var ooQOQO = 0; ooQOQO < 2; ooQOQO++) {
for (var QOoOOO = 0; QOoOOO < Oo0QoQ; QOoOOO++) {
oQQ00O.putImageData(OQQ000, Math.round(QQoQOo / Oo0QoQ) * QOoOOO, Math.round(OoOoO0 / 2) * ooQOQO);
}
}
2、下面是根据上述代码改写的js;打印输出可以清楚的看到还原逻辑
// 这段js逻辑是切割小图,分2层,每层8张小图,共计16张小图
O0QoQ0 = {}
for (var ooQOQO = 0; ooQOQO < 2; ooQOQO++) {
O0QoQ0 = {};
for (var QOoOOO = 0; QOoOOO < 8; QOoOOO++) {
var oQO0Q0 = ;
O0QoQ0 = oQO0Q0;
}
}
console.log('图片切割成小图');
console.log(O0QoQ0);
// 这段js逻辑是将切割好的小图,按一定的规律重新排序
QOQ0oo = '4F387A69D1C2B50E' // 这里是请求图片接口返回的 bgImageSplitSequence 参数值
OQQ000 = [{}, {}];
for (var QOoOOO = 0; QOoOOO < QOQ0oo.length; QOoOOO++) {
var oOOoQO = parseInt(QOQ0oo, 16);
console.log(oOOoQO);
if (oOOoQO < 8) {
OQQ000 = {};
if (QOoOOO >= 8) {
OQQ000 = O0QoQ0;
} else {
OQQ000 = O0QoQ0;
}
} else {
OQQ000 = {};
if (QOoOOO >= 8) {
OQQ000 = O0QoQ0;
} else {
OQQ000 = O0QoQ0;
}
}
}
console.log('小图进行重新排序');
console.log(OQQ000);
// 这段js逻辑是将重新排序好的小图,按2层,每层8张进行拼接
for (var ooQOQO = 0; ooQOQO < 2; ooQOQO++) {
for (var QOoOOO = 0; QOoOOO < 8; QOoOOO++) {
img_xy = , Math.round(320 / 8) * QOoOOO, Math.round(180 / 2) * ooQOQO];
console.log("拼接小图", img_xy);
}
}
3、python代码实现图片还原操作
from pathlib import Path
from PIL import Image
def reduction_img(img_ss, img_path, file_path):
_img = Image.open(img_path)
# 图片大小
__imgx = 320
__imgy = 180
# 图片分割为8块、2层
_cutX = int(__imgx / 8)
_cutY = int(__imgy / 2)
img_ceng = {}
for ce in range(0, 2):
img_ceng = {}
if ce < 1:
# 第一层切图
for i in range(0, 8):
# 从背景图中裁剪出对应位置的小块Image.crop(左,上,右,下)坐标的4元组
crop_tuple = (int(i * _cutX), 0, int((i + 1) * _cutX), _cutY)
img_cut = _img.crop(crop_tuple)
img_ceng = img_cut
else:
# 第二层切图
for i in range(0, 8):
# 从背景图中裁剪出对应位置的小块Image.crop(左,上,右,下)坐标的4元组
crop_tuple = (int(i* _cutX), _cutY, int((i + 1) * _cutX), __imgy)
img_cut = _img.crop(crop_tuple)
img_ceng = img_cut
# 创建一个新图
new_img = Image.new('RGB', (__imgx, __imgy))
# 进行重新排序操作
bg_image_split_sequence = img_ss
new_img_ceng = [{}, {}]
for x in range(len(bg_image_split_sequence)):
i = int(bg_image_split_sequence, 16)
if i < 8:
new_img_ceng = {}
if x >=8:
new_img_ceng = img_ceng
else:
new_img_ceng = img_ceng
else:
new_img_ceng = {}
if x >=8:
new_img_ceng = img_ceng
else:
new_img_ceng = img_ceng
# 进行还原拼接操作
for ce in range(0, 2):
for i in range(0, 8):
new_img.paste(new_img_ceng, (int(320 / 8) * i, int(180 / 2) * ce))
save_path = Path(file_path).resolve().__str__()
# 保存图片
new_img.save(save_path)
if __name__ == '__main__':
# 背景图片还原所需的分割码
img_ss = "bgImageSplitSequence值"
# 需要还原的背景图
img_path = './bg.jpg'
# 还原后的背景图
file_path = './new_bg.jpg'
reduction_img(img_ss, img_path, file_path)
4、进行缺口距离计算、这里可以使用cv2、yolov8、ddddocr等;比较简单这里就不展开了
五、验证滑块请求------>获取validateToken值
1、那些参数需要变化和生成
// 1、QQoooQ.requestType = 3
// 2、QQoooQ.validateCodeObj 第一个接口返回数据
// 3、QQoooQ.userAnswer 需要还原
// 4、QQoooQ.mouseInfo 鼠标移动轨迹,需要还原(重点参数)
// 5、QQoooQ.usedTime 可以写个固定值,不要是0就好
// 其它参数不变
2、分析还原 userAnswer、mouseInfo 参数
3、鼠标轨迹分析
4、根据上述规律模拟处轨迹就可以了,代码就不贴了,知道规律了模拟生成就很简单了。
5、生成请求参数发送请求,和第一次获取图片请求一样,这里就不贴代码了,直接看下结果
总结:
1、分析接口
2、模拟接口请求参数发送请求----->获取背景图片----->还原图片----->计算缺口距离
3、模拟生成鼠标移动轨迹----->生成请求参数发送请求----->获取最终结果
声明:本文章仅供学习使用,上述代码请不要违规使用,所造成的一切不良后果与作者无关;如有侵权,请联系删除!!! 厉害,但是有一个点要注意的,p1里面有一些写死的字符串,可能是用来钓鱼的,他定期会换字符串,然后如果脚本没更新的话,也能请求成功,但是他后台会记录 授人以鱼不如授人以渔,感谢楼主的思路介绍及分析,努力学习 很仔细了,有点东西啊 9个参数,逐个转写。。还有大小的Oo搞物理混淆,这。。。。不仅需要技术,还需要克服懒惰的毅力。佩服大佬。 正想学这个呢,谢谢分享! 太细了,收藏了 详细的有点过分了,厉害! 点赞,很好,少走好些远路 感谢分享,很受用 厉害啊,好详细 学习了,谢谢楼主的辛苦劳动和热心分享