xiaopacai888 发表于 2024-2-22 09:24

某盾滑块验证:从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、模拟生成鼠标移动轨迹----->生成请求参数发送请求----->获取最终结果
声明:本文章仅供学习使用,上述代码请不要违规使用,所造成的一切不良后果与作者无关;如有侵权,请联系删除!!!

sss15 发表于 2024-2-23 10:22

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

我嗳破解 发表于 2024-2-24 19:45

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

opacity 发表于 2024-3-14 16:18

很仔细了,有点东西啊

2205 发表于 2024-2-23 21:55

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

ioyr5995 发表于 2024-2-23 06:47

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

dxiaolong 发表于 2024-2-23 08:56

太细了,收藏了

misterLee666 发表于 2024-2-23 15:48

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

ycb510725 发表于 2024-2-23 16:16

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

renjw234 发表于 2024-2-23 16:34

感谢分享,很受用

nulizhuanqian 发表于 2024-2-23 16:43

厉害啊,好详细

flyclass 发表于 2024-2-24 10:46

学习了,谢谢楼主的辛苦劳动和热心分享
页: [1] 2 3 4 5 6
查看完整版本: 某盾滑块验证:从0到1,逐步分析 (图片还原、轨迹模拟)