吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6280|回复: 53
上一主题 下一主题
收起左侧

[Web逆向] 某盾滑块验证:从0到1,逐步分析 (图片还原、轨迹模拟)

  [复制链接]
跳转到指定楼层
楼主
xiaopacai888 发表于 2024-2-22 09:24 回帖奖励
本帖最后由 xiaopacai888 于 2024-2-22 14:45 编辑

某盾滑块验证:从0到1,逐步分析 (图片还原、轨迹模拟)
一、目标网址:aHR0cHM6Ly9zZWMueGlhb2R1bi5jb20vb25saW5lRXhwZXJpZW5jZS9zbGlkaW5nUHV6emxl
二、接口分析


三、构建第一个接口请求------>获取滑块图片






1、对p1-p9参数逐个分析,还原










2、上面已经把所有的请求参数分析还原出来了,下面整理构造一个方法,方便python调用即可
[JavaScript] 纯文本查看 复制代码
// 完整的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[ooQOQO];
        }
    }
    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[QQoooQ] = oQQ0Qo[QQoooQ];
                        }
                    }
                    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[OoOQ0O >>> 2] >>> 24 - OoOQ0O % 4 * 8 & 255;
                        QQoooQ[QOoOOO + OoOQ0O >>> 2] |= oOOoQO << 24 - (QOoOOO + OoOQ0O) % 4 * 8;
                    }
                } else {
                    for (var OoOQ0O = 0; OoOQ0O < oQO0Q0; OoOQ0O += 4) {
                        QQoooQ[QOoOOO + OoOQ0O >>> 2] = ooQOQO[OoOQ0O >>> 2];
                    }
                }
                this.sigBytes += oQO0Q0;
                return this;
            },
            mb: function() {
                var oQQ0Qo = this.words;
                var QQoooQ = this.sigBytes;
                oQQ0Qo[QQoooQ >>> 2] &= 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[oQO0Q0 >>> 2] >>> 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[QOoOOO >>> 3] |= 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[oQO0Q0 >>> 2] >>> 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[QOoOOO >>> 2] |= (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[OoOQ0O >>> 2] >>> 24 - OoOQ0O % 4 * 8 & 255;
                    var ooQQ0Q = QQoooQ[OoOQ0O + 1 >>> 2] >>> 24 - (OoOQ0O + 1) % 4 * 8 & 255;
                    var QOo0Oo = QQoooQ[OoOQ0O + 2 >>> 2] >>> 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[oOOoQO >>> 2] |= 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[QQoooQ + oOOoQO] ^= oQO0Q0[oOOoQO];
                }
            }
            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[oQQ0Qo.sigBytes - 1 >>> 2] & 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([1398893684, 1701076831]).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[0] == 1398893684 && ooQOQO[1] == 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[QQoooQ + ooQQ0Q] ^= OoOQ0O[ooQQ0Q];
            }
        }
        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[OoOQ0O >>> 2] |= oQO0Q0 << 24 - OoOQ0O % 4 * 8;
            oQQ0Qo.sigBytes += oQO0Q0;
        },
        xq: function(oQQ0Qo) {
            var QQoooQ = oQQ0Qo.words[oQQ0Qo.sigBytes - 1 >>> 2] & 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[QQoooQ + oOOoQO] ^= OoOQ0O[oOOoQO];
                }
            }
        });
        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[ooQOQO >>> 2] >>> 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] = QQoooQ << 1;
                } else {
                    oQQ0Qo[QQoooQ] = 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[ooQOQO] = OoOQ0O;
                OQO0QO[OoOQ0O] = ooQOQO;
                var oOOoQO = oQQ0Qo[ooQOQO];
                var ooQQ0Q = oQQ0Qo[oOOoQO];
                var QOo0Oo = oQQ0Qo[ooQQ0Q];
                var OOOQOQ = oQQ0Qo[OoOQ0O] * 257 ^ OoOQ0O * 16843008;
                oooOoo[ooQOQO] = OOOQOQ << 24 | OOOQOQ >>> 8;
                o0QQOQ[ooQOQO] = OOOQOQ << 16 | OOOQOQ >>> 16;
                O0QoQo[ooQOQO] = OOOQOQ << 8 | OOOQOQ >>> 24;
                ooO0O0[ooQOQO] = OOOQOQ;
                var OOOQOQ = QOo0Oo * 16843009 ^ ooQQ0Q * 65537 ^ oOOoQO * 257 ^ ooQOQO * 16843008;
                oO0QOQ[OoOQ0O] = OOOQOQ << 24 | OOOQOQ >>> 8;
                Q0OQQO[OoOQ0O] = OOOQOQ << 16 | OOOQOQ >>> 16;
                QQ00OO[OoOQ0O] = OOOQOQ << 8 | OOOQOQ >>> 24;
                Ooo0o0[OoOQ0O] = OOOQOQ;
                if (!ooQOQO) {
                    ooQOQO = QOoOOO = 1;
                } else {
                    ooQOQO = oOOoQO ^ oQQ0Qo[oQQ0Qo[oQQ0Qo[QOo0Oo ^ oOOoQO]]];
                    QOoOOO ^= oQQ0Qo[oQQ0Qo[QOoOOO]];
                }
            }
        }());
        var ooOQOO = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54];
        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[oOOoQO] = QQoooQ[oOOoQO];
                    } else {
                        var ooQQ0Q = OoOQ0O[oOOoQO - 1];
                        if (!(oOOoQO % ooQOQO)) {
                            ooQQ0Q = ooQQ0Q << 8 | ooQQ0Q >>> 24;
                            ooQQ0Q = Oo0Q0Q[ooQQ0Q >>> 24] << 24 | Oo0Q0Q[ooQQ0Q >>> 16 & 255] << 16 | Oo0Q0Q[ooQQ0Q >>> 8 & 255] << 8 | Oo0Q0Q[ooQQ0Q & 255];
                            ooQQ0Q ^= ooOQOO[oOOoQO / ooQOQO | 0] << 24;
                        } else if (ooQOQO > 6 && oOOoQO % ooQOQO == 4) {
                            ooQQ0Q = Oo0Q0Q[ooQQ0Q >>> 24] << 24 | Oo0Q0Q[ooQQ0Q >>> 16 & 255] << 16 | Oo0Q0Q[ooQQ0Q >>> 8 & 255] << 8 | Oo0Q0Q[ooQQ0Q & 255];
                        }
                        OoOQ0O[oOOoQO] = OoOQ0O[oOOoQO - ooQOQO] ^ ooQQ0Q;
                    }
                }
                var QOo0Oo = this._invKeySchedule = [];
                for (var OOOQOQ = 0; OOOQOQ < oQO0Q0; OOOQOQ++) {
                    var oOOoQO = oQO0Q0 - OOOQOQ;
                    if (OOOQOQ % 4) {
                        var ooQQ0Q = OoOQ0O[oOOoQO];
                    } else {
                        var ooQQ0Q = OoOQ0O[oOOoQO - 4];
                    }
                    if (OOOQOQ < 4 || oOOoQO <= 4) {
                        QOo0Oo[OOOQOQ] = ooQQ0Q;
                    } else {
                        QOo0Oo[OOOQOQ] = oO0QOQ[Oo0Q0Q[ooQQ0Q >>> 24]] ^ Q0OQQO[Oo0Q0Q[ooQQ0Q >>> 16 & 255]] ^ QQ00OO[Oo0Q0Q[ooQQ0Q >>> 8 & 255]] ^ Ooo0o0[Oo0Q0Q[ooQQ0Q & 255]];
                    }
                }
            },
            Bc: function(oQQ0Qo, QQoooQ) {
                this.GG(oQQ0Qo, QQoooQ, this._keySchedule, oooOoo, o0QQOQ, O0QoQo, ooO0O0, Oo0Q0Q);
            },
            hx: function(oQQ0Qo, QQoooQ) {
                var ooQOQO = oQQ0Qo[QQoooQ + 1];
                oQQ0Qo[QQoooQ + 1] = oQQ0Qo[QQoooQ + 3];
                oQQ0Qo[QQoooQ + 3] = ooQOQO;
                this.GG(oQQ0Qo, QQoooQ, this._invKeySchedule, oO0QOQ, Q0OQQO, QQ00OO, Ooo0o0, OQO0QO);
                var ooQOQO = oQQ0Qo[QQoooQ + 1];
                oQQ0Qo[QQoooQ + 1] = oQQ0Qo[QQoooQ + 3];
                oQQ0Qo[QQoooQ + 3] = ooQOQO;
            },
            GG: function(oQQ0Qo, QQoooQ, ooQOQO, QOoOOO, oQO0Q0, OoOQ0O, oOOoQO, ooQQ0Q) {
                var QOo0Oo = this._nRounds;
                var OOOQOQ = oQQ0Qo[QQoooQ] ^ ooQOQO[0];
                var QoQQo0 = oQQ0Qo[QQoooQ + 1] ^ ooQOQO[1];
                var QQQOQO = oQQ0Qo[QQoooQ + 2] ^ ooQOQO[2];
                var QOQQO0 = oQQ0Qo[QQoooQ + 3] ^ ooQOQO[3];
                var Qoo0Q0 = 4;
                for (var QOQ0QQ = 1; QOQ0QQ < QOo0Oo; QOQ0QQ++) {
                    var oOOOoo = QOoOOO[OOOQOQ >>> 24] ^ oQO0Q0[QoQQo0 >>> 16 & 255] ^ OoOQ0O[QQQOQO >>> 8 & 255] ^ oOOoQO[QOQQO0 & 255] ^ ooQOQO[Qoo0Q0++];
                    var QoOO00 = QOoOOO[QoQQo0 >>> 24] ^ oQO0Q0[QQQOQO >>> 16 & 255] ^ OoOQ0O[QOQQO0 >>> 8 & 255] ^ oOOoQO[OOOQOQ & 255] ^ ooQOQO[Qoo0Q0++];
                    var OO0OO0 = QOoOOO[QQQOQO >>> 24] ^ oQO0Q0[QOQQO0 >>> 16 & 255] ^ OoOQ0O[OOOQOQ >>> 8 & 255] ^ oOOoQO[QoQQo0 & 255] ^ ooQOQO[Qoo0Q0++];
                    var OO00QQ = QOoOOO[QOQQO0 >>> 24] ^ oQO0Q0[OOOQOQ >>> 16 & 255] ^ OoOQ0O[QoQQo0 >>> 8 & 255] ^ oOOoQO[QQQOQO & 255] ^ ooQOQO[Qoo0Q0++];
                    OOOQOQ = oOOOoo;
                    QoQQo0 = QoOO00;
                    QQQOQO = OO0OO0;
                    QOQQO0 = OO00QQ;
                }
                var oOOOoo = (ooQQ0Q[OOOQOQ >>> 24] << 24 | ooQQ0Q[QoQQo0 >>> 16 & 255] << 16 | ooQQ0Q[QQQOQO >>> 8 & 255] << 8 | ooQQ0Q[QOQQO0 & 255]) ^ ooQOQO[Qoo0Q0++];
                var QoOO00 = (ooQQ0Q[QoQQo0 >>> 24] << 24 | ooQQ0Q[QQQOQO >>> 16 & 255] << 16 | ooQQ0Q[QOQQO0 >>> 8 & 255] << 8 | ooQQ0Q[OOOQOQ & 255]) ^ ooQOQO[Qoo0Q0++];
                var OO0OO0 = (ooQQ0Q[QQQOQO >>> 24] << 24 | ooQQ0Q[QOQQO0 >>> 16 & 255] << 16 | ooQQ0Q[OOOQOQ >>> 8 & 255] << 8 | ooQQ0Q[QoQQo0 & 255]) ^ ooQOQO[Qoo0Q0++];
                var OO00QQ = (ooQQ0Q[QOQQO0 >>> 24] << 24 | ooQQ0Q[OOOQOQ >>> 16 & 255] << 16 | ooQQ0Q[QoQQo0 >>> 8 & 255] << 8 | ooQQ0Q[QQQOQO & 255]) ^ ooQOQO[Qoo0Q0++];
                oQQ0Qo[QQoooQ] = oOOOoo;
                oQQ0Qo[QQoooQ + 1] = QoOO00;
                oQQ0Qo[QQoooQ + 2] = OO0OO0;
                oQQ0Qo[QQoooQ + 3] = 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.length - 2] + '-' + OOOQOQ[OOOQOQ.length - 1];
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[QQ00QO('dfjm')](Math[QQ00QO('sboepn')]() * 35);
                ooQOQO += QQoooQ[oQO0Q0];
                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、分析图片还原逻辑
[JavaScript] 纯文本查看 复制代码
// 这段js逻辑是切割小图,分2层,每层8张小图,共计16张小图
for (var ooQOQO = 0; ooQOQO < 2; ooQOQO++) {
    O0QoQ0[ooQOQO] = {};
    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[ooQOQO][QOoOOO] = oQO0Q0;
    }
}


[JavaScript] 纯文本查看 复制代码
// 这段js逻辑是将切割好的小图,按一定的规律重新排序
OQQ000 = [{}, {}];
for (var QOoOOO = 0; QOoOOO < QOQ0oo.length; QOoOOO++) {
        var oOOoQO = parseInt(QOQ0oo[QOoOOO], 16);
    if (oOOoQO < Oo0QoQ) {
        OQQ000[0][oOOoQO] = {};
        if (QOoOOO >= Oo0QoQ) {
            OQQ000[0][oOOoQO] = O0QoQ0[1][QOoOOO - Oo0QoQ];
        } else {
            OQQ000[0][oOOoQO] = O0QoQ0[0][QOoOOO];
        }
    } else {
        OQQ000[1][oOOoQO - Oo0QoQ] = {};
        if (QOoOOO >= Oo0QoQ) {
            OQQ000[1][oOOoQO - Oo0QoQ] = O0QoQ0[1][QOoOOO - Oo0QoQ];
        } else {
            OQQ000[1][oOOoQO - Oo0QoQ] = O0QoQ0[0][QOoOOO];
        }
    }
}

[JavaScript] 纯文本查看 复制代码
// 这段js逻辑是将重新排序好的小图,按2层,每层8张进行拼接
for (var ooQOQO = 0; ooQOQO < 2; ooQOQO++) {
    for (var QOoOOO = 0; QOoOOO < Oo0QoQ; QOoOOO++) {
        oQQ00O.putImageData(OQQ000[ooQOQO][QOoOOO], Math.round(QQoQOo / Oo0QoQ) * QOoOOO, Math.round(OoOoO0 / 2) * ooQOQO);
    }
}

2、下面是根据上述代码改写的js;打印输出可以清楚的看到还原逻辑
[JavaScript] 纯文本查看 复制代码
// 这段js逻辑是切割小图,分2层,每层8张小图,共计16张小图
O0QoQ0 = {}
for (var ooQOQO = 0; ooQOQO < 2; ooQOQO++) {
        O0QoQ0[ooQOQO] = {};
        for (var QOoOOO = 0; QOoOOO < 8; QOoOOO++) {
            var oQO0Q0 = [Math.round(320 / 8) * QOoOOO, Math.round(180 / 2) * ooQOQO, Math.round(320 / 8), Math.round(180 / 2)];
            O0QoQ0[ooQOQO][QOoOOO] = oQO0Q0;
        }
    }
console.log('图片切割成小图');
console.log(O0QoQ0);

// 这段js逻辑是将切割好的小图,按一定的规律重新排序
QOQ0oo = '4F387A69D1C2B50E' // 这里是请求图片接口返回的 bgImageSplitSequence 参数值
OQQ000 = [{}, {}];
for (var QOoOOO = 0; QOoOOO < QOQ0oo.length; QOoOOO++) {
        var oOOoQO = parseInt(QOQ0oo[QOoOOO], 16);
        console.log(oOOoQO);
        if (oOOoQO < 8) {
            OQQ000[0][oOOoQO] = {};
            if (QOoOOO >= 8) {
                OQQ000[0][oOOoQO] = O0QoQ0[1][QOoOOO - 8];
            } else {
                OQQ000[0][oOOoQO] = O0QoQ0[0][QOoOOO];
            }
        } else {
            OQQ000[1][oOOoQO - 8] = {};
            if (QOoOOO >= 8) {
                OQQ000[1][oOOoQO - 8] = O0QoQ0[1][QOoOOO - 8];
            } else {
                OQQ000[1][oOOoQO - 8] = O0QoQ0[0][QOoOOO];
            }
        }
    }
console.log('小图进行重新排序');
console.log(OQQ000);

// 这段js逻辑是将重新排序好的小图,按2层,每层8张进行拼接
for (var ooQOQO = 0; ooQOQO < 2; ooQOQO++) {
    for (var QOoOOO = 0; QOoOOO < 8; QOoOOO++) {
        img_xy = [OQQ000[ooQOQO][QOoOOO], Math.round(320 / 8) * QOoOOO, Math.round(180 / 2) * ooQOQO];
        console.log("拼接小图", img_xy);
        }
}


3、python代码实现图片还原操作
[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[ce] = {}
        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[ce][i] = 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[ce][i] = 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[x], 16)
        if i < 8:
            new_img_ceng[0][i] = {}
            if x >=8:
                new_img_ceng[0][i] = img_ceng[1][x-8]
            else:
                new_img_ceng[0][i] = img_ceng[0][x]
        else:
            new_img_ceng[1][i-8] = {}
            if x >=8:
                new_img_ceng[1][i-8] = img_ceng[1][x-8]
                
            else:
                new_img_ceng[1][i-8] = img_ceng[0][x]
    # 进行还原拼接操作
    for ce in range(0, 2):
        for i in range(0, 8):
            new_img.paste(new_img_ceng[ce][i], (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、那些参数需要变化和生成
[JavaScript] 纯文本查看 复制代码
// 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、模拟生成鼠标移动轨迹----->生成请求参数发送请求----->获取最终结果
声明:本文章仅供学习使用,上述代码请不要违规使用,所造成的一切不良后果与作者无关;如有侵权,请联系删除!!!

免费评分

参与人数 28吾爱币 +28 热心值 +28 收起 理由
overflow + 1 + 1 我很赞同!
anda + 1 + 1 我很赞同!
oxs + 1 + 1 用心讨论,共获提升!
angelabebe + 1 + 1 热心回复!
Behind1 + 1 + 1 用心讨论,共获提升!
modesty88 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wocaitou + 1 + 1 用心讨论,共获提升!
iTMZhang + 1 + 1 细!太细了!顶起来!
fengbolee + 2 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Yangzaipython + 1 + 1 谢谢@Thanks!
我嗳破解 + 1 + 1 热心回复!
liyitong + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
alenmusk + 1 + 1 鼓励转贴优秀软件安全工具和文档!
西枫游戏 + 1 + 1 谢谢@Thanks!
allspark + 1 + 1 用心讨论,共获提升!
AngobertWolf + 1 + 1 谢谢@Thanks!
ciker_li + 3 + 1 谢谢@Thanks!
抱歉、 + 1 用心讨论,共获提升!
lccccccc + 1 + 1 用心讨论,共获提升!
Roym + 1 用心讨论,共获提升!
BonnieRan + 1 + 1 用心讨论,共获提升!
gxr940301 + 1 + 1 我很赞同!
hudnc + 1 + 1 谢谢@Thanks!
lock3r + 1 + 1 谢谢@Thanks!
mongoole + 1 + 1 谢谢@Thanks!
Voccoo + 1 + 1 我很赞同!
dxiaolong + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
liuxuming3303 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
sss15 发表于 2024-2-23 10:22
厉害,但是有一个点要注意的,p1里面有一些写死的字符串,可能是用来钓鱼的,他定期会换字符串,然后如果脚本没更新的话,也能请求成功,但是他后台会记录

免费评分

参与人数 1吾爱币 +1 收起 理由
liyitong + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

推荐
我嗳破解 发表于 2024-2-24 19:45
授人以鱼不如授人以渔,感谢楼主的思路介绍及分析,努力学习
推荐
opacity 发表于 2024-3-14 16:18
推荐
2205 发表于 2024-2-23 21:55
9个参数,逐个转写。。还有大小的Oo搞物理混淆,这。。。。不仅需要技术,还需要克服懒惰的毅力。佩服大佬。
4#
ioyr5995 发表于 2024-2-23 06:47
正想学这个呢,谢谢分享!
5#
dxiaolong 发表于 2024-2-23 08:56
太细了,收藏了
6#
misterLee666 发表于 2024-2-23 15:48
详细的有点过分了,厉害!
7#
ycb510725 发表于 2024-2-23 16:16
点赞,很好,少走好些远路
8#
renjw234 发表于 2024-2-23 16:34
感谢分享,很受用
9#
nulizhuanqian 发表于 2024-2-23 16:43
厉害啊,好详细
10#
flyclass 发表于 2024-2-24 10:46
学习了,谢谢楼主的辛苦劳动和热心分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 14:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表