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

查看 119|回复 11
作者:xiaopacai888   
某盾滑块验证:从0到1,逐步分析 (图片还原、轨迹模拟)
一、目标网址:aHR0cHM6Ly9zZWMueGlhb2R1bi5jb20vb25saW5lRXhwZXJpZW5jZS9zbGlkaW5nUHV6emxl
二、接口分析


1.png (147.19 KB, 下载次数: 0)
下载附件
2024-2-22 08:50 上传



2.png (116.12 KB, 下载次数: 0)
下载附件
2024-2-22 08:50 上传

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


3.png (422.17 KB, 下载次数: 0)
下载附件
2024-2-22 08:52 上传



4.png (76.59 KB, 下载次数: 0)
下载附件
2024-2-22 08:52 上传



5.png (200.07 KB, 下载次数: 0)
下载附件
2024-2-22 08:52 上传



6.png (314.72 KB, 下载次数: 0)
下载附件
2024-2-22 08:52 上传

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


1.png (87.12 KB, 下载次数: 0)
下载附件
2024-2-22 08:53 上传



2.png (80.65 KB, 下载次数: 0)
下载附件
2024-2-22 08:54 上传



3.png (121.68 KB, 下载次数: 0)
下载附件
2024-2-22 08:59 上传



4.png (86.99 KB, 下载次数: 0)
下载附件
2024-2-22 09:00 上传



5.png (15.92 KB, 下载次数: 0)
下载附件
2024-2-22 09:00 上传



6.png (66.46 KB, 下载次数: 0)
下载附件
2024-2-22 09:01 上传



7.png (28.91 KB, 下载次数: 0)
下载附件
2024-2-22 09:01 上传



8.png (13.14 KB, 下载次数: 0)
下载附件
2024-2-22 09:03 上传



9.png (23.1 KB, 下载次数: 0)
下载附件
2024-2-22 09:03 上传



10.png (14.32 KB, 下载次数: 0)
下载附件
2024-2-22 09:03 上传

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 = 97 && QOoOOO >> 2] >>> 24 - OoOQ0O % 4 * 8 & 255;
                        QQoooQ[QOoOOO + OoOQ0O >>> 2] |= oOOoQO >> 2] = ooQOQO[OoOQ0O >>> 2];
                    }
                }
                this.sigBytes += oQO0Q0;
                return this;
            },
            mb: function() {
                var oQQ0Qo = this.words;
                var QQoooQ = this.sigBytes;
                oQQ0Qo[QQoooQ >>> 2] &= 4294967295 > 16) & OoO00O;
                        oOoQoQ = 18000 * (oOoQoQ & 65535) + (oOoQoQ >> 16) & OoO00O;
                        var oQQ0Qo = (QooOoO  0.5 ? 1 : -1);
                    }
                    ;
                };
                for (var QOoOOO = 0, oQO0Q0; QOoOOO >> 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 >> 3] |= parseInt(oQQ0Qo.substr(QOoOOO, 2), 16) >> 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 >> 2] |= (oQQ0Qo.charCodeAt(QOoOOO) & 255) >> 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 >> 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 >> 6 - ooQQ0Q % 4 * 2;
                        var QoQQo0 = QOo0Oo | OOOQOQ;
                        OoOQ0O[oOOoQO >>> 2] |= QoQQo0 >> 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 >> 2] |= oQO0Q0 >> 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 >> 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 >> 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 >> 8;
                o0QQOQ[ooQOQO] = OOOQOQ >> 16;
                O0QoQo[ooQOQO] = OOOQOQ >> 24;
                ooO0O0[ooQOQO] = OOOQOQ;
                var OOOQOQ = QOo0Oo * 16843009 ^ ooQQ0Q * 65537 ^ oOOoQO * 257 ^ ooQOQO * 16843008;
                oO0QOQ[OoOQ0O] = OOOQOQ >> 8;
                Q0OQQO[OoOQ0O] = OOOQOQ >> 16;
                QQ00OO[OoOQ0O] = 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 >> 24;
                            ooQQ0Q = Oo0Q0Q[ooQQ0Q >>> 24] >> 16 & 255] >> 8 & 255]  6 && oOOoQO % ooQOQO == 4) {
                            ooQQ0Q = Oo0Q0Q[ooQQ0Q >>> 24] >> 16 & 255] >> 8 & 255] >> 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 >> 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] >> 16 & 255] >> 8 & 255] >> 24] >> 16 & 255] >> 8 & 255] >> 24] >> 16 & 255] >> 8 & 255] >> 24] >> 16 & 255] >> 8 & 255]


7.png (163.22 KB, 下载次数: 0)
下载附件
2024-2-22 09:06 上传



3、构造请求获取图片以及所需的数据,这个很简单,就不展开了
四、还原背景图


8.png (71.73 KB, 下载次数: 0)
下载附件
2024-2-22 09:06 上传



9.png (94.77 KB, 下载次数: 0)
下载附件
2024-2-22 09:06 上传



10.png (85.21 KB, 下载次数: 0)
下载附件
2024-2-22 09:07 上传



11.png (162.48 KB, 下载次数: 0)
下载附件
2024-2-22 09:07 上传



12.png (242.57 KB, 下载次数: 0)
下载附件
2024-2-22 09:07 上传

1、分析图片还原逻辑
[JavaScript] 纯文本查看 复制代码// 这段js逻辑是切割小图,分2层,每层8张小图,共计16张小图
for (var ooQOQO = 0; ooQOQO


13.png (33.3 KB, 下载次数: 0)
下载附件
2024-2-22 09:10 上传

[JavaScript] 纯文本查看 复制代码// 这段js逻辑是将切割好的小图,按一定的规律重新排序
OQQ000 = [{}, {}];
for (var QOoOOO = 0; 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、下面是根据上述代码改写的js;打印输出可以清楚的看到还原逻辑
[JavaScript] 纯文本查看 复制代码// 这段js逻辑是切割小图,分2层,每层8张小图,共计16张小图
O0QoQ0 = {}
for (var ooQOQO = 0; ooQOQO = 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


14.png (84.95 KB, 下载次数: 0)
下载附件
2024-2-22 09:12 上传

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 =8:
                new_img_ceng[0] = img_ceng[1][x-8]
            else:
                new_img_ceng[0] = 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], (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)


15.png (32.76 KB, 下载次数: 0)
下载附件
2024-2-22 09:13 上传



4、进行缺口距离计算、这里可以使用cv2、yolov8、ddddocr等;比较简单这里就不展开了
五、验证滑块请求------>获取valIDAteToken值


16.png (223.04 KB, 下载次数: 0)
下载附件
2024-2-22 09:13 上传

1、那些参数需要变化和生成
[JavaScript] 纯文本查看 复制代码// 1、QQoooQ.requestType = 3
// 2、QQoooQ.validateCodeObj 第一个接口返回数据
// 3、QQoooQ.userAnswer 需要还原
// 4、QQoooQ.mouseInfo 鼠标移动轨迹,需要还原(重点参数)
// 5、QQoooQ.usedTime 可以写个固定值,不要是0就好
// 其它参数不变


17.png (302.81 KB, 下载次数: 0)
下载附件
2024-2-22 09:14 上传



18.png (114.01 KB, 下载次数: 0)
下载附件
2024-2-22 09:14 上传



19.png (108.49 KB, 下载次数: 0)
下载附件
2024-2-22 09:15 上传

2、分析还原 userAnswer、mouseInfo 参数


11.png (78.08 KB, 下载次数: 0)
下载附件
2024-2-22 09:16 上传



12.png (33.92 KB, 下载次数: 0)
下载附件
2024-2-22 09:16 上传



20.png (245.52 KB, 下载次数: 0)
下载附件
2024-2-22 09:17 上传



3、鼠标轨迹分析


21.png (102.5 KB, 下载次数: 0)
下载附件
2024-2-22 09:17 上传



22.png (83.52 KB, 下载次数: 0)
下载附件
2024-2-22 09:18 上传



4、根据上述规律模拟处轨迹就可以了,代码就不贴了,知道规律了模拟生成就很简单了。
5、生成请求参数发送请求,和第一次获取图片请求一样,这里就不贴代码了,直接看下结果


23.png (73.33 KB, 下载次数: 0)
下载附件
2024-2-22 09:18 上传

总结:
1、分析接口
2、模拟接口请求参数发送请求----->获取背景图片----->还原图片----->计算缺口距离
3、模拟生成鼠标移动轨迹----->生成请求参数发送请求----->获取最终结果
声明:本文章仅供学习使用,上述代码请不要违规使用,所造成的一切不良后果与作者无关;如有侵权,请联系删除!!!

下载次数, 下载附件

sss15   

厉害,但是有一个点要注意的,p1里面有一些写死的字符串,可能是用来钓鱼的,他定期会换字符串,然后如果脚本没更新的话,也能请求成功,但是他后台会记录
我嗳破解   

授人以鱼不如授人以渔,感谢楼主的思路介绍及分析,努力学习
opacity   

很仔细了,有点东西啊
2205   

9个参数,逐个转写。。还有大小的Oo搞物理混淆,这。。。。不仅需要技术,还需要克服懒惰的毅力。佩服大佬。
ioyr5995   

正想学这个呢,谢谢分享!
dxiaolong   

太细了,收藏了
misterLee666   

详细的有点过分了,厉害!
ycb510725   

点赞,很好,少走好些远路
renjw234   

感谢分享,很受用
您需要登录后才可以回帖 登录 | 立即注册