吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 10719|回复: 223
上一主题 下一主题

[原创] 关于百度站长平台图片验证码的处理思路

    [复制链接]
跳转到指定楼层
楼主
ttyy008 发表于 2019-11-8 20:49 回帖奖励

直入主题:
百度升级后的验证码是比较恶心的,页面上说明AI验证码,名副其实,花了差不多2天的时间前后梳理算法,第一版跑的还算可以,可也仅仅撑了1周多。
昨天一更新,样本库图片大大提升,没得玩了。故而整理下自己的思路和代码,有了这篇文章。
实现图片自动校验,这里有2个核心的东西。客户端的js加密算法,图片旋转角度自动化识别。前者比较简单,可以通过浏览器打点监听定位到具体的脚本
位置,后者有些难度,你根本不知道需要选择多少角度,期间尝试用ocr识别,ml.net图片训练最终都难逃人工修正这一步。之所以第一版能跑得益于百度
刚刚更新,图片库不大,通过自动化程序把所有的验证码下载到本地进行修正,然后对图片做360度的标识计算存储,以便自动验证时候进行匹配。
1.先说下js部分,这部分一开始试着一步步溯源,然后用c#重新撸一遍,发现工作量有点大,它的PassMachine对象里面几个算法比较分散,且js被压
缩,调试花费的时间较大,于是换了一种思路,把https://ziyuan.baidu.com/static/ziyuan/pkg/js/base_16ee0ec.js (注意base_后面的字符串,可能是动态的)下
载到客户端,然后通过c#(本屌c#多年)与js进行交互绕过算法部分。
另一个文件https://ziyuan.baidu.com/static/ziyuan/widget/site/siteadd_845c6f7.js(注意siteadd_后面的数字,可能是动态的),里面针对于每个账号分配了ak参数:

页面载入时会初始化验证码算,所以首要的是获取ak这个参数;
考虑到2个js的文件里面都有参数(可能是版本号,也可能每个账号对应不同的参数),那第一步获取https://ziyuan.baidu.com/site/siteadd页面源代码,然后分析出
base_参数.js,和siteadd_参数.js,这2个文件,通过正则表达式获取siteadd这个js里面的ak参数,保存起来。通过字符串处理,将base这个js文件中依赖的外部库干
掉(防止交互执行)的时候js报错。然后构建一个html,便于WebBrowser和html页面通交互执行js
[HTML] 纯文本查看 复制代码
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">  
  <head>
    <meta charset="utf-8" />
    <title></title>	    
    <script>
	var PassMachine = "undefined" == typeof window.PassMachine ? {}
 : window.PassMachine;
(function () {
	var e = null,
	t = null,
	n = void 0;
	!function (t, i) {
		"object" == typeof n ? module.exports = n = i() : "function" == typeof e && e.amd ? e([], i) : t.CryptoJS = i()
	}
	(this, function () {
		var e = e || function (e, t) {
			var n = Object.create || function () {
				function e() {}
				return function (t) {
					var n;
					return e.prototype = t,
					n = new e,
					e.prototype = null,
					n
				}
			}
			(),
			i = {},
			o = i.lib = {},
			s = o.Base = function () {
				return {
					extend: function (e) {
						var t = n(this);
						return e && t.mixIn(e),
						t.hasOwnProperty("init") && this.init !== t.init || (t.init = function () {
							t.$super.init.apply(this, arguments)
						}),
						t.init.prototype = t,
						t.$super = this,
						t
					},
					create: function () {
						var e = this.extend();
						return e.init.apply(e, arguments),
						e
					},
					init: function () {},
					mixIn: function (e) {
						for (var t in e)
							e.hasOwnProperty(t) && (this[t] = e[t]);
						e.hasOwnProperty("toString") && (this.toString = e.toString)
					},
					clone: function () {
						return this.init.prototype.extend(this)
					}
				}
			}
			(),
			r = o.WordArray = s.extend({
					init: function (e, n) {
						e = this.words = e || [],
						this.sigBytes = n != t ? n : 4 * e.length
					},
					toString: function (e) {
						return (e || a).stringify(this)
					},
					concat: function (e) {
						var t = this.words,
						n = e.words,
						i = this.sigBytes,
						o = e.sigBytes;
						if (this.clamp(),
							i % 4)
							for (var s = 0; o > s; s++) {
								var r = n[s >>> 2] >>> 24 - s % 4 * 8 & 255;
								t[i + s >>> 2] |= r << 24 - (i + s) % 4 * 8
							}
						else
							for (var s = 0; o > s; s += 4)
								t[i + s >>> 2] = n[s >>> 2];
						return this.sigBytes += o,
						this
					},
					clamp: function () {
						var t = this.words,
						n = this.sigBytes;
						t[n >>> 2] &= 4294967295 << 32 - n % 4 * 8,
						t.length = e.ceil(n / 4)
					},
					clone: function () {
						var e = s.clone.call(this);
						return e.words = this.words.slice(0),
						e
					},
					random: function (t) {
						for (var n, i = [], o = function (t) {
							var t = t,
							n = 987654321,
							i = 4294967295;
							return function () {
								n = 36969 * (65535 & n) + (n >> 16) & i,
								t = 18e3 * (65535 & t) + (t >> 16) & i;
								var o = (n << 16) + t & i;
								return o /= 4294967296,
								o += .5,
								o * (e.random() > .5 ? 1 : -1)
							}
						}, s = 0; t > s; s += 4) {
							var c = o(4294967296 * (n || e.random()));
							n = 987654071 * c(),
							i.push(4294967296 * c() | 0)
						}
						return new r.init(i, t)
					}
				}),
			c = i.enc = {},
			a = c.Hex = {
				stringify: function (e) {
					for (var t = e.words, n = e.sigBytes, i = [], o = 0; n > o; o++) {
						var s = t[o >>> 2] >>> 24 - o % 4 * 8 & 255;
						i.push((s >>> 4).toString(16)),
						i.push((15 & s).toString(16))
					}
					return i.join("")
				},
				parse: function (e) {
					for (var t = e.length, n = [], i = 0; t > i; i += 2)
						n[i >>> 3] |= parseInt(e.substr(i, 2), 16) << 24 - i % 8 * 4;
					return new r.init(n, t / 2)
				}
			},
			d = c.Latin1 = {
				stringify: function (e) {
					for (var t = e.words, n = e.sigBytes, i = [], o = 0; n > o; o++) {
						var s = t[o >>> 2] >>> 24 - o % 4 * 8 & 255;
						i.push(String.fromCharCode(s))
					}
					return i.join("")
				},
				parse: function (e) {
					for (var t = e.length, n = [], i = 0; t > i; i++)
						n[i >>> 2] |= (255 & e.charCodeAt(i)) << 24 - i % 4 * 8;
					return new r.init(n, t)
				}
			},
			l = c.Utf8 = {
				stringify: function (e) {
					try {
						return decodeURIComponent(escape(d.stringify(e)))
					} catch (e) {
						throw new Error("Malformed UTF-8 data")
					}
				},
				parse: function (e) {
					return d.parse(unescape(encodeURIComponent(e)))
				}
			},
			u = o.BufferedBlockAlgorithm = s.extend({
					reset: function () {
						this._data = new r.init,
						this._nDataBytes = 0
					},
					_append: function (e) {
						"string" == typeof e && (e = l.parse(e)),
						this._data.concat(e),
						this._nDataBytes += e.sigBytes
					},
					_process: function (t) {
						var n = this._data,
						i = n.words,
						o = n.sigBytes,
						s = this.blockSize,
						c = 4 * s,
						a = o / c;
						a = t ? e.ceil(a) : e.max((0 | a) - this._minBufferSize, 0);
						var d = a * s,
						l = e.min(4 * d, o);
						if (d) {
							for (var u = 0; d > u; u += s)
								this._doProcessBlock(i, u);
							var f = i.splice(0, d);
							n.sigBytes -= l
						}
						return new r.init(f, l)
					},
					clone: function () {
						var e = s.clone.call(this);
						return e._data = this._data.clone(),
						e
					},
					_minBufferSize: 0
				}),
			f = (o.Hasher = u.extend({
						cfg: s.extend(),
						init: function (e) {
							this.cfg = this.cfg.extend(e),
							this.reset()
						},
						reset: function () {
							u.reset.call(this),
							this._doReset()
						},
						update: function (e) {
							return this._append(e),
							this._process(),
							this
						},
						finalize: function (e) {
							e && this._append(e);
							var t = this._doFinalize();
							return t
						},
						blockSize: 16,
						_createHelper: function (e) {
							return function (t, n) {
								return new e.init(n).finalize(t)
							}
						},
						_createHmacHelper: function (e) {
							return function (t, n) {
								return new f.HMAC.init(e, n).finalize(t)
							}
						}
					}),
				i.algo = {});
			return i
		}
		(Math);
		return e
	}),
	!function (i, o) {
		"object" == typeof n ? module.exports = n = o(t("./core.min"), t("./sha1.min"), t("./hmac.min")) : "function" == typeof e && e.amd ? e(["./core.min", "./sha1.min", "./hmac.min"], o) : o(i.CryptoJS)
	}
	(this, function (e) {
		return function () {
			var t = e,
			n = t.lib,
			i = n.Base,
			o = n.WordArray,
			s = t.algo,
			r = s.MD5,
			c = s.EvpKDF = i.extend({
					cfg: i.extend({
						keySize: 4,
						hasher: r,
						iterations: 1
					}),
					init: function (e) {
						this.cfg = this.cfg.extend(e)
					},
					compute: function (e, t) {
						for (var n = this.cfg, i = n.hasher.create(), s = o.create(), r = s.words, c = n.keySize, a = n.iterations; r.length < c; ) {
							d && i.update(d);
							var d = i.update(e).finalize(t);
							i.reset();
							for (var l = 1; a > l; l++)
								d = i.finalize(d),
								i.reset();
							s.concat(d)
						}
						return s.sigBytes = 4 * c,
						s
					}
				});
			t.EvpKDF = function (e, t, n) {
				return c.create(n).compute(e, t)
			}
		}
		(),
		e.EvpKDF
	}),
	!function (i, o) {
		"object" == typeof n ? module.exports = n = o(t("./core.min")) : "function" == typeof e && e.amd ? e(["./core.min"], o) : o(i.CryptoJS)
	}
	(this, function (e) {
		return function () {
			function t(e, t, n) {
				for (var i = [], s = 0, r = 0; t > r; r++)
					if (r % 4) {
						var c = n[e.charCodeAt(r - 1)] << r % 4 * 2,
						a = n[e.charCodeAt(r)] >>> 6 - r % 4 * 2;
						i[s >>> 2] |= (c | a) << 24 - s % 4 * 8,
						s++
					}
				return o.create(i, s)
			}
			var n = e,
			i = n.lib,
			o = i.WordArray,
			s = n.enc;
			s.Base64 = {
				stringify: function (e) {
					var t = e.words,
					n = e.sigBytes,
					i = this._map;
					e.clamp();
					for (var o = [], s = 0; n > s; s += 3)
						for (var r = t[s >>> 2] >>> 24 - s % 4 * 8 & 255, c = t[s + 1 >>> 2] >>> 24 - (s + 1) % 4 * 8 & 255, a = t[s + 2 >>> 2] >>> 24 - (s + 2) % 4 * 8 & 255, d = r << 16 | c << 8 | a, l = 0; 4 > l && n > s + .75 * l; l++)
							o.push(i.charAt(d >>> 6 * (3 - l) & 63));
					var u = i.charAt(64);
					if (u)
						for (; o.length % 4; )
							o.push(u);
					return o.join("")
				},
				parse: function (e) {
					var n = e.length,
					i = this._map,
					o = this._reverseMap;
					if (!o) {
						o = this._reverseMap = [];
						for (var s = 0; s < i.length; s++)
							o[i.charCodeAt(s)] = s
					}
					var r = i.charAt(64);
					if (r) {
						var c = e.indexOf(r);
						-1 !== c && (n = c)
					}
					return t(e, n, o)
				},
				_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
			}
		}
		(),
		e.enc.Base64
	}),
	!function (i, o) {
		"object" == typeof n ? module.exports = n = o(t("./core.min"), t("./evpkdf.min")) : "function" == typeof e && e.amd ? e(["./core.min", "./evpkdf.min"], o) : o(i.CryptoJS)
	}
	(this, function (e) {
		e.lib.Cipher || function (t) {
			var n = e,
			i = n.lib,
			o = i.Base,
			s = i.WordArray,
			r = i.BufferedBlockAlgorithm,
			c = n.enc,
			a = (c.Utf8,c.Base64),
			d = n.algo,
			l = d.EvpKDF,
			u = i.Cipher = r.extend({
					cfg: o.extend(),
					createEncryptor: function (e, t) {
						return this.create(this._ENC_XFORM_MODE, e, t)
					},
					createDecryptor: function (e, t) {
						return this.create(this._DEC_XFORM_MODE, e, t)
					},
					init: function (e, t, n) {
						this.cfg = this.cfg.extend(n),
						this._xformMode = e,
						this._key = t,
						this.reset()
					},
					reset: function () {
						r.reset.call(this),
						this._doReset()
					},
					process: function (e) {
						return this._append(e),
						this._process()
					},
					finalize: function (e) {
						e && this._append(e);
						var t = this._doFinalize();
						return t
					},
					keySize: 4,
					ivSize: 4,
					_ENC_XFORM_MODE: 1,
					_DEC_XFORM_MODE: 2,
					_createHelper: function () {
						function e(e) {
							return "string" == typeof e ? w : k
						}
						return function (t) {
							return {
								encrypt: function (n, i, o) {
									return e(i).encrypt(t, n, i, o)
								},
								decrypt: function (n, i, o) {
									return e(i).decrypt(t, n, i, o)
								}
							}
						}
					}
					()
				}),
			f = (i.StreamCipher = u.extend({
						_doFinalize: function () {
							var e = this._process(!0);
							return e
						},
						blockSize: 1
					}),
				n.mode = {}),
			p = i.BlockCipherMode = o.extend({
					createEncryptor: function (e, t) {
						return this.Encryptor.create(e, t)
					},
					createDecryptor: function (e, t) {
						return this.Decryptor.create(e, t)
					},
					init: function (e, t) {
						this._cipher = e,
						this._iv = t
					}
				}),
			h = f.CBC = function () {
				function e(e, n, i) {
					var o = this._iv;
					if (o) {
						var s = o;
						this._iv = t
					} else
						var s = this._prevBlock;
					for (var r = 0; i > r; r++)
						e[n + r] ^= s[r]
				}
				var n = p.extend();
				return n.Encryptor = n.extend({
						processBlock: function (t, n) {
							var i = this._cipher,
							o = i.blockSize;
							e.call(this, t, n, o),
							i.encryptBlock(t, n),
							this._prevBlock = t.slice(n, n + o)
						}
					}),
				n.Decryptor = n.extend({
						processBlock: function (t, n) {
							var i = this._cipher,
							o = i.blockSize,
							s = t.slice(n, n + o);
							i.decryptBlock(t, n),
							e.call(this, t, n, o),
							this._prevBlock = s
						}
					}),
				n
			}
			(),
			v = n.pad = {},
			m = v.Pkcs7 = {
				pad: function (e, t) {
					for (var n = 4 * t, i = n - e.sigBytes % n, o = i << 24 | i << 16 | i << 8 | i, r = [], c = 0; i > c; c += 4)
						r.push(o);
					var a = s.create(r, i);
					e.concat(a)
				},
				unpad: function (e) {
					var t = 255 & e.words[e.sigBytes - 1 >>> 2];
					e.sigBytes -= t
				}
			},
			y = (i.BlockCipher = u.extend({
						cfg: u.cfg.extend({
							mode: h,
							padding: m
						}),
						reset: function () {
							u.reset.call(this);
							var e = this.cfg,
							t = e.iv,
							n = e.mode;
							if (this._xformMode == this._ENC_XFORM_MODE)
								var i = n.createEncryptor;
							else {
								var i = n.createDecryptor;
								this._minBufferSize = 1
							}
							this._mode && this._mode.__creator == i ? this._mode.init(this, t && t.words) : (this._mode = i.call(n, this, t && t.words),
								this._mode.__creator = i)
						},
						_doProcessBlock: function (e, t) {
							this._mode.processBlock(e, t)
						},
						_doFinalize: function () {
							var e = this.cfg.padding;
							if (this._xformMode == this._ENC_XFORM_MODE) {
								e.pad(this._data, this.blockSize);
								var t = this._process(!0)
							} else {
								var t = this._process(!0);
								e.unpad(t)
							}
							return t
						},
						blockSize: 4
					}),
				i.CipherParams = o.extend({
						init: function (e) {
							this.mixIn(e)
						},
						toString: function (e) {
							return (e || this.formatter).stringify(this)
						}
					})),
			g = n.format = {},
			b = g.OpenSSL = {
				stringify: function (e) {
					var t = e.ciphertext,
					n = e.salt;
					if (n)
						var i = s.create([1398893684, 1701076831]).concat(n).concat(t);
					else
						var i = t;
					return i.toString(a)
				},
				parse: function (e) {
					var t = a.parse(e),
					n = t.words;
					if (1398893684 == n[0] && 1701076831 == n[1]) {
						var i = s.create(n.slice(2, 4));
						n.splice(0, 4),
						t.sigBytes -= 16
					}
					return y.create({
						ciphertext: t,
						salt: i
					})
				}
			},
			k = i.SerializableCipher = o.extend({
					cfg: o.extend({
						format: b
					}),
					encrypt: function (e, t, n, i) {
						i = this.cfg.extend(i);
						var o = e.createEncryptor(n, i),
						s = o.finalize(t),
						r = o.cfg;
						return y.create({
							ciphertext: s,
							key: n,
							iv: r.iv,
							algorithm: e,
							mode: r.mode,
							padding: r.padding,
							blockSize: e.blockSize,
							formatter: i.format
						})
					},
					decrypt: function (e, t, n, i) {
						i = this.cfg.extend(i),
						t = this._parse(t, i.format);
						var o = e.createDecryptor(n, i).finalize(t.ciphertext);
						return o
					},
					_parse: function (e, t) {
						return "string" == typeof e ? t.parse(e, this) : e
					}
				}),
			C = n.kdf = {},
			E = C.OpenSSL = {
				execute: function (e, t, n, i) {
					i || (i = s.random(8));
					var o = l.create({
							keySize: t + n
						}).compute(e, i),
					r = s.create(o.words.slice(t), 4 * n);
					return o.sigBytes = 4 * t,
					y.create({
						key: o,
						iv: r,
						salt: i
					})
				}
			},
			w = i.PasswordBasedCipher = k.extend({
					cfg: k.cfg.extend({
						kdf: E
					}),
					encrypt: function (e, t, n, i) {
						i = this.cfg.extend(i);
						var o = i.kdf.execute(n, e.keySize, e.ivSize);
						i.iv = o.iv;
						var s = k.encrypt.call(this, e, t, o.key, i);
						return s.mixIn(o),
						s
					},
					decrypt: function (e, t, n, i) {
						i = this.cfg.extend(i),
						t = this._parse(t, i.format);
						var o = i.kdf.execute(n, e.keySize, e.ivSize, t.salt);
						i.iv = o.iv;
						var s = k.decrypt.call(this, e, t, o.key, i);
						return s
					}
				})
		}
		()
	}),
	!function (i, o) {
		"object" == typeof n ? module.exports = n = o(t("./core.min")) : "function" == typeof e && e.amd ? e(["./core.min"], o) : o(i.CryptoJS)
	}
	(this, function (e) {
		!function () {
			var t = e,
			n = t.lib,
			i = n.Base,
			o = t.enc,
			s = o.Utf8,
			r = t.algo;
			r.HMAC = i.extend({
					init: function (e, t) {
						e = this._hasher = new e.init,
						"string" == typeof t && (t = s.parse(t));
						var n = e.blockSize,
						i = 4 * n;
						t.sigBytes > i && (t = e.finalize(t)),
						t.clamp();
						for (var o = this._oKey = t.clone(), r = this._iKey = t.clone(), c = o.words, a = r.words, d = 0; n > d; d++)
							c[d] ^= 1549556828,
							a[d] ^= 909522486;
						o.sigBytes = r.sigBytes = i,
						this.reset()
					},
					reset: function () {
						var e = this._hasher;
						e.reset(),
						e.update(this._iKey)
					},
					update: function (e) {
						return this._hasher.update(e),
						this
					},
					finalize: function (e) {
						var t = this._hasher,
						n = t.finalize(e);
						t.reset();
						var i = t.finalize(this._oKey.clone().concat(n));
						return i
					}
				})
		}
		()
	}),
	!function (i, o) {
		"object" == typeof n ? module.exports = n = o(t("./core.min"), t("./cipher-core.min")) : "function" == typeof e && e.amd ? e(["./core.min", "./cipher-core.min"], o) : o(i.CryptoJS)
	}
	(this, function (e) {
		return e.mode.ECB = function () {
			var t = e.lib.BlockCipherMode.extend();
			return t.Encryptor = t.extend({
					processBlock: function (e, t) {
						this._cipher.encryptBlock(e, t)
					}
				}),
			t.Decryptor = t.extend({
					processBlock: function (e, t) {
						this._cipher.decryptBlock(e, t)
					}
				}),
			t
		}
		(),
		e.mode.ECB
	}),
	!function (i, o) {
		"object" == typeof n ? module.exports = n = o(t("./core.min"), t("./cipher-core.min")) : "function" == typeof e && e.amd ? e(["./core.min", "./cipher-core.min"], o) : o(i.CryptoJS)
	}
	(this, function (e) {
		return e.pad.Pkcs7
	}),
	!function (i, o) {
		"object" == typeof n ? module.exports = n = o(t("./core.min"), t("./enc-base64.min"), t("./md5.min"), t("./evpkdf.min"), t("./cipher-core.min")) : "function" == typeof e && e.amd ? e(["./core.min", "./enc-base64.min", "./md5.min", "./evpkdf.min", "./cipher-core.min"], o) : o(i.CryptoJS)
	}
	(this, function (e) {
		return function () {
			var t = e,
			n = t.lib,
			i = n.BlockCipher,
			o = t.algo,
			s = [],
			r = [],
			c = [],
			a = [],
			d = [],
			l = [],
			u = [],
			f = [],
			p = [],
			h = [];
			!function () {
				for (var e = [], t = 0; 256 > t; t++)
					e[t] = 128 > t ? t << 1 : t << 1 ^ 283;
				for (var n = 0, i = 0, t = 0; 256 > t; t++) {
					var o = i ^ i << 1 ^ i << 2 ^ i << 3 ^ i << 4;
					o = o >>> 8 ^ 255 & o ^ 99,
					s[n] = o,
					r[o] = n;
					var v = e[n],
					m = e[v],
					y = e[m],
					g = 257 * e[o] ^ 16843008 * o;
					c[n] = g << 24 | g >>> 8,
					a[n] = g << 16 | g >>> 16,
					d[n] = g << 8 | g >>> 24,
					l[n] = g;
					var g = 16843009 * y ^ 65537 * m ^ 257 * v ^ 16843008 * n;
					u[o] = g << 24 | g >>> 8,
					f[o] = g << 16 | g >>> 16,
					p[o] = g << 8 | g >>> 24,
					h[o] = g,
					n ? (n = v ^ e[e[e[y ^ v]]],
						i ^= e[e[i]]) : n = i = 1
				}
			}
			();
			var v = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54],
			m = o.AES = i.extend({
					_doReset: function () {
						if (!this._nRounds || this._keyPriorReset !== this._key) {
							for (var e = this._keyPriorReset = this._key, t = e.words, n = e.sigBytes / 4, i = this._nRounds = n + 6, o = 4 * (i + 1), r = this._keySchedule = [], c = 0; o > c; c++)
								if (n > c)
									r[c] = t[c];
								else {
									var a = r[c - 1];
									c % n ? n > 6 && c % n == 4 && (a = s[a >>> 24] << 24 | s[a >>> 16 & 255] << 16 | s[a >>> 8 & 255] << 8 | s[255 & a]) : (a = a << 8 | a >>> 24,
										a = s[a >>> 24] << 24 | s[a >>> 16 & 255] << 16 | s[a >>> 8 & 255] << 8 | s[255 & a],
										a ^= v[c / n | 0] << 24),
									r[c] = r[c - n] ^ a
								}
							for (var d = this._invKeySchedule = [], l = 0; o > l; l++) {
								var c = o - l;
								if (l % 4)
									var a = r[c];
								else
									var a = r[c - 4];
								d[l] = 4 > l || 4 >= c ? a : u[s[a >>> 24]] ^ f[s[a >>> 16 & 255]] ^ p[s[a >>> 8 & 255]] ^ h[s[255 & a]]
							}
						}
					},
					encryptBlock: function (e, t) {
						this._doCryptBlock(e, t, this._keySchedule, c, a, d, l, s)
					},
					decryptBlock: function (e, t) {
						var n = e[t + 1];
						e[t + 1] = e[t + 3],
						e[t + 3] = n,
						this._doCryptBlock(e, t, this._invKeySchedule, u, f, p, h, r);
						var n = e[t + 1];
						e[t + 1] = e[t + 3],
						e[t + 3] = n
					},
					_doCryptBlock: function (e, t, n, i, o, s, r, c) {
						for (var a = this._nRounds, d = e[t] ^ n[0], l = e[t + 1] ^ n[1], u = e[t + 2] ^ n[2], f = e[t + 3] ^ n[3], p = 4, h = 1; a > h; h++) {
							var v = i[d >>> 24] ^ o[l >>> 16 & 255] ^ s[u >>> 8 & 255] ^ r[255 & f] ^ n[p++],
							m = i[l >>> 24] ^ o[u >>> 16 & 255] ^ s[f >>> 8 & 255] ^ r[255 & d] ^ n[p++],
							y = i[u >>> 24] ^ o[f >>> 16 & 255] ^ s[d >>> 8 & 255] ^ r[255 & l] ^ n[p++],
							g = i[f >>> 24] ^ o[d >>> 16 & 255] ^ s[l >>> 8 & 255] ^ r[255 & u] ^ n[p++];
							d = v,
							l = m,
							u = y,
							f = g
						}
						var v = (c[d >>> 24] << 24 | c[l >>> 16 & 255] << 16 | c[u >>> 8 & 255] << 8 | c[255 & f]) ^ n[p++],
						m = (c[l >>> 24] << 24 | c[u >>> 16 & 255] << 16 | c[f >>> 8 & 255] << 8 | c[255 & d]) ^ n[p++],
						y = (c[u >>> 24] << 24 | c[f >>> 16 & 255] << 16 | c[d >>> 8 & 255] << 8 | c[255 & l]) ^ n[p++],
						g = (c[f >>> 24] << 24 | c[d >>> 16 & 255] << 16 | c[l >>> 8 & 255] << 8 | c[255 & u]) ^ n[p++];
						e[t] = v,
						e[t + 1] = m,
						e[t + 2] = y,
						e[t + 3] = g
					},
					keySize: 8
				});
			t.AES = i._createHelper(m)
		}
		(),
		e.AES
	}),
	!function (i, o) {
		"object" == typeof n ? module.exports = n = o(t("./core.min")) : "function" == typeof e && e.amd ? e(["./core.min"], o) : o(i.CryptoJS)
	}
	(this, function (e) {
		return e.enc.Utf8
	})
}).call(PassMachine);
var PassMachine = "undefined" == typeof window.PassMachine ? {}
 : window.PassMachine;
PassMachine.loadCss = PassMachine.loadCss || function (e, t) {
	var n = document,
	i = n.createElement("link");
	i.rel = "stylesheet",
	i.type = "text/css",
	i.href = e,
	i.disabled = !1,
	n.getElementsByTagName("head")[0].appendChild(i),
	i.readyState ? i.onreadystatechange = function () {
		("loaded" === i.readyState || "complete" === i.readyState) && (i.onreadystatechange = null,
			t && t())
	}
	 : i.onload = function () {
		t && t()
	}
},
PassMachine.loadJs = PassMachine.loadJs || function (e, t) {
	var n = document,
	i = n.createElement("SCRIPT");
	i.type = "text/javascript",
	i.charset = "UTF-8",
	i.src = e,
	n.getElementsByTagName("head")[0].appendChild(i),
	i.readyState ? i.onreadystatechange = function () {
		("loaded" === i.readyState || "complete" === i.readyState) && (i.onreadystatechange = null,
			t && t())
	}
	 : i.onload = function () {
		t && t()
	}
};
var con = {
	mkd: "https://wappass.baidu.com/static/machine/css/api/mkd.css"
};
//PassMachine.loadCss(con.mkd, function () {});
var PassMachine = "undefined" == typeof window.PassMachine ? {}
 : window.PassMachine;
!function (e, t) {
	function n() {
		var e = new Date,
		t = e.getTime();
		return t
	}
	function i(e) {
		function t(e) {
			e.type = (e.type || "GET").toUpperCase(),
			e.data = i(e.data);
			var t = null;
			t = window.XMLHttpRequest ? new XMLHttpRequest : new window.ActiveXObjcet("Microsoft.XMLHTTP"),
			t.onreadystatechange = function () {
				if (4 === t.readyState) {
					var n = t.status;
					if (n >= 200 && 300 > n) {
						var i = "",
						o = t.getResponseHeader("Content-type");
						i = -1 !== o.indexOf("xml") && t.responseXML ? t.responseXML : "application/json" === o ? JSON.parse(t.responseText) : t.responseText,
						e.success && e.success(i)
					} else
						e.error && e.error(n)
				}
			},
			"GET" === e.type ? (t.open(e.type, e.url + "?" + e.data, !0),
				t.send(null)) : (t.open(e.type, e.url, !0),
				t.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"),
				t.send(e.data))
		}
		function n(e) {
			var t = e.jsonp + o(),
			n = document.getElementsByTagName("head")[0];
			e.data.callback = t;
			var s = i(e.data),
			r = document.createElement("script");
			r.onload = function () {
				setTimeout(function () {
					window[t] && (e.error && e.error(),
						e.mkdGetRequestError = !0)
				}, 200)
			},
			n.appendChild(r),
			window[t] = function (i) {
				n.removeChild(r),
				clearTimeout(r.timer),
				window[t] = null,
				e.success && e.success(i)
			},
			r.onerror = function (t) {
				e.error && e.error(t),
				e.mkdGetRequestError = !0
			},
			r.src = e.url + "?" + s,
			e.time && (r.timer = setTimeout(function () {
						window[t] = null,
						n.removeChild(r),
						e.mkdGetRequestError || e.error && e.error({
							message: "超时"
						})
					}, e.time))
		}
		function i(e) {
			var t = [];
			for (var n in e)
				e.hasOwnProperty(n) && t.push(encodeURIComponent(n) + "=" + encodeURIComponent(e[n]));
			return t.push("v=" + o()),
			t.push("t=" + (new Date).getTime()),
			t.join("&")
		}
		function o() {
			return Math.floor(1e4 * Math.random() + 500)
		}
		e = e || {},
		e.data = e.data || {},
		e.jsonp ? n(e) : t(e)
	}
	function o(e, t) {
		var n;
		return function () {
			return n ? void 0 : (n = setTimeout(function () {
						n = null
					}, t),
				e.apply(this))
		}
	}
	function s() {
		try {
			var n = e.mozInnerScreenY || e.screenTop,
			i = e.mozInnerScreenX || e.screenLeft;
			"undefined" == typeof n && (n = 0),
			"undefined" == typeof i && (i = 0);
			var o = t.documentElement.clientWidth || t.body.clientWidth,
			s = t.documentElement.clientHeight || t.body.clientHeight,
			r = e.screen.width,
			c = e.screen.height,
			a = e.screen.availWidth,
			d = e.screen.availHeight,
			l = e.outerWidth,
			u = e.outerHeight,
			f = t.documentElement.scrollWidth || t.body.scrollWidth,
			p = t.documentElement.scrollWidth || t.body.scrollHeight;
			return {
				screenTop: n,
				screenLeft: i,
				clientWidth: o,
				clientHeight: s,
				screenWidth: r,
				screenHeight: c,
				availWidth: a,
				availHeight: d,
				outerWidth: l,
				outerHeight: u,
				scrollWidth: f,
				scrollHeight: p
			}
		} catch (h) {}
	}
	function r(e, t, n) {
		e.addEventListener ? e.addEventListener(t, n, !1) : e.attachEvent ? e.attachEvent("on" + t, n) : e["on" + t] = n
	}
	function c(e, t) {
		return !!e.className.match(new RegExp("(\\s|^)" + t + "(\\s|$)"))
	}
	function a(e, t) {
		return c(e, t) || (e.className,
			e.className += " " + t),
		this
	}
	function d(e, t) {
		return c(e, t) && (e.className = e.className.indexOf(" " + t + " ") >= 0 ? e.className.replace(new RegExp("(\\s|^)" + t + "(\\s|$)"), " ") : e.className.replace(new RegExp("(\\s|^)" + t + "(\\s|$)"), "")),
		this
	}
	function l(e, t, n) {
		e.removeEventListener ? e.removeEventListener(t, n, !1) : e.datachEvent ? e.detachEvent("on" + t, n) : e["on" + t] = null
	}
	function u(e) {
		e.preventDefault ? e.preventDefault() : e.returnValue = !1
	}
	
	
	try {
		var f = window.navigator.userAgent.toLowerCase(),
		p = "";
		if ((f.match(/msie\s\d+/) && f.match(/msie\s\d+/)[0] || f.match(/trident\s?\d+/) && f.match(/trident\s?\d+/)[0]) && (p = f.match(/msie\s\d+/)[0].match(/\d+/)[0] || f.match(/trident\s?\d+/)[0]),
			p && 9 > p)
			return !1;
		var h,
		v,
		m = {
			testUrl: "https://bjyz-passport-antispam01.bjyz.baidu.com:8888/viewlog",
			onlineUrl: "https://passport.baidu.com/viewlog"
		};
		PassMachine.mkd = function (e) {
			this.init(e)
		},
		PassMachine.mkd.prototype = {
			init: function (t) {
				var n = this;
				this.initConfig(t),
				this.mobilecheck(),
				this.initMock(),
				e.PassMachine.haveMkd ? setTimeout(function () {
					n.conf.initApiSuccessFn && n.conf.initApiSuccessFn(e.PassMachine.haveMkd.dsData)
				}, 0) : (e.PassMachine.haveMkd = this)
			},
			initConfig: function (e) {
				this.conf = e,
				this.lang = {
					securityVerify: e.slideConfig && e.slideConfig.headTitle || "安全验证",
					introducer: e.slideConfig && e.slideConfig.conTitle || "滑至最右 完成验证",
					bottomTitle: e.slideConfig && e.slideConfig.bottomTitle || "为了你的帐号安全,本次操作需要进行安全验证",
					verifySuccess: e.slideConfig && e.slideConfig.finishTitle || "验证成功",
					verifyError: e.slideConfig && e.slideConfig.errorTitle || "验证失败",
					spinHeadTitle: e.spinConfig && e.spinConfig.headTitle || "身份验证",
					spinTipTitle: e.spinConfig && e.spinConfig.tipTitle || "拖动滑块,使图片角度为正",
					spinTntroducer: e.spinConfig && e.spinConfig.spinRightTitle || "请将图片角度转动为正"
				},
				this.protocol = "https:",
				this.store = {
					storeVer: "1.0.1",
					count: 0,
					countnum: 10,
					nameL: "6bffae1c",
					nameR: "appsapi0",
					sendUrl: e.sendUrl || m.onlineUrl
				},
				this.conf && this.conf.testurl && (this.store.sendUrl = m.testUrl),
				this.store.getStyleUrl = this.store.sendUrl + "/getstyle",
				this.store.ak = e.ak || "",
				this.store.type = e.type || "default",
				this.store.id = e.id || "mkd",
				this.num = Math.floor(1e3 * Math.random())
			},
			mobilecheck: function () {
				try {
					var e = navigator.platform || "Win";
					/Android|webOS|iPhone|iPod|iPad|BlackBerry/i.test(navigator.userAgent) ? this.wapsetconfig() : e.indexOf("Mac") > -1 && "ontouchend" in document ? this.wapsetconfig() : "ontouchend" in document && -1 === e.indexOf("Win") && -1 === e.indexOf("Mac") ? this.wapsetconfig() : this.pcsetconfig()
				} catch (t) {
					this.wapsetconfig()
				}
			},
			wapsetconfig: function () {
				this.devicetype = "wap",
				this.eventclick = "touchstart",
				this.eventmove = "touchmove",
				this.eventend = "touchend",
				this.eventend2 = "touchcancel",
				this.store.countnum = 10
			},
			pcsetconfig: function () {
				this.devicetype = "pc",
				this.eventclick = "mousedown",
				this.eventmove = "mousemove",
				this.eventend = "mouseup",
				this.store.countnum = 20
			},
			initMock: function () {
				this.rzData = {
					cl: [],
					mv: [],
					sc: [],
					kb: [],
					cr: s(),
					simu: window.navigator.webdriver ? 1 : 0,
					ac_c: 0
				},
				this.dsData = {}
			},
			initApi: function () {
				var e = this,
				t = {};
				t.ak = e.store.ak,
				i({
					url: e.store.sendUrl,
					jsonp: "jsonpCallbackA1",
					data: t,
					time: 1e4,
					success: function (t) {
						1 === t.code ? (console.log(t.msg),
							h = 1,
							v = t.msg,
							e.conf.initApiErrorFn && e.conf.initApiErrorFn(t)) : (e.dsData = t.data || {},
							e.store.nameL = t.data.as || "6bffae1c",
							e.initGatherEvent(),
							e.conf.initApiSuccessFn && e.conf.initApiSuccessFn(e.dsData))
					},
					error: function () {
						e.errorData(),
						e.initGatherEvent(),
						e.conf.initApiErrorFn && e.conf.initApiErrorFn(e.dsData)
					}
				})
			},
			initGatherEvent: function () {
				var i = this,
				s = function (t) {
					t = t || e.event;
					var o = {},
					s = "wap" === i.devicetype ? t.changedTouches[0] : t;
					o.x = parseInt(s.clientX, 10),
					o.y = parseInt(s.clientY, 10),
					o.t = n(),
					i.rzData.cl.push(o),
					i.reportedOpportunity()
				},
				c = o(function (t) {
						t = t || e.event || arguments.callee.caller.arguments[0];
						var o = {},
						s = "wap" === i.devicetype ? t.changedTouches[0] : t;
						o.fx = parseInt(s.clientX, 10),
						o.fy = parseInt(s.clientY, 10),
						o.t = n(),
						i.rzData.mv.push(o),
						i.reportedOpportunity()
					}, 150),
				a = function () {
					var e = {};
					e.key = "a",
					e.t = n(),
					i.rzData.kb.push(e),
					i.reportedOpportunity()
				},
				d = o(function (n) {
						n = n || e.event;
						var o = {};
						o.tx = t.documentElement.scrollLeft || t.body.scrollLeft,
						o.ty = t.documentElement.scrollTop || t.body.scrollTop,
						i.rzData.sc.push(o),
						i.reportedOpportunity()
					}, 300);
				r(t, i.eventclick, s),
				r(t, i.eventmove, c),
				r(t, "keyup", a),
				r(e, "scroll", d),
				i.removeGatherEvent = function () {
					l(t, i.eventclick, s),
					l(t, i.eventmove, c),
					l(t, "keyup", a),
					l(e, "scroll", d)
				}
			},
			getStyleInfo: function (e, t, n) {
				var o = this,
				s = {};
				s.ak = o.store.ak,
				s.type = n && n.type || o.store.type || "default",
				i({
					url: o.store.getStyleUrl,
					jsonp: "jsonpCallbackA2",
					data: s,
					time: 1e4,
					success: function (t) {
						return 1 === t.code ? void console.log(t.msg) : (o.conf.backstr = t.data.backstr,
							"spin" === t.data.type ? (o.conf.type = "spin",
								o.conf.ext = t.data.ext) : o.conf.type = "slide",
							void e(t))
					},
					error: function () {
						console.log("error"),
						o.conf.type = "slide",
						t()
					}
				})
			},
			postData: function (t, n) {
				if (1 === h)
					return console.log(v),
					this.removeGatherEvent && this.removeGatherEvent(),
					this.removeVcodeEvent && this.removeVcodeEvent(),
					!1;
				var o = e.PassMachine.haveMkd || this,
				s = JSON.stringify(o.rzData),
				r = o.encrypt(s),
				c = {};
				c.ak = o.store.ak,
				c.as = o.store.nameL || "",
				c.fs = r,
				c.tk = o.dsData.tk || "",
				n && (c.cv = n),
				o.store.count = 0,
				o.initMock(),
				i({
					url: o.store.sendUrl,
					jsonp: "jsonpCallbackb",
					data: c,
					time: 1e4,
					success: function (e) {
						if (0 === e.code && e.data) {
							o.dsData = e.data || {},
							o.store.nameL = e.data.as || "6bffae1c";
							var n = e.data;
							delete n.as,
							t && t(n)
						} else
							1 === e.code ? (console.log(e.msg),
								o.removeGatherEvent && o.removeGatherEvent(),
								o.removeVcodeEvent && o.removeVcodeEvent(),
								h = 1) : (o.errorData(),
								t && t(o.dsData))
					},
					error: function () {
						o.errorData(),
						t && t(o.dsData)
					}
				})
			},
			initVcode: function (e, t) {
				var n = this;
				n.getStyleInfo(function () {
					t && t(),
					"spin" === n.conf.type ? n.initSpinDom(e) : n.initSildeDom(e)
				}, function () {
					t && t(),
					n.initSildeDom(e)
				}, e)
			},
			initSildeDom: function (e) {
				var t = this;
				if (1 === h)
					return console.log(v),
					!1;
				e = e || {},
				e.id = e && e.id || this.store.id;
				var n = "",
				i = "",
				o = "";
				n = '<div class="vcode-slide-img"></div>',
				i = "vcode-slide-expression-x",
				o = "vcode-slide-loading-x",
				this.odiv = document.createElement("div");
				var s = this.odiv;
				s.className = this.conf.darkmode ? "mod-vcodes darkmode" : "mod-vcodes",
				s.id = "mod-vcodes" + this.num,
				s.innerHTML = '<div class="mod-vcode-content clearfix" id="pass-content' + this.num + '"><p class="mod-page-tipInfo-gray" id="pass-slide-tipInfo' + this.num + '">' + this.lang.securityVerify + '</p><div class="vcode-slide-faceboder" id="vcode-slide-faceboder' + this.num + '">' + n + '<div class="' + i + '" id="vcode-slide-expression' + this.num + '"></div></div><div class="vcode-slide-control"  id="pass-slide-control' + this.num + '"><div class="vcode-slide-bottom" id="vcode-slide-bottom' + this.num + '"><p id="vcode-slide-bottom-p' + this.num + '">' + this.lang.introducer + '</p></div><div class="vcode-slide-cover" id="vcode-slide-cover' + this.num + '"><p id="vcode-slide-cover-p' + this.num + '"></p></div><div class="vcode-slide-button" id="vcode-slide-button' + this.num + '"><p class="" id="vcode-slide-button-p' + this.num + '"></p></div><div class="' + o + '" id="vcode-slide-loading' + this.num + '"></div></div><p class="vcode-slide-footer" id="pass-slide-footer' + this.num + '">' + this.lang.bottomTitle + "</p></div>",
				e.slideSimple && (s.innerHTML = '<div class="mod-vcode-content clearfix padding0" id="pass-content' + this.num + '"><div class="none" id="vcode-slide-faceboder' + this.num + '"><div class="none" id="vcode-slide-expression' + this.num + '"></div></div><div class="vcode-slide-control  width100"  id="pass-slide-control' + this.num + '"><div class="vcode-slide-bottom" id="vcode-slide-bottom' + this.num + '"><p id="vcode-slide-bottom-p' + this.num + '">' + this.lang.introducer + '</p></div><div class="vcode-slide-cover" id="vcode-slide-cover' + this.num + '"><p id="vcode-slide-cover-p' + this.num + '"></p></div><div class="vcode-slide-button" id="vcode-slide-button' + this.num + '"><p class="" id="vcode-slide-button-p' + this.num + '"></p></div><div class="' + o + '" id="vcode-slide-loading' + this.num + '"></div></div></div>'),
				t.appendDomProcess(s, e),
				setTimeout(function () {
					t.initVcodeEvent()
				}, 100)
			},
			initSpinDom: function (e) {
				var t = this;
				if (1 === h)
					return console.log(v),
					!1;
				e = {},
				e.id = e && e.id || this.store.id;
				var n = "";
				n = '<div class="vcode-spin-faceboder" id="vcode-spin-faceboder' + this.num + '"><div class="vcode-spin-img" id="vcode-spin-img' + this.num + '"></div><div class="vcode-spin-mask hide" id="vcode-spin-mask' + this.num + '"></div><div class="vcode-spin-icon hide" id="vcode-spin-icon' + this.num + '"></div></div>';
				var i = "";
				i = '<div class="vcode-spin-control"  id="pass-spin-control' + this.num + '"><div class="vcode-spin-bottom" id="vcode-spin-bottom' + this.num + '"><p id="vcode-spin-bottom-p' + this.num + '">' + this.lang.spinTntroducer + '</p></div><div class="vcode-spin-button" id="vcode-spin-button' + this.num + '"><p class="" id="vcode-spin-button-p' + this.num + '"></p></div></div>';
				var o = decodeURIComponent(this.conf.ext && this.conf.ext.img) || "",
				s = this.conf.ext && this.conf.ext.info || "";
				this.odiv = document.createElement("div");
				var r = this.odiv;
				r.className = "mod-vcodes",
				r.id = "mod-vcodes" + this.num,
				r.innerHTML = '<div class="mod-vcode-content clearfix" id="pass-content' 
					+ this.num + '"><p class="mod-page-tipInfo-gray1" id="pass-slide-tipInfo' 
					+ this.num + '">' 
					+ this.lang.spinHeadTitle + '</p><p class="mod-page-tipInfo-gray2" id="pass-slide-tipInfo2' 
					+ this.num + '">' 
					+ this.lang.spinTipTitle + "</p>" + n + i + '<p class="vcode-slide-footer" id="pass-spin-footer' 
					+ this.num + '">' + s + "</p></div>",
				t.appendDomProcess(r, e);
				var c = document.getElementById("vcode-spin-img" + this.num);
				c.style.backgroundImage = "url(" + o + ")",
				setTimeout(function () {
					t.initVcodeEvent()
				}, 100)
			},
			appendDomProcess: function (e, t) {
				var n = this;
				if (this.conf && this.conf.maskModule === !0 && t.maskModule !== !1)
					this.createDialogMask(),
					this.createDialogBody(),
					d(this.maskDiv, "hide"),
					d(this.bodyDiv, "hide"),
					this.bodyDiv.appendChild(e),
					this.closeDiv = document.createElement("div"),
					this.closeDiv.className = "vcode-close",
					this.closeDiv.id = "vcode-close" + this.num,
					this.bodyDiv.appendChild(this.closeDiv),
					r(this.closeDiv, this.eventclick, function (e) {
						u(e),
						n.conf.closeFn && n.conf.closeFn(),
						n.removeMask()
					});
				else if (t && t.id) {
					if (document.getElementById(t.id).lastChild && "mod-vcodes" === document.getElementById(t.id).lastChild.className) {
						var i = document.getElementById(t.id);
						i.removeChild(i.lastChild),
						i.lastChild = null,
						this.removeVcodeEvent && this.removeVcodeEvent(),
						this.finish = !1,
						this.start = !1
					}
					document.getElementById(t.id).appendChild(e)
				} else
					document.appendChild(e);
				n.conf.initVcodeSuccessFn && n.conf.initVcodeSuccessFn()
			},
			initVcodeEvent: function () {
				"spin" === this.conf.type ? this.initSpinVcodeEvent() : this.initSildeVcodeEvent()
			},
			initSildeVcodeEvent: function () {
				var t = this,
				n = document.getElementById("mod-vcodes" + this.num),
				i = (document.getElementById("pass-content" + this.num),
					document.getElementById("pass-slide-control" + this.num),
					document.getElementById("pass-slide-tipInfo" + this.num),
					document.getElementById("pass-slide-footer" + this.num),
					document.getElementById("vcode-slide-faceboder" + this.num)),
				o = document.getElementById("vcode-slide-expression" + this.num),
				s = document.getElementById("vcode-slide-button" + this.num),
				c = document.getElementById("vcode-slide-bottom" + this.num),
				f = document.getElementById("vcode-slide-cover" + this.num),
				h = document.getElementById("vcode-slide-loading" + this.num),
				v = s.offsetWidth,
				m = document.getElementById("vcode-slide-bottom-p" + this.num),
				y = document.getElementById("vcode-slide-cover-p" + this.num),
				g = document.getElementById("vcode-slide-button-p" + this.num),
				b = c.offsetWidth - v;
				t.conf.slideConfig && "square" === t.conf.slideConfig.borderRadius && (a(s, "borderRadius"),
					a(c, "borderRadius"),
					a(f, "borderRadius"));
				var k = function () {
					var e = 0;
					e = p && 9 >= +p ? 500 : 700,
					h.style.display = "block",
					t.setData && (t.setData("ac_c", 1),
						t.setData("backstr", t.conf.backstr),
						t.postData(function (n) {
							var i = n;
							h.style.display = "none",
							1 === i.op ? (t.successUiCallback(),
								setTimeout(function () {
									t.conf.verifySuccessFn && t.conf.verifySuccessFn(i)
								}, e)) : t.errorUiCallback()
						}, "submit"))
				},
				C = function () {
					d(m, "hide"),
					a(f, "vcode-transition"),
					f.style.width = v + "px",
					a(s, "vcode-transition"),
					a(o, "vcode-transition"),
					a(m, "vcode-transition"),
					d(g, "opacity0");
					var e = 0;
					p && 9 >= +p ? (s.style["margin-left"] = "",
						o.style["margin-left"] = "",
						m.style["margin-left"] = "",
						e = 0) : (s.style.transform = "translateX(0)",
						s.style.msTransform = "translateX(0)",
						s.style.webkitTransform = "translateX(0)",
						s.style.MozTransform = "translateX(0)",
						s.style.OTransform = "translateX(0)",
						o.style.transform = "translateX(0)",
						o.style.msTransform = "translateX(0)",
						o.style.webkitTransform = "translateX(0)",
						o.style.MozTransform = "translateX(0)",
						o.style.OTransform = "translateX(0)",
						m.style.transform = "translateX(0)",
						m.style.msTransform = "translateX(0)",
						m.style.webkitTransform = "translateX(0)",
						m.style.MozTransform = "translateX(0)",
						m.style.OTransform = "translateX(0)",
						e = 300),
					setTimeout(function () {
						d(s, "vcode-transition"),
						d(s, "vcode-slide-button-focus"),
						t.conf.slideConfig && t.conf.slideConfig.color && (s.style = "",
							s.setAttribute("style", "")),
						d(s, "vcode-slide-button-error"),
						d(f, "vcode-slide-cover-error"),
						d(f, "vcode-transition"),
						d(i, "vcode-slidefaceboder-horizontal"),
						d(o, "vcode-transition"),
						d(m, "vcode-transition")
					}, e)
				};
				t.successUiCallback = function () {
					a(i, "vcode-slide-faceborder-animate"),
					a(y, "vcode-transition"),
					d(y, "coverp-hide"),
					a(y, "coverp-show"),
					y.innerHTML = t.lang.verifySuccess,
					a(g, "opacity0")
				},
				t.errorUiCallback = function (e) {
					t.conf.slideConfig && t.conf.slideConfig.color && (f.style.background = "",
						s.style.background = "",
						s.style.border = "");
					var n = e || {};
					a(s, "vcode-slide-button-error"),
					a(f, "vcode-slide-cover-error"),
					d(i, "vcode-slide-faceborder-animate"),
					a(i, "vcode-slidefaceboder-horizontal"),
					a(y, "vcode-transition"),
					d(y, "coverp-hide"),
					a(y, "coverp-show"),
					y.innerHTML = n.msg || t.lang.verifyError,
					setTimeout(function () {
						d(y, "coverp-show"),
						a(y, "coverp-hide"),
						y.innerHTML = "",
						C(),
						t.finish = !1,
						t.start = !1
					}, 1e3)
				};
				var E = function (n) {
					if (t.finish)
						return !1;
					t.start = !0,
					n = n || e.event,
					u(n);
					var i = "wap" === t.devicetype ? n.touches[0] || n.changedTouches[0] : n;
					a(s, "vcode-slide-button-focus"),
					t.conf.slideConfig && t.conf.slideConfig.color && (f.style.background = t.conf.slideConfig.color || "#4b96ea",
						s.style.background = t.conf.slideConfig.color || "#4b96ea",
						s.style.border = t.conf.slideConfig.color || "#4b96ea"),
					t.currentX = i.clientX
				},
				w = function (n) {
					if (t.finish || !t.start)
						return !1;
					n = n || e.event,
					u(n);
					var i = "wap" === t.devicetype ? n.changedTouches[0] : n,
					r = i.clientX - t.currentX;
					r >= b - 5 ? (r = b,
						t.finish = !0,
						k()) : 0 >= r && (r = 0);
					var c = parseFloat(r / b).toFixed(2);
					f.style.width = r + v + "px",
					p && 9 >= +p ? (s.style["margin-left"] = r + "px",
						o.style["margin-left"] = -563 * c + "px",
						m.style["margin-left"] = -75 + .1 * r + "px") : (s.style.transform = "translateX(" + r + "px)",
						s.style.msTransform = "translateX(" + r + "px)",
						s.style.webkitTransform = "translateX(" + r + "px)",
						s.style.MozTransform = "translateX(" + r + "px)",
						s.style.OTransform = "translateX(" + r + "px)",
						o.style.transform = "translateX(-" + 89.5 * c + "%)",
						o.style.msTransform = "translateX(-" + 89.5 * c + "%)",
						o.style.webkitTransform = "translateX(-" + 89.5 * c + "%)",
						o.style.MozTransform = "translateX(-" + 89.5 * c + "%)",
						o.style.OTransform = "translateX(-" + 89.5 * c + "%)",
						m.style.transform = "translateX(" + 10 * c + "%)")
				},
				x = function (n) {
					t.start = !1,
					n = n || e.event,
					u(n);
					var i = "wap" === t.devicetype ? n.changedTouches[0] : n,
					o = i.clientX - this.currentX;
					return 0 >= o ? (d(s, "vcode-slide-button-focus"),
						t.conf.slideConfig && t.conf.slideConfig.color && (s.style = ""),
						d(s, "vcode-slide-button-error")) : t.finish || C(),
					!1
				};
				r(s, t.eventclick, E),
				r(n, t.eventmove, w),
				r(n, t.eventend, x),
				t.eventend2 && r(n, t.eventend2, x),
				t.removeVcodeEvent = function () {
					l(s, t.eventclick, E),
					l(n, t.eventmove, w),
					l(n, t.eventend, x),
					t.eventend2 && l(n, t.eventend2, x)
				}
			},
			initSpinVcodeEvent: function () {
				function t() {
					n.getStyleInfo(function (e) {
						var t = document.getElementById("vcode-spin-img" + n.num);
						t.style.backgroundImage = "url(" + decodeURIComponent(e.data.ext && e.data.ext.img) + ")",
						g.innerHTML = e.data.ext && e.data.ext.info || ""
					})
				}
				var n = this,
				i = document.getElementById("mod-vcodes" + this.num),
				o = document.getElementById("pass-spin-control" + this.num),
				s = document.getElementById("vcode-spin-img" + this.num),
				c = document.getElementById("vcode-spin-mask" + this.num),
				f = document.getElementById("vcode-spin-icon" + this.num),
				p = document.getElementById("vcode-spin-button" + this.num),
				h = document.getElementById("vcode-spin-bottom" + this.num),
				v = p.offsetWidth,
				m = document.getElementById("vcode-spin-bottom-p" + this.num),
				y = document.getElementById("vcode-spin-button-p" + this.num),
				g = document.getElementById("pass-spin-footer" + this.num),
				b = h.offsetWidth - v;
				n.conf.spinConfig && "square" === n.conf.spinConfig.borderRadius && (a(p, "borderRadius"),
					a(h, "borderRadius"));
				var k = function () {
					d(p, "vcode-spin-button-focus"),
					a(p, "vcode-spin-button-loading"),
					d(c, "hide"),
					d(f, "hide"),
					a(f, "vcode-spin-icon-loading"),
					n.setData && (n.setData("ac_c", +n.percentage),
						n.setData("backstr", n.conf.backstr || ""),
						n.postData(function (e) {
							var t = e;
							1 === +t.op ? (n.successUiCallback(),
								setTimeout(function () {
									n.conf.verifySuccessFn && n.conf.verifySuccessFn(t)
								}, 500)) : n.errorUiCallback()
						}, "submit"))
				},
				C = function (e) {
					d(y, "opacity0");
					var t = 0;
					p.style.transform = "translateX(0)",
					p.style.msTransform = "translateX(0)",
					p.setAttribute("style", "transform:translateX(0)"),
					t = 300,
					d(p, "vcode-slide-button-focus"),
					d(p, "vcode-spin-button-error"),
					a(c, "hide"),
					a(f, "hide"),
					d(f, "vcode-spin-icon-error"),
					s.style.transform = "",
					s.style.msTransform = "",
					e && e()
				};
				n.successUiCallback = function () {
					d(f, "vcode-spin-icon-loading"),
					a(f, "vcode-spin-icon-success")
				},
				n.errorUiCallback = function (e) {
					d(f, "vcode-spin-icon-loading"),
					a(f, "vcode-spin-icon-error"),
					a(o, "vcode-spin-control-horizontal"),
					d(p, "vcode-spin-button-loading"),
					a(p, "vcode-spin-button-error");
					var i = 1e3;
					e && "spinRight" === e.type && (i = 3e3),
					setTimeout(function () {
						d(o, "vcode-spin-control-horizontal"),
						C(function () {
							t()
						}),
						n.finish = !1,
						n.start = !1,
						e && "spinRight" === e.type && (d(m, "vcode-transition-25"),
							d(h, "vcode-spin-bottom-top"))
					}, i)
				};
				var E = function (t) {
					if (n.finish)
						return !1;
					n.start = !0,
					t = t || e.event,
					u(t);
					var i = "wap" === n.devicetype ? t.touches[0] || t.changedTouches[0] : t;
					a(p, "vcode-spin-button-focus"),
					n.currentX = i.clientX
				},
				w = function (t) {
					if (n.finish || !n.start)
						return !1;
					t = t || e.event,
					u(t);
					var i = "wap" === n.devicetype ? t.changedTouches[0] : t,
					o = i.clientX - n.currentX;
					a(p, "vcode-spin-button-focus"),
					n.conf.color && (p.style.background = n.conf.color || "#4b96ea",
						p.style.border = n.conf.color || "#4b96ea"),
					o >= b ? o = b : 0 > o && (o = 0,
							d(p, "vcode-spin-button-focus"),
							n.conf.color && (p.style = "")),
					n.percentage = parseFloat(o / b).toFixed(2),
					s.style.transform = "rotate(" + 360 * n.percentage + "deg)",
					s.style.msTransform = "rotate(" + 360 * n.percentage + "deg)",
					s.style.webkitTransform = "rotate(" + 360 * n.percentage + "deg)",
					s.style.MozTransform = "rotate(" + 360 * n.percentage + "deg)",
					s.style.OTransform = "rotate(" + 360 * n.percentage + "deg)",
					p.style.transform = "translateX(" + o + "px)",
					p.style.msTransform = "translateX(" + o + "px)",
					p.style.webkitTransform = "translateX(" + o + "px)",
					p.style.MozTransform = "translateX(" + o + "px)",
					p.style.OTransform = "translateX(" + o + "px)"
				},
				x = function (t) {
					if (!n.start)
						return !1;
					n.start = !1,
					t = t || e.event,
					u(t);
					var i = "wap" === n.devicetype ? t.changedTouches[0] : t,
					o = i.clientX - n.currentX;
					return o >= b ? (o = b,
						n.finish = !0,
						d(p, "vcode-spin-button-focus"),
						n.errorUiCallback({
							type: "spinRight"
						}),
						a(m, "vcode-transition-25"),
						a(h, "vcode-spin-bottom-top")) : 0 >= o ? (d(p, "vcode-spin-button-focus"),
						d(p, "vcode-spin-button-error")) : n.finish || k(),
					!1
				};
				r(p, n.eventclick, E),
				r(i, n.eventmove, w),
				r(i, n.eventend, x),
				n.eventend2 && r(i, n.eventend2, x),
				r(i, "mouseleave", function (e) {
					n.start === !0 && x(e)
				}),
				n.removeVcodeEvent = function () {
					l(p, n.eventclick, E),
					l(i, n.eventmove, w),
					l(i, n.eventend, x),
					n.eventend2 && l(i, n.eventend2, x)
				}
			},
			getDataAsync: function (t) {
				var n = e.PassMachine.haveMkd || this;
				n.store.count > 0 ? n.postData(function (e) {
					e.data ? t && t(e) : t && t(n.dsData)
				}) : t && t(n.dsData)
			},
			createDialogMask: function () {
				var e = this;
				e.maskDiv = document.createElement("div"),
				e.maskDiv.className = "vcode-mask hide",
				e.maskDiv.id = "vcode-mask" + this.num,
				document.body.appendChild(e.maskDiv)
			},
			createDialogBody: function () {
				var e = this;
				e.bodyDiv = document.createElement("div"),
				e.bodyDiv.className = "vcode-body hide",
				e.bodyDiv.id = "vcode-body" + this.num,
				document.body.appendChild(e.bodyDiv)
			},
			removeMask: function () {
				var e = this;
				document.body.removeChild(e.maskDiv),
				document.body.removeChild(e.bodyDiv),
				e.maskDiv = null,
				e.bodyDiv = null,
				e.removeVcodeEvent && e.removeVcodeEvent(),
				e.finish = !1,
				e.start = !1
			},
			encrypt: function (e) {
				var t = this.store.nameL + this.store.nameR,
				n = PassMachine.CryptoJS.enc.Utf8.parse(t),
				i = PassMachine.CryptoJS.enc.Utf8.parse(e),
				o = PassMachine.CryptoJS.AES.encrypt(i, n, {
						mode: PassMachine.CryptoJS.mode.ECB,
						padding: PassMachine.CryptoJS.pad.Pkcs7
					});
				return o.toString()
			},
			setData: function (t, n) {
				var i = e.PassMachine.haveMkd || this;
				i.rzData[t] = n
			},
			errorData: function () {
				this.dsData.ds = "iggkFNY5Z8odmaVWu0oRjsneNUhc65bBgY7IeyRqe6S++zbDz3JlV99QbnGMERCkRH57fRY77K4T0r5PTAk/Xoi21K1UoYgRM089xf8wdrl+FzMEwt13AaO5Dq4G0u5I49RTUPfwr4/MuB6b6hOcPwItorZarOJw+1yy7pp4LUUwmk1kqy5LXHQ2vXVRRIzBmEYkAd4LEMWB3TNN/Ehb/v2mIBHtw+V8prcJi637saZP2NZL2qVarc81Js3Ls1ICNon1ghv5Vly2IjvClAg1oFtLIYqQN5/lojRrg11ajOBnVkwrC/MbVsQ+paftGrOl9PHjBbRFq8+5LwAmVysU+83iZLMBC3M7NhKKlIiTJpvDAR+KrUAG1HP8GTH8L8mrVjuno9MIfX6oloTXcpZHfXZln2FwwTosFnTHZ0iaqdnCklq7W+xuSUyIYydL72/hi34W2QIyEh6PilSgac2Mgjh80ygOrj9hrR7+0rlc5c+cpeILmTUI3FNlzY0degKH81V3dYUSNO27zcZ2KG3Zxb4I5SCnxYbEigiJJQkemNNAT+GiX2Je2XR9Xivcn0pFkdxEReHb2uHStsvaCaI+AxmHXc8PBV6X6CdAtRtSLnA+NBYrRrVGBmZIQd112r6eSjJeO7R9ItEXpKnAb2jhyZ+dyBeQNYee3JeyNZpofxAsXyHLFkrKOqaceZBzhvxL9SZwADneJcVSYvLS9Fbf9RAo0FHHrAFjphDmLe3wPcIgyiAKnpvgw58Z13bY1LYKEM3QYt+U974GYlahfJpett38TeJSbfcn3f1sk1+Q00jb46ivKadXTztpkD0z++pKJtMCgc5pLJg40QLb6wbTpqa4wVULYnCouw6/9H5+COUDC0RKfLDhYzdcCCygSGlA",
				this.dsData.tk = "3338yojP4YX/CPjsNQpSEls3CchneKTLKfp9KvCfkBgWNCk="
			},
			getDs: function () {
				return this.dsData.ds
			},
			getTk: function () {
				return this.dsData.tk
			},
			reportedOpportunity: function () {
				var e = this;
				++e.store.count,
				e.store.count > e.store.countnum && e.postData()
			}
		}
	} catch (y) {}
}
(window, document);	
	</script>
  </head>
  <body>
  交互
  </body>
  </html>

获取验证码的原算法如下:

修改成c#如下:

因为有了ak参数,这样我们可以写个程序批量刷验证码:



到这一步,我们知道怎么获取验证码了,下面说下验证码的校验算法:
在mkd.js中搜索postData方法,并在如下图片中断点:


为什么叫AI验证码呢,在客户端行为上鼠标的拖动轨迹和点击位置都要做记录,这些坐标会存储到rzData参数中,且store.count这个数字满20,就会提交一次,不管结果如何post之前会把它清空。
回到postData提交方法,核心是构建了c参数对象,c的fs属性值是个核心加密算法生成的,溯源很费力,所以我上面直接把mkd.js内容读取,并构建了一个html用来交互。由于fs是用rzData对象加密生成的,
同时我们也需要构建rzData对象,这个对象完全可以先通过浏览器手动正常提交,在postData之前断点,把它输出到控制台,它核心是ac这个角度参数,我们只需要把ac修改成每一个图片旋转的角度即可

fs算法可以通过WebBrowser和JS进行交互,构建一个函数调用页面原有的encrypt方法,得到加密后的字符串:



到此,除了rzData对象中的ac参数(角度),其他都已经解决。回过头来,我们看图片验证码的效果,以及调试测试,发下,推动滑块从起始位置拉到最后,图片旋转了360度,而拖动长度是210(260-50),也就是210的长度对应360度,
角度=拖动的长度*360/210,对应js中的toFixed方法把结果保留了2位小数:

我们甚至可以自己写一个模拟核实下:

那么问题来了,怎么样才能获取图片的选择角度,前面说过,这里我尝试了很多方法都没自动化实现,最终通过人工修正的方式解决。这里包含图片采集服务,修复处理2个模块:
验证码采集服务,主要用来不停下载验证码图片,并处理验证码图片。
1.多任务多线程下载验证码,
2.通过相似算法,过滤已经存在的图片(同一张图片,不同角度)
3.将验证码图片每间隔3度旋转一次,然后用哈希算法得到旋转后的图片标识,同时获取每一次旋转后的图片前5个主色调的rgb值(可以多个,感觉5个够用了),这样一共就是120条数据,
每条数据的大致数据结构:
图片id(1到180),图片哈希码,前5主色调rgb值5个,是否旋转后的正确图片(需要人工设置)

这里为什么要隔3度旋转计算一次,因为百度这个判断是可以由误差的,另外,过多的数据匹配检索是消耗时间的。
图片id是为了对应人工标记的旋转正确的图片(这样就能够判断待验证码的图片和修正的图片查,需要旋转多少度),哈希码和rgb是为了匹配目标图片,通过这2个基本能够精确匹配。

昨天百度更新了验证码的图片,在4个角上随机加了1到3个小图片,用来混淆,其实这个和之前不加小图片没有任何区别,你完全可以在验证码采集服务里面加个算法,
保存图片只保留圆形区域(相当于图片裁剪);其实难度在于更新后的图片库比之前多了几个量级,我太难了!!!
裁剪算法

裁剪后的效果

image.png (83.83 KB, 下载次数: 2)

image.png

点评

太厉害了  发表于 2019-11-13 03:08

免费评分

参与人数 120吾爱币 +107 热心值 +110 收起 理由
music775775 + 1 + 1 我很赞同!
那些年打的飞机 + 1 谢谢@Thanks!
52xingkong + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
小天mk + 1 我很赞同!
六岁玩论坛 + 1 我很赞同!
凉一点是薄荷 + 1 + 1 虽然没看懂
daniel7785 + 1 用心讨论,共获提升!
温柔的一哥 + 1 + 1 谢谢@Thanks!
胖子最多情 + 1 + 1 没看到头像,可惜了
南光Nan_G + 1 + 1 真滴牛皮
dujiajiyimj + 1 + 1 用心讨论,共获提升!
orega + 1 + 1 谢谢@Thanks!
dugux + 1 + 1 我很赞同!
blmk + 2 + 1 我很赞同!
lz132 + 1 真厉害!!
一人之下123456 + 1 谢谢@Thanks!
做人不老实 + 1 + 1 虽然看不懂,但是很厉害的样子
rover_fighter + 1 热心回复!
vb9803 + 1 + 1 我很赞同!
marven + 1 + 1 我很赞同!
ctOS_ + 1 我很赞同!
docker + 1 + 1 厉害
cnahbb + 1 + 1 谢谢@Thanks!
牧码人 + 1 + 1 热心回复!
zhangchang + 1 + 1 我很赞同!
月六点年一倍 + 1 + 1 我很赞同!
siuhoapdou + 1 + 1 用心讨论,共获提升!
cle + 1 + 1 我很赞同!
耳食之辈 + 1 + 1 谢谢@Thanks!
木毅 + 1 大佬,牛逼
soyiC + 1 + 1 谢谢@Thanks!
zqy10008 + 1 举报头像可以吗
一只小木木 + 1 谢谢@Thanks!
Luke01 + 1 热心回复!
iYolo丶moye + 1 用心讨论,共获提升!
盘踞 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
wangtian666 + 1 热心回复!
qq1269560093 + 1 + 1 我很赞同!
jimmyzang + 1 + 1 我很赞同!
等到烟火也清凉 + 1 + 1 牛批
a17418419 + 1 热心回复!
bluewhale + 1 + 1 谢谢@Thanks!
gblw + 1 我很赞同!
as1329 + 1 + 1 66666666
ou2375904954 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
18621853827 + 1 用心讨论,共获提升!
x_ge + 1 + 1 谢谢@Thanks!
hexiaomo + 1 + 1 热心回复!
但行_杨晓涛 + 1 + 1 这就很厉害了,感谢分享!
poisonbcat + 1 + 1 我很赞同!
lickety + 1 + 1 用心讨论,共获提升!
bolipapadu + 1 + 1 用心讨论,共获提升!
公瑾哥哥 + 1 + 1 我很赞同!
SanadaYukimura + 1 + 1 用心讨论,共获提升!
dns2018 + 1 鼓励转贴优秀软件安全工具和文档!
yimocoding + 1 + 1 热心回复!
e101406 + 1 用心讨论,共获提升!
小蚂蚁~~ + 1 谢谢@Thanks!
bianfanggege + 1 谢谢
人行竖道 + 2 + 1 码代码不易!!!
fzsbm + 3 + 1 用心讨论,共获提升!
JPK + 1 + 1 热心回复!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
86429769 + 1 + 1 谢谢@Thanks!
我只是条咸鱼 + 1 + 1 谢谢@Thanks!
zhongruizhe + 1 + 1 谢谢@Thanks!
rino + 1 + 1 用心讨论,共获提升!
庚^溯 + 1 对于我一个初学者还是挺难的
cantoner + 1 + 1 用心讨论,共获提升!
生有涯知无涯 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
net_007 + 1 + 1 NB+v5
N0LL + 1 + 1 谢谢@Thanks!
cbaibai + 1 + 1 谢谢@Thanks!
chencg + 1 太厉害了
baymax^ + 1 厉害
psych1 + 1 用心讨论,共获提升!
白开水U23 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
weabrave + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ywcn + 1 + 1 连图片验证都能搞定,牛!
PYNZ + 1 + 1 666,好帖子!
lic121436 + 1 + 1 谢谢@Thanks!
clity + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
anshingy + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
挥汗如雨 + 2 + 1 热心回复!
you920928 + 1 + 1 谢谢@Thanks!
天空宫阙 + 1 + 1 谢谢@Thanks!
草月花舍 + 1 + 1 谢谢@Thanks!
jnez112358 + 1 + 1 谢谢@Thanks!
yanhuanzhi + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
逆天西瓜 + 1 我能举报你的头像吗
洛之川 + 1 + 1 我很赞同!
Felixchd + 1 + 1 用心讨论,共获提升!
mayxh + 1 + 1 谢谢@Thanks!
colorJ + 1 谢谢@Thanks!
嘻嘻哈哈11 + 1 谢谢@Thanks!
微凉如梦 + 1 + 1 谢谢@Thanks!
hackcat + 1 + 1 谢谢@Thanks!
riffraffl + 1 + 1 我能举报你的头像吗
93ken + 1 + 1 我很赞同! 给你个热拼,好处理违规。
猫吃 + 1 我能举报你的头像吗

查看全部评分

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

推荐
 楼主| ttyy008 发表于 2019-11-9 22:13 <

低调,撸码需要灵感,你懂的

点评

再发现用违规色情内容直接封号处理。  详情 回复 发表于 2019-11-11 17:53

免费评分

参与人数 3吾爱币 +2 热心值 +1 违规 +1 收起 理由
此时此刻1111 + 1 + 1 &amp;lt;font style=&amp;quot;vertical-align: inherit;&amp;quot;&amp;gt;&amp;lt;font style=
逆天西瓜 + 1 再发现用违规色情内容直接封号处理。
编程-修宇 + 1 色情头像,违法行为,借楼加违规

查看全部评分

推荐
x2658y 发表于 2019-11-9 22:11
推荐
Hmily 发表于 2019-11-11 17:53
ttyy008 发表于 2019-11-9 22:13
低调,撸码需要灵感,你懂的

再发现用违规色情内容直接封号处理。
推荐
Poner 发表于 2019-11-11 17:49
楼主貌似不在国内?  但咱论坛是属于中国管辖范围的,所以你的头像侵犯了法律。。。
推荐
a5582323 发表于 2019-11-10 04:44
诶,就很牛逼
推荐
 楼主| ttyy008 发表于 2019-11-11 11:41 <
abc2342537 发表于 2019-11-11 11:39
我有个朋友想要你的头像

内容不看尽在看头像。图像已经修改了,没同步估计52有缓存设计。twitter上有她主页,进去都是。
多交流交流技术才是正道

免费评分

参与人数 1吾爱币 +1 收起 理由
依旧_浅笑 + 1 秒啊,我也要头像。。2333

查看全部评分

4#
落花肆染流年 发表于 2019-11-9 22:16
大神牛逼
5#
梦皑皑 发表于 2019-11-9 22:31
刺激的啊,你胆子挺大。。支持大神。
6#
6767 发表于 2019-11-10 00:03

得珍惜一下头像
7#
sunao04 发表于 2019-11-10 00:39
厉害  要是给个头像高清大图就更好了
8#
极地企鹅 发表于 2019-11-10 01:17
太棒了这个思路,让我受益匪浅。。。
太棒了这个头像
9#
LightSylcanus 发表于 2019-11-10 02:28
这篇头像写的太好了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:禁止回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2019-12-13 11:08

Powered by Discuz!

© 2001-2017 Comsenz Inc.

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