一、站点分析

  MTime 时光网是一个电影媒体与电商服务平台,而这次做的模拟登录则是依靠其手机端站点,站点地址为:https://m.mtime.cn/#。切换到登录页面 ,再分别输入账号和错误的密码,点击登录,登录失败 ,截图如下:

  

  打开开发者工具, 选择“Network”,切换到“XHR”选项 ,找到一条名为 login.api 的请求,打开后可以发现就是登录所发送的请求,再查看该请求的参数部分 ,截图如下:

  

 

二 、参数破解

1.参数分析

  经过前面的分析可知有五个参数需要获取,分别是 t、name、password 、code 和 codeId,其中 code 和 codeId 目前看来是空的 ,无须处理 ,而 name 就是输入的手机号,password 应该是输入的密码加密后的结果,剩下一个 t 还不知道是什么含义 。

2.参数获取

  在开发者工具中 ,Ctrl + F 全局搜索“password ”,找到如下的 JavaScript 文件:

https://static3.mtime.cn/html5/20200116143308/js/views/member/signin.js

  打开该文件后搜索“password”,首先是获取 name 属性为“password”的输入框 ,在下文中还发现了 vcode 和 vcodeId,这两个就是后面请求所需的 code 和 vcode 参数的值,截图如下:

  

  继续搜索“password ” ,可以找到一个 getPassword() 方法,用于获取输入的密码内容,截图如下:   

  

  接着搜索“password” ,找到如下内容:

  

  这就是登录请求时的参数部分,其中密码 password 是将输入的密码进行加密后的结果,使用的是 f.desEcbPkcs7 方法 ,那这个方法具体是什么呢?

3.加密方法

  在上面的 JS 文件中的 217 行打上断点 ,然后刷新页面并重新登录,页面会进入 debugger 模式,然后选中 desEcbPkcs7 部分 ,点击后跳转到 app.all.min.js 中的如下代码部分:

  

  这个 af 函数就是加密方法了,其中用到了一个变量 CryptoJS,要获取这个变量的定义 ,就在上面代码中的1033行打上断点,再重新登录一遍,定位到 CryptoJS 的定义部分 ,截图如下:

  

  对于变量 CryptoJS 的定义包含在 libs.all.min.js 中,但这个文件中的代码量比较大,若全部复制下来使用会不方便 ,而我们也只需要得到对变量 CryptoJS 进行定义的代码就够了,所以建议先把该 JS 文件保存到本地,再用编辑器打开 ,就能很快地得到我们所需要的代码了 ,即使如此还是有一千四百多行(汗~)。

   1 var CryptoJS = CryptoJS || function (g, w) {
   2     var m = {}
   3         , q = m.lib = {}
   4         , j = q.Base = function () {
   5         function a() {
   6         }
   7 
   8         return {
   9             extend: function (e) {
  10                 a.prototype = this;
  11                 var c = new a;
  12                 return e && c.mixIn(e),
  13                     c.$super = this,
  14                     c
  15             },
  16             create: function () {
  17                 var c = this.extend();
  18                 return c.init.apply(c, arguments),
  19                     c
  20             },
  21             init: function () {
  22             },
  23             mixIn: function (c) {
  24                 for (var f in c) {
  25                     c.hasOwnProperty(f) && (this[f] = c[f])
  26                 }
  27                 c.hasOwnProperty("toString") && (this.toString = c.toString)
  28             },
  29             clone: function () {
  30                 return this.$super.extend(this)
  31             }
  32         }
  33     }()
  34         , v = q.WordArray = j.extend({
  35         init: function (a, c) {
  36             a = this.words = a || [],
  37                 this.sigBytes = c != w ? c : 4 * a.length
  38         },
  39         toString: function (a) {
  40             return (a || x).stringify(this)
  41         },
  42         concat: function (a) {
  43             var o = this.words
  44                 , f = a.words
  45                 , l = this.sigBytes
  46                 , a = a.sigBytes;
  47             this.clamp();
  48             if (l % 4) {
  49                 for (var c = 0; c < a; c++) {
  50                     o[l + c >>> 2] |= (f[c >>> 2] >>> 24 - 8 * (c % 4) & 255) << 24 - 8 * ((l + c) % 4)
  51                 }
  52             } else {
  53                 if (65535 < f.length) {
  54                     for (c = 0; c < a; c += 4) {
  55                         o[l + c >>> 2] = f[c >>> 2]
  56                     }
  57                 } else {
  58                     o.push.apply(o, f)
  59                 }
  60             }
  61             return this.sigBytes += a,
  62                 this
  63         },
  64         clamp: function () {
  65             var c = this.words
  66                 , a = this.sigBytes;
  67             c[a >>> 2] &= 4294967295 << 32 - 8 * (a % 4),
  68                 c.length = g.ceil(a / 4)
  69         },
  70         clone: function () {
  71             var a = j.clone.call(this);
  72             return a.words = this.words.slice(0),
  73                 a
  74         },
  75         random: function (e) {
  76             for (var a = [], c = 0; c < e; c += 4) {
  77                 a.push(4294967296 * g.random() | 0)
  78             }
  79             return v.create(a, e)
  80         }
  81     })
  82         , p = m.enc = {}
  83         , x = p.Hex = {
  84         stringify: function (a) {
  85             for (var o = a.words, a = a.sigBytes, f = [], l = 0; l < a; l++) {
  86                 var c = o[l >>> 2] >>> 24 - 8 * (l % 4) & 255;
  87                 f.push((c >>> 4).toString(16)),
  88                     f.push((c & 15).toString(16))
  89             }
  90             return f.join("")
  91         },
  92         parse: function (a) {
  93             for (var i = a.length, c = [], f = 0; f < i; f += 2) {
  94                 c[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f % 8)
  95             }
  96             return v.create(c, i / 2)
  97         }
  98     }
  99         , b = p.Latin1 = {
 100         stringify: function (a) {
 101             for (var i = a.words, a = a.sigBytes, c = [], f = 0; f < a; f++) {
 102                 c.push(String.fromCharCode(i[f >>> 2] >>> 24 - 8 * (f % 4) & 255))
 103             }
 104             return c.join("")
 105         },
 106         parse: function (a) {
 107             for (var i = a.length, c = [], f = 0; f < i; f++) {
 108                 c[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4)
 109             }
 110             return v.create(c, i)
 111         }
 112     }
 113         , h = p.Utf8 = {
 114         stringify: function (a) {
 115             try {
 116                 return decodeURIComponent(escape(b.stringify(a)))
 117             } catch (c) {
 118                 throw Error("Malformed UTF-8 data")
 119             }
 120         },
 121         parse: function (a) {
 122             return b.parse(unescape(encodeURIComponent(a)))
 123         }
 124     }
 125         , k = q.BufferedBlockAlgorithm = j.extend({
 126         reset: function () {
 127             this._data = v.create(),
 128                 this._nDataBytes = 0
 129         },
 130         _append: function (a) {
 131             "string" == typeof a && (a = h.parse(a)),
 132                 this._data.concat(a),
 133                 this._nDataBytes += a.sigBytes
 134         },
 135         _process: function (y) {
 136             var f = this._data
 137                 , s = f.words
 138                 , e = f.sigBytes
 139                 , l = this.blockSize
 140                 , z = e / (4 * l)
 141                 , z = y ? g.ceil(z) : g.max((z | 0) - this._minBufferSize, 0)
 142                 , y = z * l
 143                 , e = g.min(4 * y, e);
 144             if (y) {
 145                 for (var c = 0; c < y; c += l) {
 146                     this._doProcessBlock(s, c)
 147                 }
 148                 c = s.splice(0, y),
 149                     f.sigBytes -= e
 150             }
 151             return v.create(c, e)
 152         },
 153         clone: function () {
 154             var a = j.clone.call(this);
 155             return a._data = this._data.clone(),
 156                 a
 157         },
 158         _minBufferSize: 0
 159     });
 160     q.Hasher = k.extend({
 161         init: function () {
 162             this.reset()
 163         },
 164         reset: function () {
 165             k.reset.call(this),
 166                 this._doReset()
 167         },
 168         update: function (a) {
 169             return this._append(a),
 170                 this._process(),
 171                 this
 172         },
 173         finalize: function (a) {
 174             return a && this._append(a),
 175                 this._doFinalize(),
 176                 this._hash
 177         },
 178         clone: function () {
 179             var a = k.clone.call(this);
 180             return a._hash = this._hash.clone(),
 181                 a
 182         },
 183         blockSize: 16,
 184         _createHelper: function (a) {
 185             return function (e, c) {
 186                 return a.create(c).finalize(e)
 187             }
 188         },
 189         _createHmacHelper: function (a) {
 190             return function (e, c) {
 191                 return d.HMAC.create(a, c).finalize(e)
 192             }
 193         }
 194     });
 195     var d = m.algo = {};
 196     return m
 197 }(Math)
 198     , CryptoJS = CryptoJS || function (g, w) {
 199     var m = {}
 200         , q = m.lib = {}
 201         , j = q.Base = function () {
 202         function a() {
 203         }
 204 
 205         return {
 206             extend: function (e) {
 207                 a.prototype = this;
 208                 var c = new a;
 209                 return e && c.mixIn(e),
 210                     c.$super = this,
 211                     c
 212             },
 213             create: function () {
 214                 var c = this.extend();
 215                 return c.init.apply(c, arguments),
 216                     c
 217             },
 218             init: function () {
 219             },
 220             mixIn: function (c) {
 221                 for (var f in c) {
 222                     c.hasOwnProperty(f) && (this[f] = c[f])
 223                 }
 224                 c.hasOwnProperty("toString") &&
本文版权归趣KUAI排www.SEOguruBlog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ→61910465