├── 数美 ├── .idea │ ├── .name │ ├── misc.xml │ ├── vcs.xml │ ├── inspectionProfiles │ │ ├── profiles_settings.xml │ │ └── Project_Default.xml │ ├── modules.xml │ ├── 数美.iml │ └── workspace.xml ├── 数美滑块.py └── 数美ast.js ├── README.md ├── 快手滑块 └── 文章.txt ├── 易盾滑块 ├── bg.jpg ├── out.jpg ├── 易盾滑塊.zip ├── test.js ├── cb分析.js ├── data分析.js ├── fp分析.js ├── main.py └── test.py ├── 极验3滑块 ├── bg.jpg ├── bg1.jpg ├── slice.jpg ├── fullbg.jpg ├── __pycache__ │ ├── slider.cpython-38.pyc │ ├── down_pic.cpython-38.pyc │ ├── picsestore.cpython-38.pyc │ └── gapsidentified.cpython-38.pyc ├── requirements.txt ├── slider.py ├── picsestore.py ├── run.py ├── gapsidentified.py └── down_pic.py ├── 极验4滑块 ├── 1.png ├── bg.png ├── ft.png ├── out.png ├── 分析 │ ├── 未知量.txt │ ├── payload參數分析.js │ ├── 第0個軌跡分析.js │ ├── w_其他分析.js │ └── w_track分析.js ├── myFunc.js ├── challenge參數分析.js ├── webpack導出函數.js ├── test.py └── main.py ├── 极验4_滑块第二种 ├── bg.jpg ├── slice.jpg ├── geet4.py └── 1.js └── 易盾无感 ├── fp參數分析.js ├── 無感參數分析.js └── main.py /数美/.idea/.name: -------------------------------------------------------------------------------- 1 | 数美滑块.py -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # - 2 | 收集的一些验证码以及自己写的 3 | -------------------------------------------------------------------------------- /快手滑块/文章.txt: -------------------------------------------------------------------------------- 1 | https://zhuanlan.zhihu.com/p/604576327 -------------------------------------------------------------------------------- /易盾滑块/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/易盾滑块/bg.jpg -------------------------------------------------------------------------------- /易盾滑块/out.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/易盾滑块/out.jpg -------------------------------------------------------------------------------- /易盾滑块/易盾滑塊.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/易盾滑块/易盾滑塊.zip -------------------------------------------------------------------------------- /极验3滑块/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验3滑块/bg.jpg -------------------------------------------------------------------------------- /极验3滑块/bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验3滑块/bg1.jpg -------------------------------------------------------------------------------- /极验4滑块/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验4滑块/1.png -------------------------------------------------------------------------------- /极验4滑块/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验4滑块/bg.png -------------------------------------------------------------------------------- /极验4滑块/ft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验4滑块/ft.png -------------------------------------------------------------------------------- /极验4滑块/out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验4滑块/out.png -------------------------------------------------------------------------------- /极验4滑块/分析/未知量.txt: -------------------------------------------------------------------------------- 1 | 1. 第0個軌跡分析 -> i = t['options']['hash'] 2 | 2. w_其他分析 -> 第9點 gct -------------------------------------------------------------------------------- /极验3滑块/slice.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验3滑块/slice.jpg -------------------------------------------------------------------------------- /易盾滑块/test.js: -------------------------------------------------------------------------------- 1 | a = {}; 2 | a["Date"] = Date; 3 | 4 | console.log(new a["Date"]().getTime()) -------------------------------------------------------------------------------- /极验3滑块/fullbg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验3滑块/fullbg.jpg -------------------------------------------------------------------------------- /极验4_滑块第二种/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验4_滑块第二种/bg.jpg -------------------------------------------------------------------------------- /极验4_滑块第二种/slice.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验4_滑块第二种/slice.jpg -------------------------------------------------------------------------------- /极验3滑块/__pycache__/slider.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验3滑块/__pycache__/slider.cpython-38.pyc -------------------------------------------------------------------------------- /极验3滑块/__pycache__/down_pic.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验3滑块/__pycache__/down_pic.cpython-38.pyc -------------------------------------------------------------------------------- /极验3滑块/__pycache__/picsestore.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验3滑块/__pycache__/picsestore.cpython-38.pyc -------------------------------------------------------------------------------- /极验3滑块/__pycache__/gapsidentified.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xuxiaobo-bobo/captcha/HEAD/极验3滑块/__pycache__/gapsidentified.cpython-38.pyc -------------------------------------------------------------------------------- /数美/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /数美/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /数美/.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /极验4滑块/分析/payload參數分析.js: -------------------------------------------------------------------------------- 1 | 2 | // n內有payload 3 | o[$_BCHDi(495)] = r, 4 | k(n, $_BCHDi(458), n[$_BCHCk(324)], n[$_BCHDi(426)], s, o)[$_BCHCk(377)](function() { 5 | var $_BCHHE = oTEDG.$_CO 6 | , $_BCHGo = ['$_BCIAh'].concat($_BCHHE) 7 | , $_BCHIA = $_BCHGo[1]; -------------------------------------------------------------------------------- /极验4滑块/myFunc.js: -------------------------------------------------------------------------------- 1 | var uuid = function () { 2 | return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { 3 | var r = Math.random() * 16 | 0; 4 | var v = c === 'x' ? r : (r & 0x3 | 0x8); 5 | return v.toString(16); 6 | }); 7 | }; -------------------------------------------------------------------------------- /数美/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /易盾滑块/cb分析.js: -------------------------------------------------------------------------------- 1 | 'cb': _0xed1105(), 2 | 3 | 'tkmSMliaLvY8wZIqO7rhg9Ue2J55HltHGXb7z15CogsQVBlf7ds8BpI8M6GrG8C7' 4 | 5 | // 獲取cb參數的函數 6 | function _0xed1105() { 7 | var _0x3a9ef4 = _0x4cda 8 | , _0x460efd = _0x3b2021[_0x3a9ef4(0xa97)](0x20); 9 | return _0x7ffe06(_0x460efd); 10 | } -------------------------------------------------------------------------------- /数美/.idea/数美.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /极验4滑块/challenge參數分析.js: -------------------------------------------------------------------------------- 1 | 2 | // 由以下及數生成 3 | var uuid = function () { 4 | return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { 5 | var r = Math.random() * 16 | 0; 6 | var v = c === 'x' ? r : (r & 0x3 | 0x8); 7 | return v.toString(16); 8 | }); 9 | }; -------------------------------------------------------------------------------- /易盾滑块/data分析.js: -------------------------------------------------------------------------------- 1 | 2 | // data參數位置 3 | this[_0x507227(0x6e9)]({ 4 | 'data': JSON['stringify']({ 5 | 'd': _0x333cdf(_0x1b8bed[_0x507227(0x4e6)](':')), 6 | 'm': '', 7 | 'p': _0x1615c3, 8 | 'ext': _0x333cdf(_0x57ffcc(_0x56c920, this[_0x507227(0xbda)] + ',' + this['traceData'][_0x507227(0x10b)])) 9 | }) 10 | }); 11 | 12 | // push 加密後的軌跡 13 | this[_0x1ceb76(0x8bc)][_0x1ceb76(0x8b0)](_0x5321b1), -------------------------------------------------------------------------------- /数美/.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /极验4滑块/webpack導出函數.js: -------------------------------------------------------------------------------- 1 | // return n[e][$_CDIl(84)](t[$_CDHq(64)], t, t[$_CDIl(64)], r), 2 | case oTEDG.$_DX()[6][10]: 3 | if (i[e]) 4 | return i[e][$_CDHq(64)]; 5 | var t = i[e] = { 6 | "\u0069": e, 7 | "\u006c": !1, 8 | "\u0065\u0078\u0070\u006f\u0072\u0074\u0073": {} 9 | }; 10 | return n[e][$_CDIl(84)](t[$_CDHq(64)], t, t[$_CDIl(64)], r), 11 | t[$_CDHq(20)] = !0, 12 | t[$_CDHq(64)]; 13 | break; 14 | } -------------------------------------------------------------------------------- /极验4滑块/test.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | 3 | def identify_gap(bg,tp,out): 4 | ''' 5 | bg: 背景图片 6 | tp: 缺口图片 7 | out:输出图片 8 | ''' 9 | # 读取背景图片和缺口图片 10 | bg_img = cv2.imread(bg) # 背景图片 11 | tp_img = cv2.imread(tp) # 缺口图片 12 | 13 | # 识别图片边缘 14 | bg_edge = cv2.Canny(bg_img, 100, 200) 15 | tp_edge = cv2.Canny(tp_img, 100, 200) 16 | 17 | # 转换图片格式 18 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB) 19 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB) 20 | 21 | # 缺口匹配 22 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED) 23 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配 24 | 25 | # 绘制方框 26 | th, tw = tp_pic.shape[:2] 27 | tl = max_loc # 左上角点的坐标 28 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标 29 | cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形 30 | cv2.imwrite(out, bg_img) # 保存在本地 31 | 32 | # 返回缺口的X坐标 33 | return tl[0] 34 | 35 | print(identify_gap("bg.png","ft.png","out.png")) -------------------------------------------------------------------------------- /易盾无感/fp參數分析.js: -------------------------------------------------------------------------------- 1 | 2 | // 設置fp的函數 3 | function _0x11086b() { 4 | var _0x1c6657 = _0x21e0; 5 | _0x47e2a6(), 6 | window[_0x16c919] = null; 7 | var _0x3847f4 = !0x0 8 | , _0x82bb51 = { 9 | 'v': _0x498690[0xe9] 10 | } 11 | , _0x4d1145 = _0x208f38(); 12 | _0x4d1145 && (_0x82bb51[_0x498690[0x180]] = _0x4d1145), 13 | _0x4d1145 = null, 14 | _0x82bb51[_0x498690[0x6e]] = _0x4c5ee6; 15 | var _0x334cbb = new window[_0x37d211[0x49]]()[_0x498690[0xb6]]() + _0x12d30f 16 | , _0x126809 = _0x334cbb + _0x4a03fc[0x12b] * _0x4a03fc[0x8b] * _0x4a03fc[0x8b] * _0x4a03fc[0x41] * _0x4a03fc[0x4d]; 17 | _0x82bb51[_0x498690[0x88]] = _0x240519(_0x4a03fc[0xa]) + _0x334cbb + _0x240519(_0x4a03fc[0xa]); 18 | try { 19 | var _0x205934 = new _0x45dca0({ 20 | 'b': !0x1, 21 | 'a': !0x1 22 | })[_0x1c6657(0x933)](); 23 | null != _0x205934 && void 0x0 != _0x205934 && _0x205934['length'] > _0x4a03fc[0x6] ? _0x82bb51[_0x498690[0xb9]] = _0x205934[_0x1c6657(0xcb0)](_0x498690[0x24]) : (_0x82bb51[_0x498690[0xb9]] = _0x5db42d(_0x498690[0x2b], _0x4a03fc[0x22]), 24 | _0x82bb51[_0x498690[0xa2]] = _0x498690[0x2c], 25 | _0x3847f4 = !0x1); -------------------------------------------------------------------------------- /极验3滑块/requirements.txt: -------------------------------------------------------------------------------- 1 | aiohttp==3.8.1 2 | aiosignal==1.2.0 3 | async-timeout==4.0.2 4 | attrs==20.3.0 5 | beautifulsoup4==4.11.1 6 | bs4==0.0.1 7 | certifi==2022.5.18.1 8 | cffi==1.15.0 9 | charset-normalizer==2.0.12 10 | click==7.1.2 11 | colorama==0.4.4 12 | cssselect==1.1.0 13 | ddddocr==1.4.3 14 | environs==9.5.0 15 | fake-headers==1.0.2 16 | Flask==1.1.4 17 | flatbuffers==2.0 18 | frozenlist==1.3.0 19 | gevent==21.12.0 20 | greenlet==1.1.2 21 | html5lib==1.1 22 | idna==3.3 23 | itsdangerous==0.24 24 | Jinja2==2.11.3 25 | loguru==0.6.0 26 | lxml==4.9.0 27 | MarkupSafe==2.0.1 28 | marshmallow==3.16.0 29 | maxminddb==2.2.0 30 | maxminddb-geolite2==2018.703 31 | multidict==6.0.2 32 | numpy==1.22.4 33 | onnxruntime==1.11.1 34 | opencv-python==4.5.5.64 35 | packaging==21.3 36 | Pillow==9.1.1 37 | protobuf==4.21.1 38 | pycparser==2.21 39 | PyExecJS==1.5.1 40 | pyparsing==3.0.9 41 | pyquery==1.4.3 42 | python-dotenv==0.20.0 43 | redis==3.5.3 44 | requests==2.27.1 45 | retrying==1.3.3 46 | six==1.16.0 47 | soupsieve==2.3.2.post1 48 | supervisor==4.2.4 49 | tornado==6.1 50 | urllib3==1.26.9 51 | webencodings==0.5.1 52 | Werkzeug==1.0.1 53 | win32-setctime==1.1.0 54 | yarl==1.7.2 55 | zope.event==4.5.0 56 | zope.interface==5.4.0 57 | -------------------------------------------------------------------------------- /易盾滑块/fp分析.js: -------------------------------------------------------------------------------- 1 | 'initialize': function(_0x5ce22b) 2 | 3 | function _0x1bcb03() { 4 | var _0x10f092 = _0x4cda; 5 | this[_0x10f092(0x9d2)] ? this[_0x10f092(0x9d2)][_0x10f092(0xa91)](this, arguments) : (_0x12bb26 || _0x1649d1 && _0x4cdbe2[_0x10f092(0xa91)](this, arguments), 6 | _0x24053f[_0x10f092(0xa91)](this, arguments)); 7 | } 8 | 9 | function(_0x269090, _0x5360ea, _0x446030) { 10 | var _0x255185 = _0x4bb562; 11 | function _0x44d073(_0x319c0a, _0x1fd217) { 12 | var _0xc28892 = _0x4cda 13 | , _0x4caf1b = this; 14 | _0x319c0a = _0x320973(_0x319c0a), 15 | _0x89893b(_0x319c0a[_0xc28892(0x234)], { 16 | 'protocol': _0x319c0a[_0xc28892(0x291)], 17 | 'staticServer': Array[_0xc28892(0x326)](_0x319c0a['staticServer']) ? _0x319c0a[_0xc28892(0x96c)][0x0] : _0x319c0a['staticServer'], 18 | 'theme': _0x319c0a[_0xc28892(0x82e)] 19 | }); 20 | var _0x8c49f8 = window[_0xc28892(0x3ad)]; 21 | _0x1fd217 = _0x1fd217 || new _0x5060a6({ 22 | 'bid': _0x319c0a[_0xc28892(0xb0d)], 23 | 'url': '' 24 | },_0x319c0a); 25 | var _0x40134e = Object['assign']({}, _0x1ab7ee[_0xc28892(0x50a)], { 26 | 'config': _0x319c0a, 27 | 'fingerprint': _0x8c49f8, 28 | 'langPkg': _0x319c0a[_0xc28892(0x505)], 29 | 'smsNew': !!_0x319c0a[_0xc28892(0x125)] || !_0x59cd6e[_0xc28892(0x1bd)] && _0x59cd6e['supportCanvas'], 30 | '$fetch': _0x39425a({ 31 | 'timeout': _0x319c0a[_0xc28892(0x5e2)], 32 | 'captchaConfig': _0x319c0a 33 | }), 34 | '$captchaAnticheat': new _0x4448d3(_0x319c0a,_0x1fd217), 35 | 'captchaCollector': _0x1fd217, 36 | 'browserFeature': _0x5c7255 37 | }) 38 | , _0x415618 = new _0x1e27bf(Object['assign']({}, _0x1ab7ee, { 39 | 'state': _0x40134e 40 | })) 41 | 42 | // 設置fp參數的地方,用hook睇下window係邊到set左個值 43 | var _0x8c49f8 = window[_0xc28892(0x3ad)]; 44 | 45 | window['gdxidpyhxde'] 46 | 47 | 48 | // 設置window['gdxidpyhxde']的地方 49 | (window[_0x402f87] = _0x3acade() -------------------------------------------------------------------------------- /极验3滑块/slider.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2022/6/2 12:04 3 | # @Author : xiaobo 4 | # @Site : 5 | # @File : slider.py 6 | # @Software: PyCharm 7 | import random 8 | 9 | 10 | def __ease_out_expo(sep): 11 | if sep == 1: 12 | return 1 13 | else: 14 | return 1 - pow(2, -10 * sep) 15 | 16 | 17 | def get_slide_track(distance): 18 | """ 19 | 根据滑动距离生成滑动轨迹 20 | :param distance: 需要滑动的距离 21 | :return: 滑动轨迹: [[x,y,t], ...] 22 | x: 已滑动的横向距离 23 | y: 已滑动的纵向距离, 除起点外, 均为0 24 | t: 滑动过程消耗的时间, 单位: 毫秒 25 | """ 26 | 27 | if not isinstance(distance, int) or distance < 0: 28 | raise ValueError(f"distance类型必须是大于等于0的整数: distance: {distance}, type: {type(distance)}") 29 | # 初始化轨迹列表 30 | slide_track = [ 31 | [random.randint(-50, -10), random.randint(-50, -10), 0], 32 | [0, 0, 0], 33 | ] 34 | # 共记录count次滑块位置信息 35 | count = 30 + int(distance / 2) 36 | # 初始化滑动时间 37 | t = random.randint(50, 100) 38 | # 记录上一次滑动的距离 39 | _x = 0 40 | _y = 0 41 | for i in range(count): 42 | # 已滑动的横向距离 43 | x = round(__ease_out_expo(i / count) * distance) 44 | # 滑动过程消耗的时间 45 | t += random.randint(10, 20) 46 | if x == _x: 47 | continue 48 | slide_track.append([x, _y, t]) 49 | _x = x 50 | slide_track.append(slide_track[-1]) 51 | return slide_track 52 | 53 | 54 | if __name__ == '__main__': 55 | for _ in get_slide_track(55): 56 | print(_) 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /极验3滑块/picsestore.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2022/6/2 11:55 3 | # @Author : xiaobo 4 | # @Site : 5 | # @File : picsestore.py 6 | # @Software: PyCharm 7 | 8 | 9 | 10 | import io 11 | from pathlib import Path 12 | 13 | from PIL import Image 14 | 15 | 16 | def parse_bg_captcha(img, im_show=False, save_path=None): 17 | """ 18 | 滑块乱序背景图还原 19 | :param img: 图片路径str/图片路径Path对象/图片二进制 20 | eg: 'assets/bg.webp' 21 | Path('assets/bg.webp') 22 | :param im_show: 是否显示还原结果, ; default: False 23 | :param save_path: 保存路径, /; default: None 24 | :return: 还原后背景图 RGB图片格式 25 | """ 26 | if isinstance(img, (str, Path)): 27 | _img = Image.open(img) 28 | elif isinstance(img, bytes): 29 | _img = Image.open(io.BytesIO(img)) 30 | else: 31 | raise ValueError(f'输入图片类型错误, 必须是//: {type(img)}') 32 | # 图片还原顺序, 定值 33 | _Ge = [39, 38, 48, 49, 41, 40, 46, 47, 35, 34, 50, 51, 33, 32, 28, 29, 27, 26, 36, 37, 31, 30, 44, 45, 43, 34 | 42, 12, 13, 23, 22, 14, 15, 21, 20, 8, 9, 25, 24, 6, 7, 3, 2, 0, 1, 11, 10, 4, 5, 19, 18, 16, 17] 35 | w_sep, h_sep = 10, 80 36 | 37 | # 还原后的背景图 38 | new_img = Image.new('RGB', (260, 160)) 39 | 40 | for idx in range(len(_Ge)): 41 | x = _Ge[idx] % 26 * 12 + 1 42 | y = h_sep if _Ge[idx] > 25 else 0 43 | # 从背景图中裁剪出对应位置的小块 44 | img_cut = _img.crop((x, y, x + w_sep, y + h_sep)) 45 | # 将小块拼接到新图中 46 | new_x = idx % 26 * 10 47 | new_y = h_sep if idx > 25 else 0 48 | new_img.paste(img_cut, (new_x, new_y)) 49 | 50 | if im_show: 51 | pass 52 | if save_path is not None: 53 | save_path = Path(save_path).resolve().__str__() 54 | new_img.save(save_path) 55 | return new_img 56 | 57 | 58 | if __name__ == '__main__': 59 | parse_bg_captcha("bg.jpg", im_show=True, save_path='bg1.jpg') 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /易盾无感/無感參數分析.js: -------------------------------------------------------------------------------- 1 | actoken: 2 | >> core.v2.21.4.min.js << 3 | 4 | })[_0x2ffa25(0x7ad)](function(_0x3792bb) { 5 | var _0x2c64a8 = _0x2ffa25 6 | , _0x2f75d8 = Object[_0x2c64a8(0xc62)]({ 7 | 'id': _0x106912, 8 | 'fp': _0x48b80c, 9 | 'https': _0x2c64a8(0x74e) === _0x2ebada, 10 | 'type': _0x1993e7, 11 | 'width': _0x3018c1[_0x2c64a8(0x5c4)], 12 | 'sizeType': _0x3018c1[_0x2c64a8(0x2db)], 13 | 'version': _0x435840, 14 | 'dpr': window[_0x2c64a8(0x9e4)] || 0x1, 15 | 'dev': _0x37d546, 16 | 'cb': _0x14e174(), 17 | 'acToken': _0x3792bb, 18 | 'ipv6': _0x562344, 19 | 'runEnv': _0x492aa3, 20 | 'group': _0x5bac68, 21 | 'scene': _0x204dec, 22 | 'sdkVersion': _0x41ff46 23 | }, 24 | 25 | // _0x4f2f1a[_0x353c49(0xa28)] 就是actoken 26 | //_0x4f2f1a[_0x353c49(0xa28)] = _0x4f2f1a['_arg'] 27 | return _0x24ff44(_0x4f2f1a[_0x353c49(0xa28)]); 28 | 29 | 30 | // _0x36c20d = acToken 31 | _0x5c54f7['getAnticheat']()['getToken'](_0x194fbb[_0x9dddbe(0xc29)][_0x9dddbe(0x507)], function(_0x36c20d) { 32 | clearTimeout(_0x57f4f0), 33 | _0x1f548(_0x36c20d); 34 | }, _0x30616c); 35 | 36 | 37 | >> watchman.min.js 變量名會變 << 38 | m.prototype.ia = function(e, c, d, f) { 39 | function g() { 40 | x || (sa(y), 41 | c(dc({ 42 | C: r, 43 | la: x 44 | }))) 45 | } 46 | 特徵:C: r, 47 | la: x 48 | 49 | var r = this.g.C = cc(); 50 | 51 | 52 | // data參數 53 | // 就是下面這裡 54 | 'data': JSON['stringify']({ 55 | 'd': '', 56 | 'm': _0x190288(_0x2f0d29[_0x57a3be(0x4fb)](_0x4a28d0, _0x43a6d2)[_0x57a3be(0xcb0)](':')), 57 | 'p': _0x190288(_0x4c229e), 58 | 'ext': _0x190288(_0x57777a(_0xf409d4, '1,' + _0x4a28d0[_0x57a3be(0x20b)])) 59 | }) 60 | 61 | 62 | // _0x224043[_0x50a306(0x2c3)](_0x52b359)[_0x50a306(0x7ad)](function(_0x3f9667) 63 | var _0x50a306 = _0x4d2cb9; 64 | _0x58ab9f = Object[_0x50a306(0xc62)]({ 65 | 'referer': _0x5a846(), 66 | 'zoneId': _0x36710a[_0x50a306(0x89c)] || '' 67 | }, _0x58ab9f); 68 | var _0x52b359 = _0x2d4012({}, _0x5dd745, _0x17eddc, { 69 | 'url': _0x47334d, 70 | 'payload': _0x58ab9f 71 | }); 72 | _0x224043[_0x50a306(0x2c3)](_0x52b359)[_0x50a306(0x7ad)](function(_0x3f9667) { 73 | return _0xa7d692(null, _0x3f9667); 74 | })[_0x50a306(0xbbf)](_0xa7d692); 75 | } 76 | 77 | // _0x2eeb09 78 | this[_0x510f0c(0x47f)] = function(_0x25be4f, _0x2eeb09, _0x134106) { 79 | var _0x32671f = _0x510f0c; 80 | return _0x19ddec[_0x32671f(0x3ec)](_0x20e860, _0x25be4f, _0x2eeb09, _0x134106); 81 | } -------------------------------------------------------------------------------- /易盾无感/main.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import execjs 3 | import re 4 | import json 5 | 6 | headers = { 7 | 'Accept': '*/*', 8 | 'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7', 9 | 'Cache-Control': 'no-cache', 10 | 'Connection': 'keep-alive', 11 | 'Pragma': 'no-cache', 12 | 'Referer': 'https://www.zyhxjh.com/', 13 | 'Sec-Fetch-Dest': 'script', 14 | 'Sec-Fetch-Mode': 'no-cors', 15 | 'Sec-Fetch-Site': 'cross-site', 16 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36', 17 | 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 18 | 'sec-ch-ua-mobile': '?0', 19 | 'sec-ch-ua-platform': '"Windows"', 20 | } 21 | with open("enc.js",mode="r",encoding="utf-8") as f: 22 | jscode = f.read() 23 | ctx = execjs.compile(jscode) 24 | session = requests.session() 25 | 26 | 27 | 28 | def getToken(): 29 | 30 | params = { 31 | 'referer': 'https://www.zyhxjh.com/#/login', 32 | 'zoneId': 'CN31', 33 | 'id': 'a32a66b67ede4b7f8f47e6d4822d3259', 34 | 'fp': 'GHNf+laPsJ\3WTv7jwnzhzOr1N9VaUwh3aZ\\RjX26VHXtaZ\BMnWBKdCyLy3GAGX8VaOAS\alq/t3lZwOl/JHtwchokQf/BiZLgIooND+HRVZVPl5IT921XjdMP9gaasKQYBBlv4HCsTRTcnaxY9xv8zAKZR+zfyILxrsnm8Zpidjny:1681042660574', 35 | 'https': 'true', 36 | 'type': 'undefined', 37 | 'width': '', 38 | 'sizeType': 'undefined', 39 | 'version': '2.21.4', 40 | 'dpr': '1.25', 41 | 'dev': '1', 42 | 'cb': 'FaYKx5wouyjmFWQOsiBgDz0H5aUccsjWpy6ulCL8Onz4CfeFhGXq8cPBHCwX850a', 43 | 'acToken': '9ca17ae2e6fecda16ae2e6eeb5cb528ab69db8ea65bcaeaf9ad05b9c94a3a3c434898987d2b25ef4b2a983bb2af0feacc3b92ae2f4ee95a132e29aa3b1cd72abae8cd1d44eb0b7bb82f55bb08fa3afd437fffeb3', # 不確定是否長期有效 44 | 'ipv6': 'false', 45 | 'runEnv': '10', 46 | 'group': '', 47 | 'scene': '', 48 | 'sdkVersion': 'undefined', 49 | 'smsVersion': 'v2', 50 | 'callback': '__JSONP_bifn4ay_0', 51 | } 52 | 53 | fp = ctx.call("get_fp") 54 | cb = ctx.call("get_cb") 55 | params['cb'] = cb 56 | params['fp'] = fp 57 | 58 | 59 | response = session.get('https://c.dun.163.com/api/v3/get', params=params, headers=headers) 60 | regx = re.compile(r".*?\((?P.*?)\)",re.S) 61 | jdata = json.loads(regx.search(response.text).group("dic"))['data'] 62 | 63 | token = jdata['token'] 64 | return token 65 | 66 | 67 | # 易盾無感 68 | def check(token): 69 | params = { 70 | 'referer': 'https://www.zyhxjh.com/#/login', 71 | 'zoneId': 'CN31', 72 | 'id': 'a32a66b67ede4b7f8f47e6d4822d3259', 73 | 'version': '2.21.4', 74 | 'cb': '', 75 | 'extraData': '', 76 | 'bf': '0', 77 | 'runEnv': '10', 78 | 'sdkVersion': 'undefined', 79 | 'token': '7ace297b5b7046e7a17431caee0f73a8', 80 | 'type': '5', 81 | 'width': '240', 82 | 'data': '{"d":"","m":"JJpIGrgk7n8SVcke+4YFXp33","p":"DfXrtzsFqwijA5jrIp1MIt+lnwRXgC6XmgDXJc33","ext":"idBTGPWdIuRtnUxXQP8zv1w15AZ3"}', 83 | 'callback': '__JSONP_wd68u86_3', 84 | } 85 | 86 | params['token'] = token 87 | params['data'] = ctx.call("_getData2",token) 88 | params['cb'] = ctx.call("get_cb") # cb 可以與前面相同/不同 89 | 90 | response = session.get('https://c.dun.163.com/api/v3/check', params=params, headers=headers) 91 | print(response.text) 92 | 93 | 94 | if __name__ == "__main__": 95 | token = getToken() 96 | check(token) -------------------------------------------------------------------------------- /极验3滑块/run.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2022/6/2 12:09 3 | # @Author : xiaobo 4 | # @Site : 5 | # @File : run.py 6 | # @Software: PyCharm 7 | 8 | 9 | import os 10 | import subprocess 11 | import time 12 | 13 | import execjs 14 | import requests 15 | import down_pic 16 | import picsestore 17 | import gapsidentified 18 | import slider 19 | import json 20 | import sys 21 | # sys.setdefaultencoding('utf8') 22 | def downloadpic(): 23 | """图片下载""" 24 | sess = requests.session() 25 | 26 | res_chall_gt = down_pic.get_chall_gt(sess) # 获取challenge,以及gt 27 | 28 | c, s = down_pic.get_php(res_chall_gt, sess) # 获取s以及c的值 29 | 30 | down_pic.get_ajax_php(res_chall_gt, sess) 31 | 32 | pic_chall_gt, s_ = down_pic.getpic(res_chall_gt, sess) # 获取图片信息 33 | 34 | return c, s_, pic_chall_gt 35 | 36 | 37 | def pic_reset(): 38 | """图片还原""" 39 | picsestore.parse_bg_captcha("bg.jpg", im_show=True, save_path='bg1.jpg') 40 | 41 | 42 | def gap(): 43 | """缺口识别""" 44 | return gapsidentified.get_distance( 45 | bg='bg1.jpg', 46 | tp='slice.jpg', 47 | im_show=False, 48 | save_path='./assets/bg.jpg' 49 | ) 50 | 51 | 52 | def _slider(slider_): 53 | """滑块轨迹""" 54 | _list = [] 55 | for _ in slider.get_slide_track(slider_): 56 | _list.append(_) 57 | return _list 58 | 59 | 60 | def getw(c, s_, g, gt, pic_chall_gt, passtime, jl): 61 | """读取js文件,获取加密值""" 62 | jscode = open('w.js', 'r', encoding='utf-8').read() 63 | ctx = execjs.compile(jscode) 64 | # print(jscode) 65 | arguments = [c, s_, g, gt, pic_chall_gt, passtime, jl] 66 | print(arguments) 67 | 68 | res = ctx.call('getw', arguments) 69 | return res 70 | 71 | 72 | def getres(w, pic_chall_gt): 73 | headers = { 74 | "Accept": "*/*", 75 | "Accept-Language": "zh-CN,zh;q=0.9", 76 | "Cache-Control": "no-cache", 77 | "Connection": "keep-alive", 78 | "Pragma": "no-cache", 79 | "Referer": "https://www.geetest.com/", 80 | "Sec-Fetch-Dest": "script", 81 | "Sec-Fetch-Mode": "no-cors", 82 | "Sec-Fetch-Site": "same-site", 83 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.40 Safari/537.36", 84 | "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"", 85 | "sec-ch-ua-mobile": "?0", 86 | "sec-ch-ua-platform": "\"Windows\"" 87 | } 88 | cookies = { 89 | "GeeTestAjaxUser": "c02c2c61d4eb11ea629cbff0a07b19df", 90 | "GeeTestUser": "ec59f466abfb8dc5a76b9e35c44273ae" 91 | } 92 | url = "https://api.geetest.com/ajax.php" 93 | params = { 94 | "gt": '019924a82c70bb123aae90d483087f94', 95 | "challenge": pic_chall_gt, 96 | "lang": "zh-cn", 97 | "%24_BBF": "0", 98 | "client_type": "web", 99 | 'w': w, 100 | "callback": f"geetest_{int(time.time() * 1000)}" 101 | } 102 | response = requests.get(url, headers=headers, cookies=cookies, params=params).text[22:-1] 103 | print('response-----', response) 104 | 105 | 106 | if __name__ == '__main__': 107 | # sucesslist=[] 108 | # for i in range(100): 109 | c, s_, pic_chall_gt = downloadpic() # 下载图片 110 | pic_reset() # 图片还原 111 | slider_ = gap() 112 | 113 | g = _slider(slider_) 114 | g_list = [] 115 | for i in g: 116 | g_list.append(i[0]) 117 | 118 | jl = (g_list[-1]) 119 | 120 | w = getw(c, s_, g, '019924a82c70bb123aae90d483087f94', pic_chall_gt, g[-1][2], jl) 121 | 122 | getres(w, pic_chall_gt) 123 | -------------------------------------------------------------------------------- /极验4滑块/分析/第0個軌跡分析.js: -------------------------------------------------------------------------------- 1 | // t[$_GDEDU(1970)] = new XXX 2 | // 這裡總共會push兩個軌跡: 3 | // 0:[X,X,X] 按某算法生成的,也是我需要的 4 | // 1: [0,0,0] 固定的, 然後之間會有一些操作?變成奇怪的值 (經過軌跡的加密函數) 5 | t[$_GDEDU(1970)] = new l[($_GDEDU(22))]([Math[$_GDEDU(670)]((s - t[$_GDEDU(1976)]) / t[$_GDECK(1905)]), Math[$_GDEDU(670)]((r - t[$_GDECK(1940)]) / t[$_GDEDU(1905)]), 0])[$_GDECK(1915)]([0, 0, 0]), 6 | t[$_GDECK(460)] = t[$_GDECK(1951)], 7 | t[$_GDEDU(1981)][$_GDEDU(1909)](), 8 | t[$_GDECK(1995)] = { 9 | "\u0078": 0, 10 | "\u0079": 0 11 | }, 12 | !0; 13 | 14 | /*** 逐個分析 ***/ 15 | 16 | /* 1. s */ 17 | 18 | // s , then 要跟i 19 | var r, s, o = n($_GDEDU(1965) + i)[$_GDEDU(1975)](), 20 | 21 | // i = t['options']['hash'] 22 | // 搵唔到,但dom元素中有呢個值,或許可以 23 | // 吾知會唔會校驗呢個hash值,有待嘗試 24 | , i = t[$_GDECK(467)][$_GDECK(657)]; 25 | 26 | 27 | /* 2. t[$_GDEDU(1976)] */ 28 | 29 | // t[$_GDEDU(1976)] = t['$_BIGV'] 30 | t[$_GDEDU(1976)] = e[$_GDECK(1956)]() 31 | 32 | // e[$_GDECK(1956)]是下面這個函數 33 | // 簡單來說就是返回鼠標的ClientX ( 或許可以固定?可能是弱校驗? ) 34 | "\u0024\u005f\u0044\u0047\u004b": function() { 35 | var $_EJCt = oTEDG.$_CO 36 | , $_EJBh = ['$_EJFA'].concat($_EJCt) 37 | , $_EJDe = $_EJBh[1]; 38 | $_EJBh.shift(); 39 | var $_EJEp = $_EJBh[0]; 40 | var e = this[$_EJCt(191)]; // 返回鼠標的一些信息 41 | // o[$_EJDe(17)] = o['isNumber'] 判斷是否數字 42 | if ((0, 43 | o[$_EJDe(17)])(e[$_EJDe(153)])) // e[$_EJDe(153)] = e['clientX'] 44 | return e[$_EJCt(153)]; // 基本上一定會走這裡,後面不用看 45 | var t = e[$_EJDe(180)] && e[$_EJDe(180)][0]; 46 | return t ? t[$_EJCt(153)] : -1; 47 | } 48 | 49 | // 3. 固定值:1.0059466666666665 == t[$_GDECK(1905)] 50 | 51 | 52 | /* 4. r */ 53 | 54 | // r = o[$_GDECK(664)] + t[$_GDEDU(467)][$_GDEDU(1848)] 55 | // 3目運算應該必然走上面這個分支 56 | return s = $_GDEDU(1901) === e[$_GDECK(110)][$_GDECK(110)][$_GDECK(253)] ? (r = a[$_GDECK(664)], 57 | a[$_GDEDU(848)]) : (r = o[$_GDECK(664)] + t[$_GDEDU(467)][$_GDEDU(1848)], 58 | 59 | // 先分析o是怎樣計算出來的 60 | var r, s, o = n($_GDEDU(1965) + i)[$_GDEDU(1975)](), 61 | 62 | 63 | // o 由 return this[$_FGDj(110)][$_FGDj(203)]() 64 | // this[$_FGDj(110)]返回驗證碼背景圖片所在的div元素 65 | // $_FGDj(203) = 'getBoundingClientRect' 66 | // 用來獲取頁面中某個元素的左、上、右、下分別相對瀏覽器視窗的位置, 67 | // 返回的是一個矩形對象,包括四個屬性,分別是left 、top、right、bottom。 68 | // 分別表示元素各邊與頁面上邊和左邊的距離。 69 | "\u0024\u005f\u0046\u0041\u0064": function() { 70 | var $_FGCg = oTEDG.$_CO 71 | , $_FGBG = ['$_FGFr'].concat($_FGCg) 72 | , $_FGDj = $_FGBG[1]; 73 | $_FGBG.shift(); 74 | var $_FGEI = $_FGBG[0]; 75 | return this[$_FGDj(110)][$_FGDj(203)](); 76 | } 77 | // o返回的東西大致如下: 78 | // 應該可以直接固定 79 | { 80 | "x": 890.0125122070312, 81 | "y": -39.75625228881836, 82 | "width": 300.375, 83 | "height": 200.35000610351562, 84 | "top": -39.75625228881836, 85 | "right": 1190.3875122070312, 86 | "bottom": 160.59375381469727, 87 | "left": 890.0125122070312 88 | } 89 | 90 | //再分析t 91 | // 目標:t[$_GDEDU(467)][$_GDEDU(1848)] => t['options']['ypos'] 92 | // 由https://gcaptcha4.geetest.com/load?callback=geetest_XXX 這個接口返回 93 | 94 | 95 | /* 5. t[$_GDECK(1940)] */ 96 | t[$_GDECK(1940)] = e[$_GDEDU(1902)](); 97 | 98 | // e[$_GDEDU(1902)]是下面這個函數 99 | // 返回ClientY 100 | "\u0024\u005f\u0044\u0048\u0049": function() { 101 | var $_EJHG = oTEDG.$_CO 102 | , $_EJGk = ['$_FAAJ'].concat($_EJHG) 103 | , $_EJIq = $_EJGk[1]; 104 | $_EJGk.shift(); 105 | var $_EJJg = $_EJGk[0]; 106 | var e = this[$_EJHG(191)]; 107 | if ((0, 108 | o[$_EJIq(17)])(e[$_EJHG(150)])) 109 | return e[$_EJIq(150)]; 110 | var t = e[$_EJHG(180)] && e[$_EJIq(180)][0]; 111 | return t ? t[$_EJHG(150)] : -1; 112 | }, 113 | 114 | // 6. 1.0059466666666665 == t[$_GDEDU(1905)] -------------------------------------------------------------------------------- /数美/.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 13 | 14 | 16 | 17 | 18 | 21 | { 22 | "keyToString": { 23 | "RunOnceActivity.OpenProjectViewOnStart": "true", 24 | "RunOnceActivity.ShowReadmeOnStart": "true", 25 | "WebServerToolWindowFactoryState": "false", 26 | "node.js.detected.package.eslint": "true", 27 | "node.js.selected.package.eslint": "(autodetect)", 28 | "vue.rearranger.settings.migration": "true" 29 | } 30 | } 31 | 32 | 33 | 34 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 1683542753505 65 | 72 | 73 | 74 | 75 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /极验4滑块/分析/w_其他分析.js: -------------------------------------------------------------------------------- 1 | // 以下作為參數傳入加密函數 -> 得到w 2 | { 3 | "setLeft": 207, 4 | "track": [], 5 | "passtime": 1455, 6 | "userresponse": 207.77631683588265, 7 | "device_id": "5d25317d91fd2c612ee3c2ec316f90b0", 8 | "lot_number": "d767f48ef29543b08e8d69384ad2f1e1", 9 | "pow_msg": "1|0|md5|2023-04-20T12:56:47.567957+08:00|24f56dc13c40dc4a02fd0318567caef5|d767f48ef29543b08e8d69384ad2f1e1||1abb42a231843c26", 10 | "pow_sign": "f99996094ea43d26a071a7822e038c4e", 11 | "geetest": "captcha", 12 | "lang": "zh", 13 | "ep": "123", 14 | "ak9j": "281841656", //這個鍵&值都會變 15 | "em": { 16 | "ph": 0, 17 | "cp": 0, 18 | "ek": "11", 19 | "wd": 1, 20 | "nt": 0, 21 | "si": 0, 22 | "sc": 0 23 | } 24 | } 25 | 26 | // 1. (空 27 | 28 | // 2: setLeft 29 | 缺口x座標 30 | 31 | // 3: passtime 32 | 完成滑動的時間 33 | 34 | // 4: userresponse 35 | // a / t[$_GDFDR(1905)] + 2 36 | // a == setLeft , t[$_GDFDR(1905)] == 1.0059466666666665 37 | var _ = { 38 | "\u0073\u0065\u0074\u004c\u0065\u0066\u0074": a, 39 | "\u0074\u0072\u0061\u0063\u006b": c, 40 | "\u0070\u0061\u0073\u0073\u0074\u0069\u006d\u0065": s, 41 | "\u0075\u0073\u0065\u0072\u0072\u0065\u0073\u0070\u006f\u006e\u0073\u0065": a / t[$_GDFDR(1905)] + 2 42 | }; 43 | 44 | // 5. device_id 45 | 可能只是對同一個網站來說是定值, "5d25317d91fd2c612ee3c2ec316f90b0" 46 | 因此要根據不同網站進行修改 47 | 關鍵字:"\u0064\u0065\u0076\u0069\u0063\u0065\u005f\u0069\u0064": 48 | 49 | // 6. lot_number 50 | 由這個接口返回 -> https://gcaptcha4.geetest.com/load?callback 51 | 52 | // 7. pow_msg 53 | // g = d[$_BJJCC(648)] 54 | v[$_BJJCC(22)])(p, f, l[$_BJJCC(650)], l[$_BJJCC(647)], l[$_BJJCC(642)], l[$_BJJCC(688)], $_BJJDO(15)) 55 | , g = d[$_BJJCC(648)] 56 | , m = d[$_BJJCC(620)]; 57 | a[$_BJJDO(467)][$_BJJCC(609)] = g, 58 | a[$_BJJDO(467)][$_BJJDO(695)] = m, 59 | a[$_BJJCC(467)][$_BJJCC(673)] && b[$_BJJDO(22)][$_BJJCC(336)]({ 60 | "\u0074\u0079\u0070\u0065": $_BJJCC(683) 61 | 62 | // d內就有pow_msg、pow_sign等參數 63 | d = (0,v[$_BJJCC(22)])(p, f, l[$_BJJCC(650)], l[$_BJJCC(647)], l[$_BJJCC(642)], l[$_BJJCC(688)], $_BJJDO(15)) 64 | 65 | ==> 66 | d = v['default'](p, f,l['hashfunc'],l['version'],l['bits'],l['datetime'],'') 67 | 68 | // l = h[$_BJJDO(615)] ==> l = h['powDetail'] 69 | h 由這個接口返回 -> https://gcaptcha4.geetest.com/load?callback 70 | 71 | // f = captchaId 72 | initGeetest4({ 73 | captchaId: "24f56dc13c40dc4a02fd0318567caef5", 74 | product: e.state.currentType, 75 | btnWidth: "100%", 76 | language: e.state.currentLang, 77 | riskType: e.state.currentRisktype 78 | }, 79 | // p = h["lotNumber"] 80 | 81 | 82 | // 生成d的函數(v['default']) 83 | function i(e, t, n, i, r, s, o) { 84 | var $_HIHJs = oTEDG.$_DX()[6][10]; 85 | for (; $_HIHJs !== oTEDG.$_DX()[2][8]; ) { 86 | switch ($_HIHJs) { 87 | case oTEDG.$_DX()[4][10]: 88 | var a = r % 4 89 | , u = parseInt(r / 4, 10) 90 | , c = function g(e, t) { 91 | var $_CEECW = oTEDG.$_CO 92 | , $_CEEBs = ['$_CEEF_'].concat($_CEECW) 93 | , $_CEEDN = $_CEEBs[1]; 94 | $_CEEBs.shift(); 95 | var $_CEEEr = $_CEEBs[0]; 96 | return new Array(t + 1)[$_CEEDN(171)](e); 97 | }($_CEDDn(162), u) 98 | , _ = i + $_CEDDn(108) + r + $_CEDCU(108) + n + $_CEDDn(108) + s + $_CEDDn(108) + t + $_CEDCU(108) + e + $_CEDDn(108) + o + $_CEDCU(108); 99 | $_HIHJs = oTEDG.$_DX()[2][9]; 100 | break; 101 | 102 | // 8: pow_sign  與 pow_msg一同生成 103 | 104 | // 9: "ak9j": "281841656" ( 生成這個鍵值都會變的東西 105 | // 執行完 -> n[$_CBHIu(738)](e) 就有了 106 | u[$_CBHIu(133)])(e, { 107 | "\u0064\u0065\u0076\u0069\u0063\u0065\u005f\u0069\u0064": i[$_CBHHo(699)], 108 | "\u006c\u006f\u0074\u005f\u006e\u0075\u006d\u0062\u0065\u0072": i[$_CBHIu(461)], 109 | "\u0070\u006f\u0077\u005f\u006d\u0073\u0067": n[$_CBHHo(467)][$_CBHIu(609)], 110 | "\u0070\u006f\u0077\u005f\u0073\u0069\u0067\u006e": n[$_CBHIu(467)][$_CBHHo(695)] 111 | }), 112 | n[$_CBHIu(738)](e); 113 | 114 | // 執行完_gct(n)後就有我要的值了 115 | if (_gct) { 116 | var n = { 117 | "\u0067\u0065\u0065\u0074\u0065\u0073\u0074": $_BJIDo(483), 118 | "\u006c\u0061\u006e\u0067": $_BJIDo(181), 119 | "\u0065\u0070": $_BJIDo(676) 120 | }; 121 | _gct(n), 122 | (0, 123 | u[$_BJICs(133)])(t, n); 124 | // 先固定試試 -------------------------------------------------------------------------------- /极验3滑块/gapsidentified.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2022/6/2 12:02 3 | # @Author : xiaobo 4 | # @Site : 5 | # @File : gapsidentified.py 6 | # @Software: PyCharm 7 | 8 | from pathlib import Path 9 | 10 | import PIL 11 | import cv2 12 | import numpy as np 13 | 14 | 15 | def imshow(img, winname='test', delay=0): 16 | """cv2展示图片""" 17 | cv2.imshow(winname, img) 18 | cv2.waitKey(delay) 19 | cv2.destroyAllWindows() 20 | 21 | 22 | def pil_to_cv2(img): 23 | """ 24 | pil转cv2图片 25 | :param img: pil图像, 26 | :return: cv2图像, 27 | """ 28 | img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) 29 | return img 30 | 31 | 32 | def bytes_to_cv2(img): 33 | """ 34 | 二进制图片转cv2 35 | :param img: 二进制图片数据, 36 | :return: cv2图像, 37 | """ 38 | # 将图片字节码bytes, 转换成一维的numpy数组到缓存中 39 | img_buffer_np = np.frombuffer(img, dtype=np.uint8) 40 | # 从指定的内存缓存中读取一维numpy数据, 并把数据转换(解码)成图像矩阵格式 41 | img_np = cv2.imdecode(img_buffer_np, 1) 42 | return img_np 43 | 44 | 45 | def cv2_open(img, flag=None): 46 | """ 47 | 统一输出图片格式为cv2图像, 48 | :param img: 49 | :param flag: 颜色空间转换类型, default: None 50 | eg: cv2.COLOR_BGR2GRAY(灰度图) 51 | :return: cv2图像, 52 | """ 53 | if isinstance(img, bytes): 54 | img = bytes_to_cv2(img) 55 | elif isinstance(img, (str, Path)): 56 | img = cv2.imread(str(img)) 57 | elif isinstance(img, np.ndarray): 58 | img = img 59 | elif isinstance(img, PIL.Image): 60 | img = pil_to_cv2(img) 61 | else: 62 | raise ValueError(f'输入的图片类型无法解析: {type(img)}') 63 | if flag is not None: 64 | img = cv2.cvtColor(img, flag) 65 | return img 66 | 67 | 68 | def get_distance(bg, tp, im_show=False, save_path=None): 69 | """ 70 | :param bg: 背景图路径或Path对象或图片二进制 71 | eg: 'assets/bg.jpg' 72 | Path('assets/bg.jpg') 73 | :param tp: 缺口图路径或Path对象或图片二进制 74 | eg: 'assets/tp.jpg' 75 | Path('assets/tp.jpg') 76 | :param im_show: 是否显示结果, ; default: False 77 | :param save_path: 保存路径, ; default: None 78 | :return: 缺口位置 79 | """ 80 | # 读取图片 81 | bg_gray = cv2_open(bg, flag=cv2.COLOR_BGR2GRAY) 82 | tp_gray = cv2_open(tp, flag=cv2.COLOR_BGR2GRAY) 83 | # 边缘检测 84 | tp_gray = cv2.Canny(tp_gray, 255, 255) 85 | bg_gray = cv2.Canny(bg_gray, 255, 255) 86 | # 目标匹配 87 | result = cv2.matchTemplate(bg_gray, tp_gray, cv2.TM_CCOEFF_NORMED) 88 | # 解析匹配结果 89 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) 90 | 91 | distance = max_loc[0] 92 | if save_path or im_show: 93 | # 需要绘制的方框高度和宽度 94 | tp_height, tp_width = tp_gray.shape[:2] 95 | # 矩形左上角点位置 96 | x, y = max_loc 97 | # 矩形右下角点位置 98 | _x, _y = x + tp_width, y + tp_height 99 | # 绘制矩形 100 | bg_img = cv2_open(bg) 101 | cv2.rectangle(bg_img, (x, y), (_x, _y), (0, 0, 255), 2) 102 | # 保存缺口识别结果到背景图 103 | if save_path: 104 | save_path = Path(save_path).resolve() 105 | save_path = save_path.parent / f"{save_path.stem}.{distance}{save_path.suffix}" 106 | save_path = save_path.__str__() 107 | cv2.imwrite(save_path, bg_img) 108 | # 显示缺口识别结果 109 | if im_show: 110 | imshow(bg_img) 111 | return distance 112 | 113 | 114 | if __name__ == '__main__': 115 | d = get_distance( 116 | bg='bg1.jpg', 117 | tp='slice.jpg', 118 | im_show=False, 119 | save_path='./assets/bg.jpg' 120 | ) 121 | print(d) 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | -------------------------------------------------------------------------------- /极验4_滑块第二种/geet4.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import json 3 | import random 4 | import time 5 | import urllib.parse 6 | import uuid 7 | import execjs 8 | import ddddocr 9 | import requests 10 | 11 | 12 | class Geet4(): 13 | static_domain = "https://static.geetest.com/" 14 | bg_url = "" 15 | slice_url = "" 16 | lot_number = "" 17 | ptime = 0 18 | 19 | def __init__(self, captcha_id): 20 | # self.r 保持session 21 | self.r = requests.session() 22 | self.captcha_id = captcha_id 23 | self.challenge = uuid.uuid4() 24 | with open("./1.js") as f: 25 | js = f.read() 26 | self.js_exec = execjs.compile(js) 27 | 28 | def _get_nowTime(self): 29 | return int(time.time() * 1000) 30 | 31 | def One_reg(self): 32 | params = { 33 | "captcha_id": self.captcha_id, 34 | "challenge": self.challenge, 35 | "client_type": "web", 36 | "risk_type": "slide", 37 | "lang": "zh", 38 | "callback": "geetest_{}".format(self._get_nowTime()) 39 | } 40 | url = "https://gcaptcha4.geetest.com/load" 41 | res = self.r.get(url, params=params).text 42 | res = res.replace(params["callback"], "")[1:-1] 43 | res_json = json.loads(res) 44 | self.bg_url = urllib.parse.urljoin(self.static_domain, res_json["data"]["bg"]) 45 | self.slice_url = urllib.parse.urljoin(self.static_domain, res_json["data"]["slice"]) 46 | self.lot_number = res_json["data"]["lot_number"] 47 | 48 | def get_bg_slice(self): 49 | bg = requests.get(self.bg_url).content 50 | slice = requests.get(self.slice_url).content 51 | # with open("./bg.jpg","wb") as f: 52 | # f.write(self.bg) 53 | # with open("./slice.jpg","wb") as f: 54 | # f.write(self.slice) 55 | return bg, slice 56 | 57 | def notch_position_x(self, bg, slice): 58 | det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False) 59 | res = det.slide_match(slice, bg, simple_target=True) 60 | return res["target"][0] 61 | 62 | def get_track(self, distance): 63 | def __ease_out_expo(sep): 64 | if sep == 1: 65 | return 1 66 | else: 67 | return 1 - pow(2, -10 * sep) 68 | 69 | if not isinstance(distance, int) or distance < 0: 70 | raise ValueError(f"distance类型必须是大于等于0的整数: distance: {distance}, type: {type(distance)}") 71 | # 初始化轨迹列表 72 | slide_track = [ 73 | [random.randint(-50, -10), random.randint(-50, -10), 0], 74 | [0, 0, 0], 75 | ] 76 | # 共记录count次滑块位置信息 77 | count = 30 + int(distance / 2) 78 | # 初始化滑动时间 79 | t = random.randint(50, 100) 80 | # 记录上一次滑动的距离 81 | _x = 0 82 | _y = 0 83 | for i in range(count): 84 | # 已滑动的横向距离 85 | x = round(__ease_out_expo(i / count) * distance) 86 | # 滑动过程消耗的时间 87 | t += random.randint(10, 20) 88 | if x == _x: 89 | continue 90 | slide_track.append([x, _y, t]) 91 | _x = x 92 | slide_track.append(slide_track[-1]) 93 | self.ptime = slide_track[-1][-1] 94 | return slide_track 95 | 96 | def get_w(self, distance, track): 97 | eee = { 98 | "device_id": "A59C", 99 | "em": "{ph: 0, cp: 0, ek: '11', wd: 1, nt: 0, sc: 0,si: 0}", 100 | "ep": "123", 101 | "geetest": "captcha", 102 | "lang": "zh", 103 | "lot_number": self.lot_number, 104 | "passtime": self.ptime, 105 | "setLeft": distance + 1, 106 | "userresponse": (distance + 1) / 1.0059466666666665, 107 | "fxy6": "143036667" 108 | } 109 | res = self.js_exec.call("get_w", eee, track) 110 | return res 111 | 112 | def ok(self, w): 113 | params = { 114 | "captcha_id": self.captcha_id, 115 | "challenge": self.challenge, 116 | "client_type": "web", 117 | "lot_number": self.lot_number, 118 | "risk_type": "slide", 119 | "pt": "1", 120 | "w": w, 121 | "callback": "geetest_{}".format(self._get_nowTime()) 122 | 123 | } 124 | url = "https://gcaptcha4.geetest.com/verify" 125 | res = self.r.get(url, params=params).text 126 | res = res.replace(params["callback"], "")[1:-1] 127 | return json.loads(res) 128 | 129 | def main(self): 130 | # 初始化获取id和滑块图 131 | self.One_reg() 132 | # 访问图片获得字节集 133 | bg, slice = self.get_bg_slice() 134 | distance = self.notch_position_x(bg, slice) 135 | print("距离:", distance) 136 | track = self.get_track(distance) 137 | # print(track) 138 | w = self.get_w(distance, track) 139 | # print(w) 140 | return self.ok(w) 141 | 142 | 143 | if __name__ == '__main__': 144 | sucess=0 145 | for i in range(100): 146 | geet = Geet4(captcha_id="24f56dc13c40dc4a02fd0318567caef5") 147 | res=geet.main() 148 | try: 149 | if res["data"]["seccode"]["pass_token"]: 150 | sucess+=1 151 | print("滑块成功") 152 | except KeyError: 153 | print("滑块失败") 154 | print(res) 155 | print('成功率',sucess/100) 156 | -------------------------------------------------------------------------------- /极验4滑块/main.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | import json 4 | import execjs 5 | import cv2 6 | import numpy as np 7 | import random 8 | 9 | captcha_id = '24f56dc13c40dc4a02fd0318567caef5' # 要根據不同網站來改 10 | 11 | class Geetest(): 12 | def __init__(self) -> None: 13 | self.sess = requests.session() 14 | with open("main.js",mode="r",encoding="utf-8") as f: 15 | jscode = f.read() 16 | self.ctx = execjs.compile(jscode) 17 | pass 18 | 19 | def run(self): 20 | initInfo = self.getSlideInit() 21 | loc_x = self.getVerifyLocationX(initInfo['data']) 22 | tracks = self.build_tracks(loc_x) 23 | self.verify(loc_x,tracks,initInfo['data']) 24 | 25 | 26 | def getSlideInit(self): 27 | headers = { 28 | 'Accept': '*/*', 29 | 'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7', 30 | 'Cache-Control': 'no-cache', 31 | 'Connection': 'keep-alive', 32 | 'Pragma': 'no-cache', 33 | 'Referer': 'https://www.geetest.com/', 34 | 'Sec-Fetch-Dest': 'script', 35 | 'Sec-Fetch-Mode': 'no-cors', 36 | 'Sec-Fetch-Site': 'same-site', 37 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', 38 | 'sec-ch-ua': '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"', 39 | 'sec-ch-ua-mobile': '?0', 40 | 'sec-ch-ua-platform': '"Windows"', 41 | } 42 | 43 | params = { 44 | 'captcha_id': captcha_id, 45 | # 'challenge': '80191920-8a98-4520-bc54-df989fe5a2b5', 46 | 'client_type': 'web', 47 | 'risk_type': 'slide', 48 | 'lang': 'zh', 49 | 'callback': 'geetest_1681309323439', 50 | } 51 | 52 | response = self.sess.get('https://gcaptcha4.geetest.com/load', params=params, headers=headers) 53 | regx = re.compile(r"geetest_.*?\((?P.*)\)") 54 | data = regx.search(response.text).group('data') 55 | return json.loads(data) 56 | 57 | def getVerifyLocationX(self,data): 58 | bg = requests.get(f"https://static.geetest.com/"+data['bg']).content 59 | bg_arr = np.asarray(bytearray(bg),dtype=np.uint8) 60 | bg_img = cv2.imdecode(bg_arr,-1) 61 | 62 | front = requests.get(f"https://static.geetest.com/"+data['slice']).content 63 | front_arr = np.asarray(bytearray(front),dtype=np.uint8) 64 | front_img = cv2.imdecode(front_arr,-1) 65 | 66 | loc_x = self.identify_gap(bg_img,front_img) 67 | return loc_x 68 | 69 | def identify_gap(self,bg,tp,out=""): 70 | ''' 識別滑塊缺口位置,返回x坐標 71 | bg: 背景图片 72 | tp: 缺口图片 73 | out:输出图片 74 | ''' 75 | # 读取背景图片和缺口图片 76 | bg_img = bg # 背景图片 77 | tp_img = tp # 缺口图片 78 | 79 | # 识别图片边缘 80 | bg_edge = cv2.Canny(bg_img, 100, 200) 81 | tp_edge = cv2.Canny(tp_img, 100, 200) 82 | 83 | # 转换图片格式 84 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB) 85 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB) 86 | 87 | # 缺口匹配 88 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED) 89 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配 90 | 91 | # 绘制方框 92 | th, tw = tp_pic.shape[:2] 93 | tl = max_loc # 左上角点的坐标 94 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标 95 | # cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形 96 | # cv2.imwrite(out, bg_img) # 保存在本地 97 | 98 | # 返回缺口的X坐标 99 | return tl[0] 100 | 101 | def build_tracks(self,target): 102 | '''自定義的軌跡方程 103 | Args: 104 | target: 目標水平位置 105 | ''' 106 | 107 | track_res = [] 108 | 109 | x = 4 110 | y = 0 111 | t = 46 112 | track_res.append([x,y,t]) 113 | while x < target: 114 | x = x + random.randint(1,4) 115 | if x > target: 116 | x = target 117 | if len(track_res) % 30 == 0: 118 | y = y - 1 119 | t = t + random.randint(8,10) 120 | track_res.append([x,y,t]) 121 | 122 | return track_res 123 | 124 | def verify(self,x,tracks,data): 125 | # x: 缺口x座標 126 | w = self.ctx.call("get_w",x,tracks,data) 127 | 128 | headers = { 129 | 'Accept': '*/*', 130 | 'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7', 131 | 'Cache-Control': 'no-cache', 132 | 'Connection': 'keep-alive', 133 | # 'Cookie': 'gt_captcha_v4_user=5226998c519348cfb93480d099a00193; sajssdk_2015_cross_new_user=1; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221879e83c4f2504-0e251547d93b35-26031b51-1327104-1879e83c4f37bd%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Fwww.geetest.com%2Fadaptive-captcha-demo%22%7D%2C%22%24device_id%22%3A%221879e83c4f2504-0e251547d93b35-26031b51-1327104-1879e83c4f37bd%22%7D; Hm_lvt_25b04a5e7a64668b9b88e2711fb5f0c4=1681991649; language=zh; Hm_lpvt_25b04a5e7a64668b9b88e2711fb5f0c4=1682002364', 134 | 'Pragma': 'no-cache', 135 | 'Referer': 'https://www.geetest.com/', 136 | 'Sec-Fetch-Dest': 'script', 137 | 'Sec-Fetch-Mode': 'no-cors', 138 | 'Sec-Fetch-Site': 'same-site', 139 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', 140 | 'sec-ch-ua': '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"', 141 | 'sec-ch-ua-mobile': '?0', 142 | 'sec-ch-ua-platform': '"Windows"', 143 | } 144 | 145 | params = { 146 | 'callback': 'geetest_1682004074403', 147 | 'captcha_id': captcha_id, 148 | 'client_type': 'web', 149 | 'lot_number': data['lot_number'], 150 | 'risk_type': 'slide', 151 | 'payload': data['payload'], 152 | 'process_token': data['process_token'], 153 | 'payload_protocol': data['payload_protocol'], 154 | 'pt': data['pt'], 155 | 'w': w, 156 | } 157 | resp = self.sess.get('https://gcaptcha4.geetest.com/verify', params=params, headers=headers) 158 | 159 | print(resp.text) 160 | 161 | if __name__ == '__main__': 162 | geet = Geetest() 163 | geet.run() -------------------------------------------------------------------------------- /易盾滑块/main.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import execjs 3 | import re 4 | import json 5 | import cv2 6 | import numpy as np 7 | import random 8 | 9 | 10 | class dun163(): 11 | def __init__(self) -> None: 12 | with open("enc.js",mode="r",encoding="utf-8") as f: 13 | jscode = f.read() 14 | self.ctx = execjs.compile(jscode) 15 | 16 | self.headers = { 17 | 'Accept': '*/*', 18 | 'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7', 19 | 'Cache-Control': 'no-cache', 20 | 'Connection': 'keep-alive', 21 | 'Pragma': 'no-cache', 22 | 'Referer': 'https://dun.163.com/', 23 | 'Sec-Fetch-Dest': 'script', 24 | 'Sec-Fetch-Mode': 'no-cors', 25 | 'Sec-Fetch-Site': 'same-site', 26 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36', 27 | 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 28 | 'sec-ch-ua-mobile': '?0', 29 | 'sec-ch-ua-platform': '"Windows"', 30 | } 31 | 32 | self.sess = requests.session() 33 | self.cb = "" 34 | def run(self): 35 | 36 | verifyInfo = self.getVerifyImg() 37 | loc_x = self.getVerifyImgLocationX(verifyInfo) 38 | track_arr = self.build_tracks(loc_x) 39 | _data = self.ctx.call("get_data",track_arr,verifyInfo["token"],loc_x) 40 | self.checkCode(verifyInfo['token'],_data,self.cb) 41 | 42 | 43 | 44 | def getVerifyImg(self): 45 | params = { 46 | 'referer': 'https://dun.163.com/trial/jigsaw', 47 | 'zoneId': 'CN31', 48 | 'acToken': '', 49 | 'id': '07e2387ab53a4d6f930b8d9a9be71bdf', 50 | 'fp': 'CJaGvGNcJp\\XmBSLHdVtqc6nsmUjKuHg\\3xxhiGs4U5obw7tzuZ/h6dg8dtESJaGu13Z43\\qgUHHK5YQtPd6M/QGn7/zuQ1VxKLUPpeVMe/2UbaVLTdw9q2b8w784wW4R+qipx+x1S0HzaR4k09Y6hKdQDKk9808zmr8WN1uTrz7KBv2:1680618143464', 51 | 'https': 'true', 52 | 'type': '2', 53 | 'version': '2.21.3', 54 | 'dpr': '1.25', 55 | 'dev': '1', 56 | 'cb': 'fz+UhOn8RyxEg\\KlHIoIPlP\\NzqL5ucIQWQl+b7u9Z7Jl\\4t8pt/FZ9/15kUNmXN', 57 | 'ipv6': 'false', 58 | 'runEnv': '10', 59 | 'group': '', 60 | 'scene': '', 61 | 'lang': 'zh-CN', 62 | 'sdkVersion': 'undefined', 63 | 'width': '320', 64 | 'audio': 'false', 65 | 'sizeType': '10', 66 | 'smsVersion': 'v2', 67 | 'token': '', 68 | 'callback': '__JSONP_7k6jiz0_0', 69 | } 70 | params['fp'] = self.ctx.call("get_fp") 71 | params['cb'] = self.ctx.call("get_cb") 72 | self.cb = params['cb'] 73 | response = self.sess.get('https://c.dun.163.com/api/v3/get', params = params, headers = self.headers) 74 | regx = re.compile(r".*?\((?P.*?)\)",re.S) 75 | jdata = json.loads(regx.search(response.text).group("dic"))['data'] 76 | return { 77 | 'bg':jdata['bg'][0], 78 | 'front':jdata['front'][0], 79 | 'token':jdata['token'] 80 | } 81 | 82 | def getVerifyImgLocationX(self,verifyInfo): 83 | bg = requests.get(verifyInfo['bg']).content 84 | with open("bg.jpg",mode="wb") as f: 85 | f.write(bg) 86 | bg_arr = np.asarray(bytearray(bg),dtype=np.uint8) 87 | bg_img = cv2.imdecode(bg_arr,-1) 88 | 89 | front = requests.get(verifyInfo['front']).content 90 | front_arr = np.asarray(bytearray(front),dtype=np.uint8) 91 | front_img = cv2.imdecode(front_arr,-1) 92 | 93 | loc_x = self.identify_gap(bg_img,front_img) 94 | return loc_x 95 | 96 | def identify_gap(self,bg,tp,out=""): 97 | ''' 識別滑塊缺口位置,返回x坐標 98 | bg: 背景图片 99 | tp: 缺口图片 100 | out:输出图片 101 | ''' 102 | # 读取背景图片和缺口图片 103 | bg_img = bg # 背景图片 104 | tp_img = tp # 缺口图片 105 | 106 | # 识别图片边缘 107 | bg_edge = cv2.Canny(bg_img, 100, 200) 108 | tp_edge = cv2.Canny(tp_img, 100, 200) 109 | 110 | # 转换图片格式 111 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB) 112 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB) 113 | 114 | # 缺口匹配 115 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED) 116 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配 117 | 118 | # 绘制方框 119 | th, tw = tp_pic.shape[:2] 120 | tl = max_loc # 左上角点的坐标 121 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标 122 | # cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形 123 | # cv2.imwrite(out, bg_img) # 保存在本地 124 | 125 | # 返回缺口的X坐标 126 | return tl[0] 127 | 128 | def build_tracks(self,target): 129 | '''自定義的軌跡方程 130 | Args: 131 | target: 目標水平位置 132 | ''' 133 | 134 | track_res = [] 135 | 136 | x = 4 137 | y = 0 138 | t = 46 139 | track_res.append([x,y,t]) 140 | while x < target: 141 | x = x + random.randint(1,4) 142 | if x > target: 143 | x = target 144 | if len(track_res) % 30 == 0: 145 | y = y - 1 146 | t = t + random.randint(8,10) 147 | track_res.append([x,y,t]) 148 | 149 | return track_res 150 | 151 | def checkCode(self,token,data,cb): 152 | params = { 153 | 'referer': 'https://dun.163.com/trial/jigsaw', 154 | 'zoneId': 'CN31', 155 | 'id': '07e2387ab53a4d6f930b8d9a9be71bdf', 156 | 'token': token, 157 | 'acToken': 'undefined', 158 | 'data': '{"d":"QSX9uO911ZlbyxTHyBlR/Ydu9GSVj4lQ9lgI4z8eL1QO1Ly1m58ODys0gNvHJqnUoUfGB\\\\Ls5pDHp6iY8AL987GnTkBYdNjqSVODNbtw97PqFRpLnAL6m7uo4HM5SvlkLluNtfuejxj3","m":"","p":"zkmpOtobmURbSGvK1EbMEgI6bOGjDKqP","ext":"phktVx2iKUW/k8W9aUp/ji/p1ka3"}', 159 | 'width': '320', 160 | 'type': '2', 161 | 'version': '2.21.3', 162 | 'cb': 'lL1ebHabbB7Ay67cu\\gP/ErHOc7GcA8Ax7tNJcQ5EnaxXV6mnrhnyzt/bePQ9uEJ', 163 | 'extraData': '', 164 | 'bf': '0', 165 | 'runEnv': '10', 166 | 'sdkVersion': 'undefined', 167 | 'callback': '__JSONP_ik2ginl_1', 168 | } 169 | params['data'] = data 170 | params['cb'] = cb 171 | 172 | response = self.sess.get('https://c.dun.163.com/api/v3/check', params=params, headers=self.headers) 173 | print(response.text) 174 | 175 | 176 | 177 | 178 | 179 | 180 | if __name__ == "__main__": 181 | dun = dun163() 182 | dun.run() 183 | -------------------------------------------------------------------------------- /数美/数美滑块.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import base64 3 | import json 4 | import random 5 | import time 6 | import urllib.parse 7 | import cv2 8 | 9 | from pyDes import des, ECB 10 | import numpy as np 11 | import requests 12 | 13 | 14 | class shumei: 15 | domain_url="https://castatic.fengkongcloud.cn/" 16 | bg_url="" 17 | fg_url="" 18 | rid="" 19 | bg=None 20 | fg=None 21 | def __init__(self): 22 | self.r=requests.session() 23 | 24 | def get_captcha(self,organization): 25 | url="https://captcha.fengkongcloud.cn/ca/v1/register" 26 | param={ 27 | "rversion": "1.0.3", 28 | "sdkver": "1.1.3", 29 | "data": "{}", 30 | "callback": "sm_"+str(int(time.time()*1000)), 31 | "organization": organization, 32 | "model": "slide", 33 | "lang":"zh-cn", 34 | "appId": "default", 35 | "channel": "DEFAULT" 36 | } 37 | response=self.r.get(url,params=param) 38 | try: 39 | if response.status_code==200: 40 | sm_json=json.loads(response.text[17:-1]) 41 | bg=sm_json["detail"]["bg"] 42 | fg=sm_json["detail"]["fg"] 43 | self.bg_url=urllib.parse.urljoin(self.domain_url,bg) 44 | self.fg_url=urllib.parse.urljoin(self.domain_url,fg) 45 | self.rid=sm_json["detail"]["rid"] 46 | # print(param,"params") 47 | # print(response.text,"请求") 48 | 49 | except: 50 | print(response.text) 51 | print("未知失败,自己验证") 52 | 53 | #访问背景前景页面 54 | def _visit_bg_fg(self): 55 | try: 56 | self.bg=self.r.get(self.bg_url).content 57 | self.fg=self.r.get(self.fg_url).content 58 | with open("a.png","wb") as f: 59 | f.write(self.r.get(self.bg_url).content) 60 | with open("b.png","wb") as f: 61 | f.write(self.r.get(self.fg_url).content) 62 | 63 | return True 64 | except: 65 | print("获取前景背景图片失败") 66 | return None 67 | def get_distance(self): 68 | if self._visit_bg_fg() is None: 69 | return 70 | # with open('a.png', 'rb') as f: 71 | # background_bytes = f.read() 72 | # 73 | # with open('b.png', 'rb') as f: 74 | # target_bytes = f.read() 75 | # res = det.slide_match(self.fg, self.bg) 76 | # # 获取的图片是600像素 但验证是300 所以除以二 77 | # print(res) 78 | # return int(res["target"][0]) 79 | 80 | target = cv2.imdecode(np.asarray(bytearray(self.fg), dtype=np.uint8), 0) 81 | template = cv2.imdecode(np.asarray(bytearray(self.bg), dtype=np.uint8), 0) 82 | result = cv2.matchTemplate(target, template, cv2.TM_CCORR_NORMED) 83 | _, distance = np.unravel_index(result.argmax(), result.shape) 84 | return distance 85 | 86 | def pad(self,b): 87 | """ 88 | 块填充 89 | """ 90 | block_size = 8 91 | while len(b) % block_size: 92 | b += b'\0' 93 | return b 94 | def getEncryptContent(self,a, b): 95 | # js = execjs.compile(self.js_code) 96 | # 97 | # print(a,b,js.call("getEncryptContent", a, b)) 98 | # return js.call("getEncryptContent", a, b) 99 | des_obj = des(b.encode(), mode=ECB) 100 | content = self.pad(str(a).replace(' ', '').encode()) 101 | return base64.b64encode(des_obj.encrypt(content)).decode('utf-8') 102 | 103 | def get_trajectory(self,distance): 104 | ge = [] 105 | y = 0 106 | v = 0 107 | t = 1 108 | current = 0 109 | mid = distance * 3 / 4 110 | exceed = 20 111 | z = t 112 | 113 | ge.append([0, 0, 1]) 114 | 115 | while current < (distance + exceed): 116 | if current < mid / 2: 117 | a = 15 118 | elif current < mid: 119 | a = 20 120 | else: 121 | a = -30 122 | a /= 2 123 | v0 = v 124 | s = v0 * t + 0.5 * a * (t * t) 125 | current += int(s) 126 | v = v0 + a * t 127 | 128 | y += random.randint(-5, 5) 129 | z += 100 + random.randint(0, 10) 130 | 131 | ge.append([min(current, (distance + exceed)), y, z]) 132 | 133 | while exceed > 0: 134 | exceed -= random.randint(0, 5) 135 | y += random.randint(-5, 5) 136 | z += 100 + random.randint(0, 10) 137 | ge.append([min(current, (distance + exceed)), y, z]) 138 | # print(ge) 139 | return ge 140 | 141 | # return "{}".format(ge).replace(" ", ""), ge[-1][2] 142 | # return "{}".format(ge).replace(" ", "") 143 | 144 | def ok(self,tq,ub,zs,organization): 145 | url="https://captcha.fengkongcloud.cn/ca/v2/fverify" 146 | params={ 147 | "sdkver": "1.1.3", 148 | "cn": "4gX7HfzFoIE=", 149 | "je": "J95iyFR+B34=", 150 | "rid": self.rid, 151 | "vm": "kRSb3H6Sr+M=", 152 | "zj": "YXtzSGH4Kx4=", 153 | "protocol": "148", 154 | "act.os": "web_pc", 155 | "tq": tq, 156 | "ox": "ixh0fmsqQqE=", 157 | "tb": "jbIXAuW9ClU=", 158 | "organization": organization, 159 | "fp": "ePjf+CsNviw=", 160 | "ub": ub, 161 | "rr": "yYCBEY0C7PQ=", 162 | "ostype": "web", 163 | "rversion": "1.0.3", 164 | "zs":zs, 165 | "callback": "sm_1646734280304" 166 | } 167 | res=self.r.get(url,params=params) 168 | print(res.text) 169 | if json.loads(res.text[17:-1])["riskLevel"]=="PASS": 170 | return True 171 | 172 | def main(self,organization="RlokQwRlVjUrTUlkIqOg"): 173 | self.get_captcha(organization) 174 | #distance距离 175 | distance = self.get_distance() 176 | print(distance,"距离") 177 | # tq加密的滑动距离 178 | tq=self.getEncryptContent(distance/600,"c78a7666") 179 | #ub滑动时间 180 | ub=self.getEncryptContent(random.randint(2001,4999),"eb994a6b") 181 | #zs滑动轨迹 182 | trajectory=self.get_trajectory(distance/2) 183 | # print(trajectory) 184 | zs=self.getEncryptContent(trajectory,"201cab4a") 185 | if self.ok(tq,ub,zs,organization): 186 | return self.rid 187 | 188 | 189 | 190 | sm=shumei() 191 | requestId=sm.main(organization="xQsKB7v2qSFLFxnvmjdO") 192 | if requestId is not None: 193 | print("滑块成功") 194 | # url="http://jpebook.ly.com/suppliersharing/Account/Login" 195 | # headers={ 196 | # "Host": "jpebook.ly.com", 197 | # "Connection": "keep-alive", 198 | # "Accept": "application/json, text/plain, */*", 199 | # "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36", 200 | # "Content-Type": "application/json;charset=UTF-8", 201 | # "Origin": "http://jpebook.ly.com", 202 | # "Referer": "http://jpebook.ly.com/suppliersharing/Account/Login?ReturnUrl=%2Fsuppliersharing", 203 | # "Accept-Language": "zh-CN,zh;q=0.9" 204 | # } 205 | # data={"type":0,"loginName":"你是黑脸怪","password":"8ae252facf16cf0b0d8677bb3f889d33","checkPassword":"","validCode":"","codeResponse":requestId,"codeType":"sm"} 206 | # res=requests.post(url=url,json=data,headers=headers) 207 | # print(res.text) 208 | else: 209 | print("滑块失败,重来一次吧") 210 | 211 | # print(distance,get_random(distance)) 212 | 213 | -------------------------------------------------------------------------------- /易盾滑块/test.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import execjs 3 | import re 4 | import json 5 | import cv2 6 | import numpy as np 7 | import random 8 | 9 | 10 | class dun163(): 11 | def __init__(self) -> None: 12 | with open("enc.js",mode="r",encoding="utf-8") as f: 13 | jscode = f.read() 14 | self.ctx = execjs.compile(jscode) 15 | 16 | self.headers = { 17 | 'Accept': '*/*', 18 | 'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7', 19 | 'Cache-Control': 'no-cache', 20 | 'Connection': 'keep-alive', 21 | 'Pragma': 'no-cache', 22 | 'Referer': 'https://dun.163.com/', 23 | 'Sec-Fetch-Dest': 'script', 24 | 'Sec-Fetch-Mode': 'no-cors', 25 | 'Sec-Fetch-Site': 'same-site', 26 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36', 27 | 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 28 | 'sec-ch-ua-mobile': '?0', 29 | 'sec-ch-ua-platform': '"Windows"', 30 | } 31 | 32 | self.sess = requests.session() 33 | self.cb = "" 34 | def run(self): 35 | 36 | verifyInfo = self.getVerifyImg() 37 | loc_x = self.getVerifyImgLocationX(verifyInfo) 38 | track_arr = self.build_tracks(loc_x) 39 | _data = self.ctx.call("get_data",track_arr,verifyInfo["token"],loc_x) 40 | self.checkCode(verifyInfo['token'],_data,self.cb) 41 | 42 | 43 | 44 | def getVerifyImg(self): 45 | params = { 46 | 'referer': 'https://dun.163.com/trial/jigsaw', 47 | 'zoneId': 'CN31', 48 | 'acToken': '', 49 | 'id': '07e2387ab53a4d6f930b8d9a9be71bdf', 50 | 'fp': 'CJaGvGNcJp\\XmBSLHdVtqc6nsmUjKuHg\\3xxhiGs4U5obw7tzuZ/h6dg8dtESJaGu13Z43\\qgUHHK5YQtPd6M/QGn7/zuQ1VxKLUPpeVMe/2UbaVLTdw9q2b8w784wW4R+qipx+x1S0HzaR4k09Y6hKdQDKk9808zmr8WN1uTrz7KBv2:1680618143464', 51 | 'https': 'true', 52 | 'type': '2', 53 | 'version': '2.21.3', 54 | 'dpr': '1.25', 55 | 'dev': '1', 56 | 'cb': 'fz+UhOn8RyxEg\\KlHIoIPlP\\NzqL5ucIQWQl+b7u9Z7Jl\\4t8pt/FZ9/15kUNmXN', 57 | 'ipv6': 'false', 58 | 'runEnv': '10', 59 | 'group': '', 60 | 'scene': '', 61 | 'lang': 'zh-CN', 62 | 'sdkVersion': 'undefined', 63 | 'width': '320', 64 | 'audio': 'false', 65 | 'sizeType': '10', 66 | 'smsVersion': 'v2', 67 | 'token': '', 68 | 'callback': '__JSONP_7k6jiz0_0', 69 | } 70 | params['fp'] = self.ctx.call("get_fp") 71 | params['cb'] = self.ctx.call("get_cb") 72 | self.cb = params['cb'] 73 | response = self.sess.get('https://c.dun.163.com/api/v3/get', params = params, headers = self.headers) 74 | regx = re.compile(r".*?\((?P.*?)\)",re.S) 75 | jdata = json.loads(regx.search(response.text).group("dic"))['data'] 76 | return { 77 | 'bg':jdata['bg'][0], 78 | 'front':jdata['front'][0], 79 | 'token':jdata['token'] 80 | } 81 | 82 | def getVerifyImgLocationX(self,verifyInfo): 83 | bg = self.sess.get(verifyInfo['bg']).content 84 | bg_arr = np.asarray(bytearray(bg),dtype=np.uint8) 85 | bg_img = cv2.imdecode(bg_arr,-1) 86 | 87 | front = self.sess.get(verifyInfo['front']).content 88 | front_arr = np.asarray(bytearray(front),dtype=np.uint8) 89 | front_img = cv2.imdecode(front_arr,-1) 90 | 91 | loc_x = self.identify_gap(bg_img,front_img) 92 | return loc_x 93 | 94 | def identify_gap(self,bg,tp,out="out.jpg"): 95 | ''' 識別滑塊缺口位置,返回x坐標 96 | bg: 背景图片 97 | tp: 缺口图片 98 | out:输出图片 99 | ''' 100 | # 读取背景图片和缺口图片 101 | bg_img = bg # 背景图片 102 | tp_img = tp # 缺口图片 103 | 104 | # 识别图片边缘 105 | bg_edge = cv2.Canny(bg_img, 100, 200) 106 | tp_edge = cv2.Canny(tp_img, 100, 200) 107 | 108 | # 转换图片格式 109 | bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB) 110 | tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB) 111 | 112 | # 缺口匹配 113 | res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED) 114 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配 115 | 116 | # 绘制方框 117 | th, tw = tp_pic.shape[:2] 118 | tl = max_loc # 左上角点的坐标 119 | br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标 120 | cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形 121 | cv2.imwrite(out, bg_img) # 保存在本地 122 | 123 | # 返回缺口的X坐标 124 | return tl[0] 125 | 126 | def build_tracks(self,target): 127 | '''自定義的軌跡方程 128 | Args: 129 | target: 目標水平位置 130 | ''' 131 | 132 | track_res = [] 133 | 134 | x = 4 135 | y = 0 136 | t = 46 137 | track_res.append([x,y,t]) 138 | while x < target: 139 | x = x + random.randint(1,4) 140 | if x > target: 141 | x = target 142 | if len(track_res) % 30 == 0: 143 | y = y - 1 144 | t = t + random.randint(8,10) 145 | track_res.append([x,y,t]) 146 | 147 | return track_res 148 | 149 | def checkCode(self,token,data,cb): 150 | headers = { 151 | 'Accept': '*/*', 152 | 'Accept-Language': 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7', 153 | 'Cache-Control': 'no-cache', 154 | 'Connection': 'keep-alive', 155 | # 'Cookie': '_ga=GA.1.288ffd5247189.2eaa87d52df9504b4b1a; Hm_lvt_4671c5d502135636b837050ec6d716ce=1680831446; __root_domain_v=.163.com; _qddaz=QD.110080831446904; Hm_lpvt_4671c5d502135636b837050ec6d716ce=1680833869', 156 | 'Pragma': 'no-cache', 157 | 'Referer': 'https://dun.163.com/', 158 | 'Sec-Fetch-Dest': 'script', 159 | 'Sec-Fetch-Mode': 'no-cors', 160 | 'Sec-Fetch-Site': 'same-site', 161 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36', 162 | 'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"', 163 | 'sec-ch-ua-mobile': '?0', 164 | 'sec-ch-ua-platform': '"Windows"', 165 | } 166 | params = { 167 | 'referer': 'https://dun.163.com/trial/jigsaw', 168 | 'zoneId': 'CN31', 169 | 'id': '07e2387ab53a4d6f930b8d9a9be71bdf', 170 | 'token': token, 171 | 'acToken': 'undefined', 172 | 'data': '{"d":"QSX9uO911ZlbyxTHyBlR/Ydu9GSVj4lQ9lgI4z8eL1QO1Ly1m58ODys0gNvHJqnUoUfGB\\\\Ls5pDHp6iY8AL987GnTkBYdNjqSVODNbtw97PqFRpLnAL6m7uo4HM5SvlkLluNtfuejxj3","m":"","p":"zkmpOtobmURbSGvK1EbMEgI6bOGjDKqP","ext":"phktVx2iKUW/k8W9aUp/ji/p1ka3"}', 173 | 'width': '320', 174 | 'type': '2', 175 | 'version': '2.21.3', 176 | 'cb': 'lL1ebHabbB7Ay67cu\\gP/ErHOc7GcA8Ax7tNJcQ5EnaxXV6mnrhnyzt/bePQ9uEJ', 177 | 'extraData': '', 178 | 'bf': '0', 179 | 'runEnv': '10', 180 | 'sdkVersion': 'undefined', 181 | 'callback': '__JSONP_ik2ginl_1', 182 | } 183 | params['data'] = data 184 | params['cb'] = cb 185 | 186 | response = self.sess.get('https://c.dun.163.com/api/v3/check', params=params, headers=headers) 187 | print(response.text) 188 | 189 | 190 | 191 | 192 | 193 | 194 | if __name__ == "__main__": 195 | dun = dun163() 196 | dun.run() 197 | -------------------------------------------------------------------------------- /极验3滑块/down_pic.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Time : 2022/6/1 10:30 3 | # @Author : xiaobo 4 | # @Site : 5 | # @File : down_pic.py 6 | # @Software: PyCharm 7 | import json 8 | import time 9 | 10 | import requests 11 | import urllib.request 12 | 13 | def get_chall_gt(sess): 14 | headers = { 15 | "authority": "www.geetest.com", 16 | "accept": "application/json, text/javascript, */*; q=0.01", 17 | "accept-language": "zh-CN,zh;q=0.9", 18 | "cache-control": "no-cache", 19 | "pragma": "no-cache", 20 | "referer": "https://www.geetest.com/demo/slide-float.html", 21 | "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"", 22 | "sec-ch-ua-mobile": "?0", 23 | "sec-ch-ua-platform": "\"Windows\"", 24 | "sec-fetch-dest": "empty", 25 | "sec-fetch-mode": "cors", 26 | "sec-fetch-site": "same-origin", 27 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.40 Safari/537.36", 28 | "x-requested-with": "XMLHttpRequest" 29 | } 30 | sess.headers = headers 31 | url = "https://www.geetest.com/demo/gt/register-slide" 32 | params = { 33 | "t": int(time.time() * 1000) 34 | } 35 | response = sess.get(url, headers=headers, params=params).json() 36 | print(response) 37 | # get_php() 38 | return response 39 | 40 | 41 | def get_php(res_chall_gt, sess): 42 | headers = { 43 | # "Host": "apiv6.geetest.com", 44 | # "Connection": "keep-alive", 45 | "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"", 46 | "sec-ch-ua-mobile": "?0", 47 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.40 Safari/537.36", 48 | "sec-ch-ua-platform": "\"Windows\"", 49 | # "Accept": "*/*", 50 | # "Sec-Fetch-Site": "same-site", 51 | # "Sec-Fetch-Mode": "no-cors", 52 | # "Sec-Fetch-Dest": "script", 53 | # "Referer": "https://www.geetest.com/", 54 | # "Accept-Encoding": "gzip, deflate, br", 55 | # "Accept-Language": "zh-CN,zh;q=0.9", 56 | "Cookie": "GeeTestUser=d0f290c60ff46c8308097fc8e8ea1459" 57 | } 58 | sess.headers = headers 59 | 60 | url = "https://apiv6.geetest.com/get.php" 61 | params = { 62 | "gt": "019924a82c70bb123aae90d483087f94", 63 | "challenge": res_chall_gt['challenge'], 64 | "lang": "zh-cn", 65 | "pt": "0", 66 | "client_type": "web", 67 | "w": "A3HF(MKLkgJ5I3)5PW3Itdt0gglu8cs75N0wnyQZTktFj(EzyPIDhOQ8Qsl7DqSBy8AiRry(hsnzN)6uUXl9eECrhpxAS9AiCr40drGCjlgul(38Cj0oxtnDlxzpZZH4HZIrzgUSqneLkdiNg46osZmGhz4)7sToym)Rmwjvb2ASIkszDAUX(r80LOsegrPaWsIS5nUyEnWMlUDkGTA4CRy)7TyHxkYpWDT87P8cUMv(qX)FhA3PtMT)JrG1flESJSP7Eq7SHE66RmrvesBIth9nIrW3fCaIqzXxQ9N6V(s4xLLAyBRF(SgkR093bzj191aBKpYLQSYNwHLLkls3RuGFCfrfpoe6(XaEHhv9vpOM3g0yJPqo5aX2QCTiWC775wl(CyY1Qh8xKvcA(Wml7kSS(SFWQD7mq7Eg6YO2HSapD)CyltwymUbsDsM1WyStENQRxVgooZ6bvMN0r20n2LdoBEMUIVz4gk)gMVHScfmXXoTDbq5pB6z9EOzZTPRUEIWw6F4f4SE3SbcpD0qQEzwrtkgFpf5UANBXhYqxJIB0vG4JaaqS0jiXwDOSHeCwW1b1y0TJbpN7iwPJQBZPyG(lvTM5eODIuYLo9zOPBIP04VPp94v0I3LJF84v93S4FOr5s764RQEwV530LUYE7vbW(aeb29XCn7b2kEVDiQfnlF(Xs4AtFnK6eYO5(cD36bCw1H)5ptBSpfgRpzf7bIRD6jlX0qsaOHFEEwcI)2k6iG064YBgvFiylaAxmDGehnZ19c309YmLxpRljXlXoEx)DsOMBX9NirSc94KEpcNLZcAtBdwnUf04FuVnxDZdn29zs87rHuPRHwazF04pLrGX)4cqgwKOsvooDzyvQFrNJahJPzBB3IbbZRDjoVGCoJpfSIzP7pDMaVS1ExN8rXHDH)C0H5u2MxbcuUEMhaAT9zJIqaQsbcBGgWRMh17TGP5LBZ8ADNiE7)9Vz8KaSxYZYvD1(PzsB2HTiKesyLyx3eN31UsjfyOU85z4y8UbaFt5j0yjVaOxKPdBrJK496yYEc3brY2VeHlX1YaxSnZkXIpBVVoFVLM3DVty0b(hH2Ubtlidcv6HrtSMbDNU2PNhytTVWKEaB0kU23967K1h9DM4wEQw5ZW6AFnJ6oXWnfq3tzTWTFByL3F6ZJo7sVvqW6in0ijtALK6ndHePz534tKpIfsX3FbX0JxqvbjLo6RZoVkCoVvcn5(jf9we48sZF8wOZWdaAYudeav4Ii0Kap6Vgy6ttG0oNB3f3lpTI2RHbndi8Bpzmx80n2dIfwOtx3S(o6zBq)3jzO2UdCxnrUscTb)2uPophLZgDKNwX1cF6lXf)0WsSRlArMnzEnABAHBQ7be0ULoXiYQpPlHUTAN72x9nCsz3AxfXj2nWHCHgqgmOvu)ohlaq8JRr08YvTl)fePuooslJgfHvTVlgSOG)24y2KvmMljYMf)Kv5Aw)fs9)NLV6Nije27UG73(hYuNwC8GetewzoNYVY9B7A6evOW8GWl8x2kbV(WXAhWDq7tnNtn)LDfZrpi5aIBH8yoPtzUcJdz92C5zowBisWM68vWInfpcmF3voXEWE3eLGgqJ(7YCT1oQ5nUGk8WaVlC9A7KDrC0eg7yU)5A8bTotrXTL8ofLLFpS70tVJmtSGv3CusYXjULTyHJcw4ZwJ8Z1tLVMwZphNnfiWgVmUdVmE7K(7pZIEdizj(aBcnsx53LruFJFT6T9Hu6Dny1DYXdANW(x3GT6gfRMtozDH)V7OY98cPDgM7GRMFzD6DvJA7LSMnUKAn(5U0szViHc9aWEPUZCR6xg8fQw)ognrTBvC2Rz1akEjF7fBrHXAbcRIQ67Om64sgWv1MxNudF)zEdUuUAfJfvotlS39ZhF92ET2OTE2sTgm(SnKFboUcVMMipLiImYKADBnBW5KuVyxsLhuvOwbtGorxxEPIrzAoSlCPGKEAILk)uS4lNtOgI3re2ftWX9L5jazND)w7noeSfp7b(L3UrUXpyHyNy345TGZ(S83MUdBmY6zKDUYnyHlXw0)4mC7p(43xsbb3rPSbSFFXiN39lfs7twkCsk.17497f2c2e7be7382505daaaaea6f3b28cd3b568626c8a0294f8b8f05ebdf29457819e41746711777c5b2b273df2030f32e47f72717d940d6c26f5cafbd9b62b13244efcdcf51ec1d03bd9c7bff66cc208fb6e15d245b052852c3f82cad1cb25c4e64595cc33d95dae90c6fc6ab58413693f8a1d64f1143d804edf34342adffb", 68 | "callback": f"geetest_{int(time.time() * 1000)}" 69 | } 70 | response = sess.get(url, headers=headers, params=params).text[22:-1] 71 | 72 | c,s=json.loads(response)['data']['c'],json.loads(response)['data']['s'] 73 | 74 | return c,s 75 | 76 | def get_ajax_php(res_chall_gt, sess): 77 | headers = { 78 | "Host": "api.geetest.com", 79 | "Connection": "keep-alive", 80 | "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"", 81 | "sec-ch-ua-mobile": "?0", 82 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.40 Safari/537.36", 83 | "sec-ch-ua-platform": "\"Windows\"", 84 | "Accept": "*/*", 85 | "Sec-Fetch-Site": "same-site", 86 | "Sec-Fetch-Mode": "no-cors", 87 | "Sec-Fetch-Dest": "script", 88 | "Referer": "https://www.geetest.com/", 89 | "Accept-Encoding": "gzip, deflate, br", 90 | "Accept-Language": "zh-CN,zh;q=0.9", 91 | "Cookie": "GeeTestAjaxUser=c02c2c61d4eb11ea629cbff0a07b19df; GeeTestUser=ec59f466abfb8dc5a76b9e35c44273ae" 92 | } 93 | params = { 94 | "gt": "019924a82c70bb123aae90d483087f94", 95 | "challenge": res_chall_gt['challenge'], 96 | "lang": "zh-cn", 97 | "pt": "0", 98 | "client_type": "web", 99 | 'w': '', 100 | "callback": f"geetest_{int(time.time() * 1000)}" 101 | } 102 | sess.headers = headers 103 | url = 'https://api.geetest.com/ajax.php?' 104 | print(sess.get(url=url, params=params).text) 105 | 106 | 107 | def getpic(res_chall_gt, sess): 108 | headers = { 109 | # "Host": "api.geetest.com", 110 | # "Connection": "keep-alive", 111 | # "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"102\", \"Google Chrome\";v=\"102\"", 112 | # "sec-ch-ua-mobile": "?0", 113 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.40 Safari/537.36", 114 | # "sec-ch-ua-platform": "\"Windows\"", 115 | # "Accept": "*/*", 116 | # "Sec-Fetch-Site": "same-site", 117 | # "Sec-Fetch-Mode": "no-cors", 118 | # "Sec-Fetch-Dest": "script", 119 | # "Referer": "https://www.geetest.com/", 120 | # "Accept-Encoding": "gzip, deflate, br", 121 | # "Accept-Language": "zh-CN,zh;q=0.9", 122 | "Cookie": "GeeTestAjaxUser=c02c2c61d4eb11ea629cbff0a07b19df; GeeTestUser=ec59f466abfb8dc5a76b9e35c44273ae" 123 | } 124 | sess.headers = headers 125 | 126 | url = "https://api.geetest.com/get.php?" 127 | params = { 128 | "is_next": "true", 129 | "type": "slide3", 130 | "gt": "019924a82c70bb123aae90d483087f94", 131 | "challenge": res_chall_gt['challenge'], 132 | "lang": "zh-cn", 133 | "https": "true", 134 | "protocol": "https://", 135 | "offline": "false", 136 | "product": "embed", 137 | "api_server": "api.geetest.com", 138 | "isPC": "true", 139 | "autoReset": "true", 140 | "width": "100%", 141 | "callback": f"geetest_{int(time.time() * 1000)}" 142 | } 143 | response = sess.get(url, headers=headers, params=params).text[22:-1] 144 | print(json.loads(response)) 145 | challenge=json.loads(response)['challenge'] 146 | s_=json.loads(response)['s'] 147 | bg=json.loads(response)['bg'] 148 | fullbg=json.loads(response)['fullbg'] 149 | slice=json.loads(response)['slice'] 150 | urllib.request.urlretrieve('http://static.geetest.com/'+bg,'bg.jpg') 151 | urllib.request.urlretrieve('http://static.geetest.com/'+fullbg,'fullbg.jpg') 152 | urllib.request.urlretrieve('http://static.geetest.com/'+slice,'slice.jpg') 153 | return challenge,s_ 154 | 155 | 156 | if __name__ == '__main__': 157 | sess = requests.session() 158 | 159 | res_chall_gt = get_chall_gt(sess) #获取challenge,以及gt 160 | 161 | c,s=get_php(res_chall_gt, sess) #获取s以及c的值 162 | 163 | get_ajax_php(res_chall_gt, sess) 164 | 165 | getpic(res_chall_gt, sess) #获取图片信息 166 | -------------------------------------------------------------------------------- /极验4滑块/分析/w_track分析.js: -------------------------------------------------------------------------------- 1 | "https://gcaptcha4.geetest.com/verify?callback=geetest_1681309625549&captcha_id=24f56dc13c40dc4a02fd0318567caef5&client_type=web&lot_number=12a5bc0af01f49f8a0e331ca923b9007&risk_type=slide&payload=39Gl86BQgpTxeuyf4iPX07XXFkx0bovpnI3h_rl8H_56UKy4OMaldrXfWf7mRvGD_naaOGkjucUPlaFhfpgZw3f1TuwWVz-LImQi0hwKV61zXSvzORGz-huXDl-LMUtqj7w7wAzIbeVCVlfWU_29ptkCP7koaIJfsOI0Z1rDcF79QSaF4w_GlxDI5X4tcSVtajPuPYK8m2D-08xf_ZvLWfDqKtGtrMK3_AbyEHIj64s7KrMJN7PU-EdsHPlXQyg2N2g5ojDjU2kv5Zp-S2GRgIqHUB6QK9fXzLnqBxnM1bZIhrVzYkLcBBsDOqBPdLpA2AoupjBcL_1E33Y541fZGYFmK6quBD0pawVaRZ6QMhwzfPgtFGzmAQBFOVm9vC7_Q8i4V-6-G2XFzuCT6RJ5QxJIixN30TuPI2D2MSBFxWbgHOh43NtQ5NXcWvnsMthasiaenvI0iSDWPqTXpKUhck0WmxRnItD6vDnAt7c-zrIw0_ptOSQhstJek1_2lVj-lqnEibqS-fsJYc8tATqc9tDjWRX8BMsTpNg8hAS8tYjNJ9SDvx4gF-T2O0vGeeOhWxA8jE6fmOJTqiYKin3dlJW2EQzdXxdoU60zK58DX8JljLYTuC-SRPqjuhhyeZIm_fAsr0C_gAEeCGTYuqxZNF6KSiQUoYfgA7YDMcaDpeMdRcGtivnRIqPxAzcbrSO-nuuvEGnOxAHhwwvYR_V4ILU0unaxVgbVTpmKrXsBAElu1xA1b6pdcOhkl2MUINLTvdnxfO58EX1JgF6LqKRxfzauq2Cljma_-Hb6ZjhIYHPjunK0-j0Qzt_yJMFWOapTx_vPUiLxiHfGD9ccSbp9Lh-aDBnxjj11YJM4_T-dNKGNjPxlZT_g1lnKYlW2B1CC3xqnIcSt1hHbR6tSlblL8ahUXJnwlamiCxNu8fe6GWOyzeIS8g1ggXxqE7JCTZ5uN2bwufvpZ0r-uATba-mbts5Ns0eWm8BXz3KveIZf49rX6tDkctGwWGPtQ2pLINNeKAsxLdAaVG4sJRm9z47wlIt7o-cN4axk_m4f4I7fa_sDQlw0Si5jJk4e-osXH0NI5JVDhqpcp4Wa_WLcWiGPkFcaDf07pVBVZxHtyNVBcwouSrLlLYkNNzSgEG7orXRt0xFNdxvyGXsYxmbTdQAVHF8Na4TZx39ga5aTW8E6uIgtKWOkq2oHMKEGa920NpeNYEpVAbESxyDSf-t10-niZtBa3bGsRBk14MZdGlvkjU-MFiOUvb7cyRVhVJyhaVd70AJfpuNXpIb1U3IkmBWgiyjfU_xxjqHwhip-liD7LxZE9Cpby687m0qPobijfmMy2H9UNJGwBILxqEug3WKbcd2cx66UdC1npF8BcjfY2mrAbDfwohmwbwzdiLmxCuT0Yx2ajeMC5hnfGtViCb-hl-iqQ_qo6MAiT9fQvXmzCQGcf0kNpOU9XVp_zXAWZzrm2GrKTRpv0xWR3O0K3HpylYDVrUh9y0E4uR3VMgGRP0JghUGA1hr36dWYj4pPhnwcok2KpUQZfx9_clWhrHa4VpptDz5cNoh_VJg2KIjr3c25h8l6Eifg6mRPKRccDGJTwheKrMXF9N-rnaUaJWFA8RBiuVmsF2U3oPiehlNm3hqGEtm804numHZFKgRIlJJNFh1mFKGOjcF9_ePlWEdsw9Mdksgf3Si3IS56t_jdUUeBPRG-55qKXjBXAurMDlznRZzu6GZQUMtwu0IKBXRzEG45gkwP1zfWpC_ODgQrJNBqhsLXsnONkcEoM38rBtnCkDClFirc8hmkI5E9OmUprvjLR-Za5R64LMaUNSPUHvVX9FRTo4QLUqvDQry6yhI5x1sM84yGYuRw0pxsw7xUOv6oMvyz0TSnB4CDNv-ChTCvk1BC2EPwKEATbEzugqBr6zckRgmHqngNW_QBcRIWLhHZPC-1CEMBGkasJUkqSJiiciYbLG1feoiXM8HjVCzZrPOkQDgtQIwzC6L18JPXuxFwpDXO_o2wE4SuM0NxlIQ7Du-_nf64xtwToZje4OKUBEDA12iqyk8H7jJtR-KDd-hvlJA7mBx1QeR41Nn3lIwZHJCivWDUt0kt0eAB8DNhHX_eOpdYWYls1LXsd2DCn470G1xH04r61rJIx7aaPBLUbfZjKA0AOvHS2VCU8dTsX1LoYGZ0xT6jDcFcI-oGwamTg5puS11SIJcxP3HDvgdRmaYycSMNnqWUqKneUkKp8rxw8ffI7mDtvKaHhCQ9E-eWxp3bqbNXVsdNkyBn3iiYcec17BUQLDqU-HWiweKnr1J6kFuxaiZfDgDKS8Q2Oa9ZvRRJga29ZX3VCGZtDM89WS0VlSqeiNpAsC3iNdpG3USojV6ohHamrBoN3FTpipBIsdpQC8J6I7SmqQPHMElFHM6wX0ewqYLWmXUW4vHiCe6t-GXmMCiiarltoLUXkdRGEtH5TKQpTPQoGfs_ZAo9n5eBnGW4cCJEWj1ThCjLHSkpmq9IjYDE1B-kx_0NSnHwczxp4mslF-xGYYKgGiuP9boVCGf4Ah02uOyb9Y6URo2gHV8siKlx6soATD2CG_m76lpr9G5NRRsJ59S5IMcq-u1BD2YYVRMXkUcCHwXXr69UQydJxTZgCMbxPHAhTGUEOLmDcm_I28c0_3t_HNrjX0Z2Y-UVFh-czy7maBPf1_p1flHu6ZRdlVEg7iKawisY9HIEUfYRQ28XzzZXM-EW0Yftz_LQZAFXKS8yalrtFiIclr2dg26-1gbCZZLhPTw65ubUmwJIJSMCXXHDQTj-HSdCZYPxo4hXlc5BFgzPVYHCSM5Mi6NL7wj4jj6ty0POSZSnu2kq10MM2QMbRQqq7CqTSRDrD4iPzYSTw1mNMb7odxE9_MWYF2MUQFNMUAice9DhIpLf_OI-qU8tncCs4B8C0cJOegO7HpvTqqeSAJN1LGnFcjsIKDjZy9N3UJmENpPyKEsss9poJ9ZDiUxvCf8xIJtDYd6gOeduOoxbcSXrKau8fHi86bgmtXpJzpKgqZr33g-2jkmVXHCRnhF2i_stHIyXY-RNTLsVE5ACmBHoLkRlNicVKtd4n22H8mY8gtqhI0JVhcnGh8NzxSg%3D&process_token=79d0e8b4c65133201c98b36185818ecc34f12ffb23ff3ee42e02f4b445f00488&payload_protocol=1&pt=1&w=75e2d145d0b41d2468284984c962f437fd7ee52c80241c8b913285db6ce0ccf087c4920d6e047ab7c0e6315b36f8dc2ccf214f3db79da5cddaaba176b2ca3e1124add4ffdcb036b422373e5eb84b06daa2cb886d9aae3744ef26e0d3ca9f10e4c7d75b1af6e3a5f3f416e9be3b6b2275e153c05e0f091aa094240afccdd55684a7b29da39c135b2915529ef99e13dd758ff504cb1d94be4122935c265447b60bb78b1481d4b140943a28b8d763528903dce2db48720a7ff6300c196b02fae8a89fa7f0816476b28127f4e492758b6aca6d1cf3d5a2f83355c34f2f0971686521a76c3e9048a291309ccc69ee908e413ae3913ad51efc777f13edda29d7b06d3460cd376aa16faf23b35c234e449c3aa2c01b3a0b0061622fdc5bdfcd2fa114b37280d800f5110139bfbc2e72c4a04c76abee4560f12535680c4cf262064304193f5a1ad745332191b66ee679e8c6aa39d66bd42b942cfe522ce145d1799f081ccf9eb999d0a62b335d54cfc9bf9a021c232efdd1ed76098ed9536e1586d4580bae3410314862561f90537f4141ed6bf68ac3532b33850871928ec34541a76c3dfd8b836e4901c251f5f200ad5c217c0b679f2e1891604cf1f46396cfb04fef715a1084a17013791147aad1d27ee6ba3fa608310fb195e308f674540b09440e7c58838b301ab5b764c7d8412d25a22fc074d75c76d484b8f8f8d1c7fdb6c62239af5e90a9afdc85bae5b0cd678a45b1ce16bd1dcdc2f93f72857e509ee51c19dade45b9cc028013342666ffa89d0b371535805a0307572b79aa54f629fc82d357f37f983a89199f97236b89adcfb1f1a288d583176e204c5a8f5a191811a62123b412a81fa6e79b83c492725b45a5d91f5b5a446f611bcf412046c1fe4cbbb75da5285e8b31a6f49c9626b70b617e681b2dbf2a879868e7fcc014ca25285a6303868d83e799d6e5c92a47c7f3f77f6406" 2 | // w參數 3 | // 流程:先生成軌跡 -> 對軌跡加密 -> 傳入生成w參數的函數中 4 | 5 | // a 6 | var r = (0, 7 | f[$_BDCDk(129)])(n, t, o, a); 8 | 9 | // s 10 | c[$_CBHHo(433)])(t, $_CBHIu(714), s, a)[$_CBHIu(377)](function(e) { 11 | var $_CBIHT = oTEDG.$_CO 12 | 13 | // r 14 | var r = (0, 15 | d[$_CBHIu(22)])(f[$_CBHHo(22)][$_CBHIu(524)](e), i) 16 | 17 | ////////////////////////////////// 軌跡分析: ////////////////////////////////// 18 | // -16後就是缺口的x坐標? 19 | 20 | 21 | // _內的c 22 | var _ = { 23 | "\u0073\u0065\u0074\u004c\u0065\u0066\u0074": a, 24 | "\u0074\u0072\u0061\u0063\u006b": c, 25 | "\u0070\u0061\u0073\u0073\u0074\u0069\u006d\u0065": s, 26 | "\u0075\u0073\u0065\u0072\u0072\u0065\u0073\u0070\u006f\u006e\u0073\u0065": a / t[$_GDFDR(1905)] + 2 27 | }; 28 | 29 | // c是加密後的軌跡,u不知係咪初始軌跡? 30 | c = l[$_GDFCw(22)][$_GDFCw(26)][$_GDFCw(661)](u) 31 | 32 | 33 | // 軌跡加密 34 | "\u0024\u005f\u0042\u0042\u0043\u006e": function(e) { 35 | var $_BIDHE = oTEDG.$_CO 36 | , $_BIDGU = ['$_BIEAM'].concat($_BIDHE) 37 | , $_BIDIw = $_BIDGU[1]; 38 | $_BIDGU.shift(); 39 | var $_BIDJZ = $_BIDGU[0]; 40 | for (var t, n, i, r = [], s = 0, o = 0, a = e[$_BIDIw(157)] - 1; o < a; o += 1) 41 | t = Math[$_BIDHE(670)](e[o + 1][0] - e[o][0]), 42 | n = Math[$_BIDHE(670)](e[o + 1][1] - e[o][1]), 43 | i = Math[$_BIDHE(670)](e[o + 1][2] - e[o][2]), 44 | 0 === t && 0 === n && 0 === i || (0 === t && 0 === n ? s += i : (r[$_BIDIw(113)]([t, n, i + s]), 45 | s = 0)); 46 | return 0 !== s && r[$_BIDHE(113)]([t, n, s]), 47 | r; 48 | }, 49 | 50 | 51 | // t[$_GDFCw(1970)][$_GDFDR(432)]是軌跡數據(可能前面有做一D處理) 52 | // t['$_BIJG']['$_BABH'] 53 | u = 160 < t[$_GDFCw(1970)][$_GDFDR(432)][$_GDFDR(157)] ? t[$_GDFCw(1970)][$_GDFDR(432)][$_GDFCw(127)](0, 160) : t[$_GDFDR(1970)][$_GDFCw(432)] 54 | 55 | 56 | // t = this , t在此被賦軌跡? this的軌跡從何而來? 57 | $_GDBGF.shift(); 58 | var $_GDBJf = $_GDBGF[0]; 59 | var t = this; 60 | t[$_GDBIf(1913)] = new o[($_GDBIf(22))](document), 61 | t[$_GDBHB(1917)] = new o[($_GDBHB(22))](window), 62 | t[$_GDBIf(1913)][$_GDBIf(206)]($_GDBIf(1935), function(e) { 63 | 64 | 65 | // (hook點), 執行完t = this後就可以hook,睇下邊到set左個值 66 | "\u0069\u006e\u0069\u0074\u0045\u0076\u0065\u006e\u0074": function() { 67 | var $_GCGCc = oTEDG.$_CO 68 | , $_GCGBw = ['$_GCGFA'].concat($_GCGCc) 69 | , $_GCGDO = $_GCGBw[1]; 70 | $_GCGBw.shift(); 71 | var $_GCGEO = $_GCGBw[0]; 72 | var t = this 73 | 74 | 75 | 76 | // t[$_GDEDU(1970)] 77 | // (計算t['$_BIJG']的地方,即初始化軌跡的地方) 78 | // 軌跡的第1個數據就是在這裡得出 79 | var r, s, o = n($_GDEDU(1965) + i)[$_GDEDU(1975)](), a = n($_GDEDU(1889) + i)[$_GDEDU(1975)](); 80 | return s = $_GDEDU(1901) === e[$_GDECK(110)][$_GDECK(110)][$_GDECK(253)] ? (r = a[$_GDECK(664)], 81 | a[$_GDEDU(848)]) : (r = o[$_GDECK(664)] + t[$_GDEDU(467)][$_GDEDU(1848)], 82 | o[$_GDEDU(848)]), 83 | // here 84 | t[$_GDEDU(1970)] = new l[($_GDEDU(22))]([Math[$_GDEDU(670)]((s - t[$_GDEDU(1976)]) / t[$_GDECK(1905)]), Math[$_GDEDU(670)]((r - t[$_GDECK(1940)]) / t[$_GDEDU(1905)]), 0])[$_GDECK(1915)]([0, 0, 0]), 85 | t[$_GDECK(460)] = t[$_GDECK(1951)], 86 | t[$_GDEDU(1981)][$_GDEDU(1909)](), 87 | t[$_GDECK(1995)] = { 88 | "\u0078": 0, 89 | "\u0079": 0 90 | }, 91 | 92 | // push第0個軌跡的地方 93 | // e是第0個軌跡 94 | function r(e) { 95 | var $_HIGGA = oTEDG.$_DX()[0][10]; 96 | for (; $_HIGGA !== oTEDG.$_DX()[8][9]; ) { 97 | switch ($_HIGGA) { 98 | case oTEDG.$_DX()[0][10]: 99 | this[$_BICIK(432)] = [e]; 100 | $_HIGGA = oTEDG.$_DX()[6][9]; 101 | break; 102 | } 103 | } 104 | } 105 | 106 | 107 | 108 | // push後續軌跡的地方 this[$_BIDCK(432)][$_BIDCK(113)](e) 109 | // this['$_BABH']['push'](e) 110 | // 除了第1個軌跡之外的軌跡由這裡push進 111 | "\u0024\u005f\u0042\u0041\u0045\u0043": function(e) { 112 | var $_BIDCK = oTEDG.$_CO 113 | , $_BIDBE = ['$_BIDFt'].concat($_BIDCK) 114 | , $_BIDDY = $_BIDBE[1]; 115 | $_BIDBE.shift(); 116 | var $_BIDEN = $_BIDBE[0]; 117 | return this[$_BIDCK(432)][$_BIDCK(113)](e), 118 | 119 | 120 | 121 | } 122 | ///////////////////////////////////////////////////////////////////////////////////////////// 123 | 124 | // w參數的加密函數 125 | function r(e, t) { 126 | var $_HJHEj = oTEDG.$_DX()[4][10]; 127 | for (; $_HJHEj !== oTEDG.$_DX()[6][6]; ) { 128 | switch ($_HJHEj) { 129 | case oTEDG.$_DX()[0][10]: 130 | var n = t[$_DIEIS(467)]; 131 | $_HJHEj = oTEDG.$_DX()[2][9]; 132 | 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /数美/数美ast.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs");//文件读写 2 | const parse = require("@babel/parser"); //解析为ast 3 | const traverse = require('@babel/traverse').default;//遍历节点 4 | const types = require('@babel/types'); 5 | const parser = require("@babel/parser"); 6 | //类型 7 | const generator = require('@babel/generator').default;//ast解析为代码 8 | 9 | console.time("耗时:") 10 | // 读取js文件 11 | let jscode = fs.readFileSync( 12 | './demo.js', { 13 | encoding: 'utf-8' 14 | } 15 | ); 16 | // let jscode = ` 17 | 18 | // ` 19 | let ast = parse.parse(jscode);//js转ast 20 | 21 | //获取自执行函数 22 | let visitor1 = { 23 | "NumericLiteral|StringLiteral"(path) { 24 | delete path.node.extra; 25 | }, 26 | // 获取自执行函数,第一个自执行会改变大数组的顺序,所以这里遍历一下把自执行函数的代码保存给全局 后面运行 27 | "CallExpression"(path) { 28 | let {node} = path; 29 | if (!node.callee || node.callee.type !== "FunctionExpression") return; 30 | if (!node.arguments || node.arguments.length !== 2) return; 31 | if (node.arguments[0].type !== "Identifier") return; 32 | //修改大数组的是一个匿名函数,这里加个感叹号让他语法没问题 33 | let changeAst = parser.parse("!" + path.toString()); 34 | let ChangeArrayOrder = generator(changeAst, opts = {"compact": true}).code; 35 | console.log("改变数组顺序的自执行代码:", ChangeArrayOrder) 36 | global["ChangeArrayOrder"] = ChangeArrayOrder; 37 | path.remove(); 38 | } 39 | } 40 | //解决大数组 41 | let visitorArray = { 42 | "VariableDeclarator"(path) { 43 | let {id, init} = path.node; 44 | if (!init || init.type !== "ArrayExpression" || init.elements.length < 1) return; 45 | let binding = path.scope.getBinding(id.name); 46 | if (binding.references === 0) { 47 | path.remove; 48 | return 49 | } 50 | if (init.elements.every(element => element.type === "StringLiteral")) { 51 | //获取父级函数,如果没有就说明是最外层定义的数组 52 | let funcName = path.getFunctionParent(); 53 | if (funcName === null) { 54 | console.log("大数组名字应该是:", id.name) 55 | global["largeArray"] = path.toString(); 56 | path.remove; 57 | // 父级作用域传给另外一个函数操作 58 | getDecName(path.parentPath) 59 | 60 | } else { 61 | // 获取最后一个返回的函数名 和父级函数名对比,如果一样 就eval 62 | let lastElement = funcName.node.body.body.at(-1) 63 | if (!lastElement.argument || !lastElement.argument.callee) return; 64 | if (lastElement.type !== "ReturnStatement" && lastElement.argument.callee.name !== funcName.node.id.name) return; 65 | console.log("大数组名字应该是函数名:", funcName.node.id.name) 66 | let largeArrayAst = parser.parse(funcName.toString()); 67 | global["largeArray"] = generator(largeArrayAst, opts = {"compact": true}).code; 68 | // 父级作用域传给另外一个函数操作 获取解字符串函数 69 | getDecName(funcName.parentPath) 70 | // 移除掉大数组 71 | funcName.remove() 72 | } 73 | 74 | } 75 | 76 | }, 77 | } 78 | 79 | function RecursiveAssignment(path, pPathString) { 80 | eval(global["largeArray"]); //加载大数组 81 | eval(pPathString); //加载解密函数 82 | eval(global["ChangeArrayOrder"]) 83 | 84 | 85 | if (!pPathString || !global["largeArray"] || !global["ChangeArrayOrder"]) { 86 | throw "有些没解析全,退出" 87 | } 88 | // 递归函数,因为他的引用又是一个赋值新变量操作 89 | //代码长这样子的: var _0x1e4a2f = _0x4a9d; console.log(_0x4a9d(100)); 90 | let {name} = path.node.id; 91 | let binding = path.scope.getBinding(name); 92 | for (p of binding.referencePaths) { 93 | let pPath = p.parentPath; 94 | let {node} = pPath; 95 | if (node.type === "VariableDeclarator") { 96 | let leftName = node.id.name; 97 | let rightName = node.init.name; 98 | // console.log("似乎要把解密函数"+rightName+"赋值给", leftName); 99 | // // 先改成解密函数的名字, 100 | pPath.scope.rename(leftName, rightName); 101 | RecursiveAssignment(pPath, pPathString); 102 | // // 移除掉赋值新变量名 103 | pPath.remove(); 104 | 105 | } 106 | //console.log(pPath.toString()); 107 | if (node.type === "CallExpression" && node.arguments.length === 1 && node.arguments.every(element => element.type === "NumericLiteral")) { 108 | let pPathCode = pPath.toString(); 109 | 110 | let result = eval(pPathCode) 111 | // console.log(pPathCode, ":", result); 112 | pPath.replaceWith(types.valueToNode(result)) 113 | } 114 | } 115 | 116 | 117 | } 118 | 119 | // 获取解密函数代码 120 | let getDecryption = { 121 | "FunctionDeclaration"(path) { 122 | // 判断函数是不是需要传两个参数 123 | let {node} = path; 124 | let {body} = node; 125 | if (!node.params || node.params.length !== 2) return; 126 | if (!body || !body.body) return; 127 | let lastReturn = body.body.at(-1) 128 | if (lastReturn.type !== "ReturnStatement" || !lastReturn.argument || !lastReturn.argument.expressions) return; 129 | let lastCall = lastReturn.argument.expressions.at(-1) 130 | if (lastCall.type !== "CallExpression" || lastCall.arguments.length !== 2) return; 131 | let name = node.id.name; 132 | console.log("解密函数的名字是:", name); 133 | let decryAst = parser.parse(path.toString()); 134 | let decryCode = generator(decryAst, opts = {"compact": true}).code; 135 | RecursiveAssignment(path, decryCode); 136 | // 移除解字符串函数 137 | path.remove(); 138 | } 139 | 140 | } 141 | var getDecName = (path) => { 142 | // 这个函数 通过大数组的作用域传入同级作用域 来获得解密函数 143 | let {scope} = path; 144 | scope.traverse(scope.block, getDecryption); 145 | 146 | } 147 | 148 | // 优化加减乘除操作和解对象 149 | let visitor2 = { 150 | // 优化加减乘除操作 151 | "BinaryExpression": { 152 | exit(path) { 153 | let {node} = path; 154 | let {left} = node; 155 | let {right} = node; 156 | if ((left.type === "UnaryExpression" || left.type === "NumericLiteral") && (right.type === "UnaryExpression" || right.type === "NumericLiteral")) { 157 | let leftValue; 158 | let rightValue; 159 | if (left.type === "NumericLiteral") { 160 | leftValue = left.value 161 | } else { 162 | if (!left.argument.value) return; 163 | if (left.operator === "-") { 164 | leftValue = -left.argument.value 165 | } 166 | } 167 | 168 | if (right.type === "NumericLiteral") { 169 | rightValue = right.value 170 | } else { 171 | if (!right.argument.value) return; 172 | if (left.operator === "-") { 173 | rightValue = -right.argument.value 174 | } 175 | } 176 | if (!leftValue) return; 177 | 178 | //console.log(leftValue, node.operator, rightValue); 179 | 180 | path.replaceWith(types.valueToNode(path.evaluate(leftValue + node.operator + rightValue).value)); 181 | } 182 | } 183 | }, 184 | //解对象 185 | "VariableDeclarator"(path) { 186 | // 其他的话对局部数组做的,比如代码: 187 | // var _0x4b4e24 = { 188 | // "Xpwku": "
=6)return; 215 | //console.log("旧代码111", pPath.toString()); 216 | pPath.replaceWith(types.valueToNode(rightNode.value)); 217 | modificationNum+=1 218 | //console.log("新代码111", pPath.toString()) 219 | //console.log("-------------------") 220 | } else if (rightNode.type === "FunctionExpression") { 221 | // 此时这里的pPath.node为_0xa7a3b2["JHTcH"] 还要上一级才会有arguments的东西 222 | node = pPath.parentPath.node; 223 | let {parentPath} = pPath 224 | if (node.type !== "CallExpression") return; 225 | if (!rightNode.body || !rightNode.body.body) return; 226 | let bodyResult = rightNode.body.body[0]; 227 | if (bodyResult.type !== "ReturnStatement") return; 228 | let {arguments} = node; 229 | //BinaryExpression 就是长这样的代码 return _0x398914 == _0x5433f6; 230 | if (bodyResult.argument.type === "BinaryExpression") { 231 | let {operator} = bodyResult.argument 232 | // 只有一个参数,说明是判断类型的,右边固定 233 | if (arguments.length === 1) { 234 | parentPath.replaceWith(types.binaryExpression(operator, node.arguments[0], bodyResult.argument.right)) 235 | modificationNum+=1 236 | } else if (arguments.length === 2) { 237 | // console.log("旧代码222", pPath.toString()) 238 | parentPath.replaceWith(types.binaryExpression(operator, node.arguments[0], node.arguments[1])) 239 | modificationNum+=1 240 | // console.log("新代码222", parentPath.toString()) 241 | // console.log("-------------------") 242 | 243 | } 244 | } else if (bodyResult.argument.type === "CallExpression") { 245 | if (node.arguments.length >= 1) { 246 | // console.log("旧代码", pPath.parentPath.toString()) 247 | pPath.parentPath.replaceWith(types.callExpression(node.arguments[0], node.arguments.slice(1))); 248 | modificationNum+=1 249 | // console.log("新代码", pPath.parentPath.toString()) 250 | // console.log("-------------------") 251 | } 252 | }else if(bodyResult.argument.type==="LogicalExpression"){ 253 | parentPath.replaceWith(types.logicalExpression("||", node.arguments[0], node.arguments[1])) 254 | modificationNum+=1 255 | } 256 | } 257 | 258 | } 259 | if(modificationNum===binding.referencePaths.length){ 260 | // console.log("删除了一个小数组。") 261 | path.remove() 262 | } 263 | } 264 | } 265 | 266 | // 获取动态post参数和加密的key 267 | let key_dict=[]; 268 | let visitor3={ 269 | "AssignmentExpression"(path){ 270 | let {node}=path; 271 | let {left,right}=node; 272 | if(!left.property||left.property.type!=="StringLiteral")return 273 | if(!right||!right.arguments||right.arguments.length!==2)return; 274 | if(right.arguments[1].type!=="StringLiteral"||right.arguments[1].value.length!==8)return; 275 | // console.log(left.property.value,right.arguments[1].value) 276 | key_dict.push([left.property.value,right.arguments[1].value]) 277 | } 278 | } 279 | traverse(ast, visitor1); 280 | traverse(ast, visitorArray); 281 | traverse(ast, visitor2); 282 | traverse(ast, visitor3); 283 | console.log(key_dict) 284 | 285 | 286 | let {code} = generator(ast, opts = { 287 | compact: true, 288 | jsescOption: {minified: true, retainFunctionParens: true, retainLines: true} 289 | }) 290 | fs.writeFile('./demoNew.js', code, (err) => { 291 | }); 292 | 293 | console.timeEnd("耗时:") -------------------------------------------------------------------------------- /极验4_滑块第二种/1.js: -------------------------------------------------------------------------------- 1 | window = global; 2 | navigator = { 3 | "appName": "Netscape" 4 | }; 5 | window.navigator = navigator; 6 | 7 | 8 | function get_track(e) { 9 | for (var t, s, n, a = [], o = 0, r = 0, i = e['length'] - 1; r < i; r += 1) { 10 | t = Math['round'](e[r + 1][0] - e[r][0]); 11 | s = Math['round'](e[r + 1][1] - e[r][1]); 12 | n = Math['round'](e[r + 1][2] - e[r][2]); 13 | 0 === t && 0 === s && 0 === n || (0 === t && 0 === s ? o += n : (a['push']([t, s, n + o]), o = 0)); 14 | } 15 | return 0 !== o && a['push']([t, s, o]), a; 16 | } 17 | 18 | function n_encrypt() { 19 | var n = function () { 20 | var e; 21 | var s = Object['create'] || function () { 22 | function s() { 23 | } 24 | 25 | return function (e) { 26 | var t; 27 | return s["prototype"] = e, t = new s(), s['prototype'] = null, t; 28 | }; 29 | }(); 30 | var t = {}; 31 | var n = t['lib'] = {}; 32 | var a = n['Base'] = { 33 | "extend": function (e) { 34 | var t = s(this); 35 | return e && t['mixIn'](e), t['hasOwnProperty']('init') && this['init'] !== t['init'] || (t['init'] = function () { 36 | t['$super']['init']['apply'](this, arguments); 37 | }), (t['init']['prototype'] = t)['$super'] = this, t; 38 | }, 39 | "create": function () { 40 | var e = this['extend'](); 41 | return e['init']['apply'](e, arguments), e; 42 | }, 43 | "init": function () { 44 | }, 45 | "mixIn": function (e) { 46 | for (var t in e) e['hasOwnProperty'](t) && (this[t] = e[t]); 47 | e['hasOwnProperty']('toString') && (this['toString'] = e['toString']); 48 | } 49 | }; 50 | var u = n["WordArray"] = a["extend"]({ 51 | "init": function (e, t) { 52 | e = this['words'] = e || []; 53 | t != undefined ? this['sigBytes'] = t : this['sigBytes'] = 4 * e["length"]; 54 | }, 55 | "concat": function (e) { 56 | var t = this['words']; 57 | var s = e['words']; 58 | var n = this['sigBytes']; 59 | var a = e['sigBytes']; 60 | if (this["clamp"](), n % 4) for (var o = 0; o < a; o++) { 61 | var r = s[o >>> 2] >>> 24 - o % 4 * 8 & 255; 62 | t[n + o >>> 2] |= r << 24 - (n + o) % 4 * 8; 63 | } else for (o = 0; o < a; o += 4) t[n + o >>> 2] = s[o >>> 2]; 64 | return this['sigBytes'] += a, this; 65 | }, 66 | "clamp": function () { 67 | var e = this['words']; 68 | var t = this['sigBytes']; 69 | e[t >>> 2] &= 4294967295 << 32 - t % 4 * 8; 70 | e["length"] = Math["ceil"](t / 4); 71 | } 72 | }); 73 | var o = t["enc"] = {}; 74 | var p = o["Latin1"] = { 75 | "parse": function (e) { 76 | for (var t = e['length'], s = [], n = 0; n < t; n++) s[n >>> 2] |= (255 & e["charCodeAt"](n)) << 24 - n % 4 * 8; 77 | 78 | return new u["init"](s, t); 79 | } 80 | }; 81 | var r = o["Utf8"] = { 82 | "parse": function (e) { 83 | return p["parse"](unescape(encodeURIComponent(e))); 84 | } 85 | }; 86 | var i = n["BufferedBlockAlgorithm"] = a["extend"]({ 87 | "reset": function () { 88 | this['$_JAr'] = new u["init"](); 89 | this["$_BCFd"] = 0; 90 | }, 91 | "$_BCGa": function (e) { 92 | 'string' == typeof e && (e = r["parse"](e)); 93 | this['$_JAr']["concat"](e); 94 | this["$_BCFd"] += e['sigBytes']; 95 | }, 96 | "$_BCHV": function (e) { 97 | var t = this['$_JAr']; 98 | var s = t['words']; 99 | var n = t['sigBytes']; 100 | var a = this['blockSize']; 101 | var o = n / (4 * a); 102 | var r = (e ? o = Math["ceil"](o) : o = Math["max"]((0 | o) - this["$_BCIO"], 0)) * a; 103 | var i = Math["min"](4 * r, n); 104 | 105 | if (r) { 106 | for (var _ = 0; _ < r; _ += a) this["$_BCJO"](s, _); 107 | 108 | var c = s["splice"](0, r); 109 | t['sigBytes'] -= i; 110 | } 111 | 112 | return new u['init'](c, i); 113 | }, 114 | "$_BCIO": 0 115 | }); 116 | var _ = t["algo"] = {}; 117 | var c = n["Cipher"] = i['extend']({ 118 | "cfg": a['extend'](), 119 | "createEncryptor": function (e, t) { 120 | return this['create'](this['$_BDAS'], e, t); 121 | }, 122 | "init": function (e, t, s) { 123 | this["cfg"] = this["cfg"]['extend'](s); 124 | this["$_BDBd"] = e; 125 | this["$_BDCs"] = t; 126 | this["reset"](); 127 | }, 128 | "reset": function () { 129 | i["reset"]["call"](this); 130 | this["$_BDDg"](); 131 | }, 132 | "process": function (e) { 133 | 134 | return this["$_BCGa"](e), this["$_BCHV"](); 135 | }, 136 | "finalize": function (e) { 137 | 138 | return e && this["$_BCGa"](e), this["$_BDEO"](); 139 | }, 140 | "keySize": 4, 141 | "ivSize": 4, 142 | "$_BDAS": 1, 143 | "$_BDFj": 2, 144 | "$_BDGs": function (c) { 145 | 146 | return { 147 | "encrypt": function (e, t, s) { 148 | t = p['parse'](t); 149 | s && s["iv"] || ((s = s || {})["iv"] = p['parse']("0000000000000000")); 150 | for (var n = b["encrypt"](c, e, t, s), a = n["ciphertext"]['words'], o = n["ciphertext"]['sigBytes'], r = [], i = 0; i < o; i++) { 151 | var _ = a[i >>> 2] >>> 24 - i % 4 * 8 & 255; 152 | r["push"](_); 153 | } 154 | 155 | return r; 156 | } 157 | }; 158 | } 159 | }); 160 | var g = t["mode"] = {}; 161 | var l = n["BlockCipherMode"] = a['extend']({ 162 | "createEncryptor": function (e, t) { 163 | 164 | return this["Encryptor"]['create'](e, t); 165 | }, 166 | "init": function (e, t) { 167 | this["$_BDHv"] = e; 168 | this["$_BDIy"] = t; 169 | } 170 | }); 171 | var d = g["CBC"] = ((e = l['extend']())["Encryptor"] = e['extend']({ 172 | "processBlock": function (e, t) { 173 | var s = this["$_BDHv"]; 174 | var n = s['blockSize']; 175 | (function r(e, t, s) { 176 | var n = this["$_BDIy"]; 177 | if (n) { 178 | var a = n; 179 | this['$_BDIy'] = undefined; 180 | } else var a = this["$_BDJH"]; 181 | 182 | for (var o = 0; o < s; o++) e[t + o] ^= a[o]; 183 | })['call'](this, e, t, n); 184 | s["encryptBlock"](e, t); 185 | this["$_BDJH"] = e["slice"](t, t + n); 186 | } 187 | }), e); 188 | var h = (t["pad"] = {})["Pkcs7"] = { 189 | "pad": function (e, t) { 190 | for (var s = 4 * t, n = s - e['sigBytes'] % s, a = n << 24 | n << 16 | n << 8 | n, o = [], r = 0; r < n; r += 4) o["push"](a); 191 | var i = u['create'](o, n); 192 | e["concat"](i); 193 | } 194 | }; 195 | var f = n["BlockCipher"] = c['extend']({ 196 | "cfg": c['cfg']['extend']({ 197 | "mode": d, 198 | "padding": h 199 | }), 200 | "reset": function () { 201 | c['reset']['call'](this); 202 | var e = this['cfg']; 203 | var t = e['iv']; 204 | var s = e["mode"]; 205 | if (this["$_BDBd"] == this['$_BDAS']) var n = s["createEncryptor"]; 206 | 207 | if (this['$_BEAZ'] && this['$_BEAZ']["$_BEB_"] == n) { 208 | this['$_BEAZ']['init'](this, t && t['words']); 209 | } else { 210 | this['$_BEAZ'] = n['call'](s, this, t && t['words']); 211 | this['$_BEAZ']["$_BEB_"] = n; 212 | } 213 | }, 214 | "$_BCJO": function (e, t) { 215 | this['$_BEAZ']["processBlock"](e, t); 216 | }, 217 | "$_BDEO": function () { 218 | var e = this['cfg']['padding']; 219 | 220 | if (this["$_BDBd"] == this["$_BDAS"]) { 221 | e["pad"](this['$_JAr'], this["blockSize"]); 222 | var t = this["$_BCHV"](!0); 223 | } 224 | 225 | return t; 226 | }, 227 | "blockSize": 4 228 | }); 229 | var m = n["CipherParams"] = a['extend']({ 230 | "init": function (e) { 231 | this["mixIn"](e); 232 | } 233 | }); 234 | var b = n["SerializableCipher"] = a['extend']({ 235 | "cfg": a['extend'](), 236 | "encrypt": function (e, t, s, n) { 237 | n = this["cfg"]['extend'](n); 238 | var a = e["createEncryptor"](s, n); 239 | var o = a["finalize"](t); 240 | var r = a['cfg']; 241 | return m["create"]({ 242 | "ciphertext": o, 243 | "key": s, 244 | "iv": r["iv"], 245 | "algorithm": e, 246 | "mode": r["mode"], 247 | "padding": r['padding'], 248 | "blockSize": e['blockSize'], 249 | "formatter": n['format'] 250 | }); 251 | } 252 | }); 253 | var v = []; 254 | var w = []; 255 | var x = []; 256 | var y = []; 257 | var k = []; 258 | var C = []; 259 | var E = []; 260 | var A = []; 261 | var z = []; 262 | var T = []; 263 | !function () { 264 | for (var e = [], t = 0; t < 256; t++) if (t < 128) { 265 | e[t] = t << 1; 266 | } else { 267 | e[t] = t << 1 ^ 283; 268 | } 269 | var s = 0; 270 | var n = 0; 271 | for (t = 0; t < 256; t++) { 272 | var a = n ^ n << 1 ^ n << 2 ^ n << 3 ^ n << 4; 273 | a = a >>> 8 ^ 255 & a ^ 99; 274 | v[s] = a; 275 | var o = e[w[a] = s]; 276 | var r = e[o]; 277 | var i = e[r]; 278 | var _ = 257 * e[a] ^ 16843008 * a; 279 | x[s] = _ << 24 | _ >>> 8; 280 | y[s] = _ << 16 | _ >>> 16; 281 | k[s] = _ << 8 | _ >>> 24; 282 | C[s] = _; 283 | _ = 16843009 * i ^ 65537 * r ^ 257 * o ^ 16843008 * s; 284 | E[a] = _ << 24 | _ >>> 8; 285 | A[a] = _ << 16 | _ >>> 16; 286 | z[a] = _ << 8 | _ >>> 24; 287 | T[a] = _; 288 | s ? (s = o ^ e[e[e[i ^ o]]], n ^= e[e[n]]) : s = n = 1; 289 | } 290 | }(); 291 | var B = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]; 292 | var D = _['AES'] = f['extend']({ 293 | "$_BDDg": function () { 294 | if (!this['$_BECV'] || this['$_BEDc'] !== this['$_BDCs']) { 295 | for (var e = this['$_BEDc'] = this['$_BDCs'], t = e['words'], s = e['sigBytes'] / 4, n = 4 * (1 + (this['$_BECV'] = 6 + s)), a = this['$_BEEZ'] = [], o = 0; o < n; o++) if (o < s) a[o] = t[o]; else { 296 | var r = a[o - 1]; 297 | o % s ? 6 < s && o % s == 4 && (r = v[r >>> 24] << 24 | v[r >>> 16 & 255] << 16 | v[r >>> 8 & 255] << 8 | v[255 & r]) : (r = v[(r = r << 8 | r >>> 24) >>> 24] << 24 | v[r >>> 16 & 255] << 16 | v[r >>> 8 & 255] << 8 | v[255 & r], r ^= B[o / s | 0] << 24); 298 | a[o] = a[o - s] ^ r; 299 | } 300 | 301 | for (var i = this['$_BEFH'] = [], _ = 0; _ < n; _++) { 302 | o = n - _; 303 | if (_ % 4) r = a[o]; else r = a[o - 4]; 304 | if (_ < 4 || o <= 4) { 305 | i[_] = r; 306 | } else { 307 | i[_] = E[v[r >>> 24]] ^ A[v[r >>> 16 & 255]] ^ z[v[r >>> 8 & 255]] ^ T[v[255 & r]]; 308 | } 309 | } 310 | } 311 | }, 312 | "encryptBlock": function (e, t) { 313 | this['$_BEGu'](e, t, this['$_BEEZ'], x, y, k, C, v); 314 | }, 315 | "$_BEGu": function (e, t, s, n, a, o, r, i) { 316 | for (var _ = this['$_BECV'], c = e[t] ^ s[0], u = e[t + 1] ^ s[1], p = e[t + 2] ^ s[2], g = e[t + 3] ^ s[3], l = 4, d = 1; d < _; d++) { 317 | var h = n[c >>> 24] ^ a[u >>> 16 & 255] ^ o[p >>> 8 & 255] ^ r[255 & g] ^ s[l++]; 318 | var f = n[u >>> 24] ^ a[p >>> 16 & 255] ^ o[g >>> 8 & 255] ^ r[255 & c] ^ s[l++]; 319 | var m = n[p >>> 24] ^ a[g >>> 16 & 255] ^ o[c >>> 8 & 255] ^ r[255 & u] ^ s[l++]; 320 | var b = n[g >>> 24] ^ a[c >>> 16 & 255] ^ o[u >>> 8 & 255] ^ r[255 & p] ^ s[l++]; 321 | c = h; 322 | u = f; 323 | p = m; 324 | g = b; 325 | } 326 | 327 | h = (i[c >>> 24] << 24 | i[u >>> 16 & 255] << 16 | i[p >>> 8 & 255] << 8 | i[255 & g]) ^ s[l++]; 328 | f = (i[u >>> 24] << 24 | i[p >>> 16 & 255] << 16 | i[g >>> 8 & 255] << 8 | i[255 & c]) ^ s[l++]; 329 | m = (i[p >>> 24] << 24 | i[g >>> 16 & 255] << 16 | i[c >>> 8 & 255] << 8 | i[255 & u]) ^ s[l++]; 330 | b = (i[g >>> 24] << 24 | i[c >>> 16 & 255] << 16 | i[u >>> 8 & 255] << 8 | i[255 & p]) ^ s[l++]; 331 | e[t] = h; 332 | e[t + 1] = f; 333 | e[t + 2] = m; 334 | e[t + 3] = b; 335 | }, 336 | "keySize": 8 337 | }); 338 | return t['AES'] = f['$_BDGs'](D), t['AES']; 339 | }(); 340 | return n; 341 | } 342 | 343 | function _() { 344 | 345 | var a = function () { 346 | function s() { 347 | this['i'] = 0; 348 | this['j'] = 0; 349 | this['S'] = []; 350 | } 351 | 352 | s['prototype']['init'] = function E(e) { 353 | var t; 354 | var s; 355 | var n; 356 | for (t = 0; t < 256; ++t) this['S'][t] = t; 357 | for (t = s = 0; t < 256; ++t) { 358 | s = s + this['S'][t] + e[t % e['length']] & 255; 359 | n = this['S'][t]; 360 | this['S'][t] = this['S'][s]; 361 | this['S'][s] = n; 362 | } 363 | this["i"] = 0; 364 | this["j"] = 0; 365 | }; 366 | 367 | s['prototype']['next'] = function A() { 368 | var e; 369 | return this['i'] = this['i'] + 1 & 255, this['j'] = this['j'] + this['S'][this['i']] & 255, e = this['S'][this['i']], this['S'][this['i']] = this['S'][this['j']], this['S'][this['j']] = e, this['S'][e + this['S'][this['i']] & 255]; 370 | }; 371 | 372 | var n; 373 | var a; 374 | var o; 375 | var t; 376 | var r = 256; 377 | 378 | if (null == a) { 379 | var i; 380 | if (a = [], o = 0, window['crypto'] && window['crypto']['getRandomValues']) { 381 | var _ = new Uint32Array(256); 382 | for (window['crypto']['getRandomValues'](_), i = 0; i < _['length']; ++i) a[o++] = 255 & _[i]; 383 | } 384 | var c = 0; 385 | var u = function u(t) { 386 | if (256 <= (c = c || 0) || r <= o) { 387 | 388 | } else try { 389 | var s = t["x"] + t["y"]; 390 | a[o++] = 255 & s; 391 | c += 1; 392 | } catch (e) { 393 | console.log(e); 394 | } 395 | }; 396 | 397 | } 398 | 399 | function p() { 400 | n = new s(); 401 | while (o < r) { 402 | var e = Math['floor'](65536 * Math['random']()); 403 | a[o++] = 255 & e; 404 | } 405 | for (n['init'](a), o = 0; o < a['length']; ++o) a[o] = 0; 406 | o = 0; 407 | return n['next'](); 408 | } 409 | 410 | function g() { 411 | } 412 | 413 | g['prototype']['nextBytes'] = function z(e) { 414 | var t; 415 | for (t = 0; t < e['length']; ++t) e[t] = p(); 416 | }; 417 | 418 | function v(e, t, s) { 419 | null != e && ('number' == typeof e ? this['fromNumber'](e, t, s) : null == t && 'string' != typeof e ? this['fromString'](e, 256) : this['fromString'](e, t)) 420 | } 421 | 422 | function w() { 423 | return new v(null); 424 | } 425 | 426 | "Microsoft Internet Explorer" == navigator["appName"] ? t = (v['prototype']['am'] = function T(e, t, s, n, a, o) { 427 | var r = 32767 & t; 428 | var i = t >> 15; 429 | while (0 <= --o) { 430 | var _ = 32767 & this[e]; 431 | var c = this[e++] >> 15; 432 | var u = i * _ + c * r; 433 | a = ((_ = r * _ + ((32767 & u) << 15) + s[n] + (1073741823 & a)) >>> 30) + (u >>> 15) + i * c + (a >>> 30); 434 | s[n++] = 1073741823 & _; 435 | } 436 | return a; 437 | }, 30) : 'Netscape' != navigator['appName'] ? t = (v['prototype']['am'] = function B(e, t, s, n, a, o) { 438 | while (0 <= --o) { 439 | var r = t * this[e++] + s[n] + a; 440 | a = Math["floor"](r / 67108864); 441 | s[n++] = 67108863 & r; 442 | } 443 | return a; 444 | }, 26) : t = (v['prototype']['am'] = function D(e, t, s, n, a, o) { 445 | var r = 16383 & t; 446 | var i = t >> 14; 447 | while (0 <= --o) { 448 | var _ = 16383 & this[e]; 449 | var c = this[e++] >> 14; 450 | var u = i * _ + c * r; 451 | a = ((_ = r * _ + ((16383 & u) << 14) + s[n] + a) >> 28) + (u >> 14) + i * c; 452 | s[n++] = 268435455 & _; 453 | } 454 | return a; 455 | }, 28); 456 | 457 | v['prototype']['DB'] = t; 458 | v['prototype']['DM'] = (1 << t) - 1; 459 | v['prototype']['DV'] = 1 << t; 460 | v['prototype']["FV"] = Math['pow'](2, 52); 461 | v['prototype']['F1'] = 52 - t; 462 | v['prototype']['F2'] = 2 * t - 52; 463 | var l; 464 | var d; 465 | var h = '0123456789abcdefghijklmnopqrstuvwxyz'; 466 | var f = []; 467 | 468 | for (l = '0'['charCodeAt'](0), d = 0; d <= 9; ++d) f[l++] = d; 469 | 470 | for (l = 'a'['charCodeAt'](0), d = 10; d < 36; ++d) f[l++] = d; 471 | 472 | for (l = 'A'['charCodeAt'](0), d = 10; d < 36; ++d) f[l++] = d; 473 | 474 | function m(e) { 475 | return h["charAt"](e); 476 | } 477 | 478 | function b(e) { 479 | var t = w(); 480 | return t["fromInt"](e), t; 481 | } 482 | 483 | function x(e) { 484 | var t; 485 | var s = 1; 486 | return 0 != (t = e >>> 16) && (e = t, s += 16), 0 != (t = e >> 8) && (e = t, s += 8), 0 != (t = e >> 4) && (e = t, s += 4), 0 != (t = e >> 2) && (e = t, s += 2), 0 != (t = e >> 1) && (e = t, s += 1), s; 487 | } 488 | 489 | function y(e) { 490 | this['m'] = e; 491 | } 492 | 493 | function k(e) { 494 | this['m'] = e; 495 | this["mp"] = e["invDigit"](); 496 | this["mpl"] = 32767 & this["mp"]; 497 | this["mph"] = this['mp'] >> 15; 498 | this["um"] = (1 << e['DB'] - 15) - 1; 499 | this["mt2"] = 2 * e["t"]; 500 | 501 | } 502 | 503 | function C() { 504 | this["setPublic"]("00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81", "10001"); 505 | 506 | } 507 | 508 | return y['prototype']["convert"] = function S(e) { 509 | return e["s"] < 0 || 0 <= e["compareTo"](this['m']) ? e["mod"](this['m']) : e; 510 | }, y['prototype']["revert"] = function M(e) { 511 | return e; 512 | }, y['prototype']["reduce"] = function R(e) { 513 | e["divRemTo"](this['m'], null, e); 514 | }, y['prototype']["mulTo"] = function F(e, t, s) { 515 | e["multiplyTo"](t, s); 516 | this["reduce"](s); 517 | }, y['prototype']["sqrTo"] = function O(e, t) { 518 | 519 | e["squareTo"](t); 520 | this['reduce'](t); 521 | }, k['prototype']["convert"] = function j(e) { 522 | var t = w(); 523 | return e["abs"]()["dlShiftTo"](this['m']['t'], t), t["divRemTo"](this['m'], null, t), e['s'] < 0 && 0 < t["compareTo"](v["ZERO"]) && this['m']["subTo"](t, t), t; 524 | }, k['prototype']["revert"] = function P(e) { 525 | var t = w(); 526 | return e["copyTo"](t), this['reduce'](t), t; 527 | }, k['prototype']['reduce'] = function I(e) { 528 | 529 | while (e['t'] <= this["mt2"]) e[e['t']++] = 0; 530 | 531 | for (var t = 0; t < this['m']['t']; ++t) { 532 | var s = 32767 & e[t]; 533 | var n = s * this["mpl"] + ((s * this["mph"] + (e[t] >> 15) * this['mpl'] & this["um"]) << 15) & e["DM"]; 534 | e[s = t + this['m']['t']] += this['m']["am"](0, n, e, t, 0, this['m']['t']); 535 | 536 | while (e[s] >= e["DV"]) { 537 | e[s] -= e["DV"]; 538 | e[++s]++; 539 | } 540 | } 541 | 542 | e["clamp"](); 543 | e["drShiftTo"](this['m']['t'], e); 544 | 0 <= e['compareTo'](this['m']) && e["subTo"](this['m'], e); 545 | }, k['prototype']["mulTo"] = function N(e, t, s) { 546 | 547 | e["multiplyTo"](t, s); 548 | this['reduce'](s); 549 | }, k['prototype']["sqrTo"] = function q(e, t) { 550 | 551 | e["squareTo"](t); 552 | this['reduce'](t); 553 | }, v['prototype']["copyTo"] = function L(e) { 554 | for (var t = this['t'] - 1; 0 <= t; --t) e[t] = this[t]; 555 | e['t'] = this['t']; 556 | e['s'] = this['s']; 557 | }, v['prototype']["fromInt"] = function H(e) { 558 | this['t'] = 1; 559 | e < 0 ? this['s'] = -1 : this['s'] = 0; 560 | 0 < e ? this[0] = e : e < -1 ? this[0] = e + this['DV'] : this['t'] = 0; 561 | }, v['prototype']["fromString"] = function $(e, t) { 562 | var s; 563 | if (16 == t) s = 4; else if (8 == t) s = 3; else if (256 == t) s = 8; else if (2 == t) s = 1; else if (32 == t) s = 5; else { 564 | if (4 != t) return void this["fromRadix"](e, t); 565 | s = 2; 566 | } 567 | this['t'] = 0; 568 | this['s'] = 0; 569 | var n; 570 | var a; 571 | var o = e['length']; 572 | var r = !1; 573 | var i = 0; 574 | while (0 <= --o) { 575 | if (8 == s) { 576 | var _ = 255 & e[o]; 577 | } else { 578 | var _ = (n = o, null == (a = f[e["charCodeAt"](n)]) ? -1 : a); 579 | } 580 | if (_ < 0) { 581 | "-" == e["charAt"](o) && (r = !0); 582 | } else { 583 | r = !1; 584 | 0 == i ? this[this['t']++] = _ : i + s > this["DB"] ? (this[this['t'] - 1] |= (_ & (1 << this["DB"] - i) - 1) << i, this[this['t']++] = _ >> this['DB'] - i) : this[this['t'] - 1] |= _ << i; 585 | (i += s) >= this['DB'] && (i -= this['DB']); 586 | } 587 | } 588 | 8 == s && 0 != (128 & e[0]) && (this['s'] = -1, 0 < i && (this[this['t'] - 1] |= (1 << this['DB'] - i) - 1 << i)); 589 | this['clamp'](); 590 | r && v["ZERO"]['subTo'](this, this); 591 | }, v['prototype']['clamp'] = function X() { 592 | var e = this['s'] & this["DM"]; 593 | while (0 < this['t'] && this[this['t'] - 1] == e) --this['t']; 594 | }, v['prototype']["dlShiftTo"] = function U(e, t) { 595 | var s; 596 | for (s = this['t'] - 1; 0 <= s; --s) t[s + e] = this[s]; 597 | for (s = e - 1; 0 <= s; --s) t[s] = 0; 598 | t['t'] = this['t'] + e; 599 | t['s'] = this['s']; 600 | }, v['prototype']["drShiftTo"] = function V(e, t) { 601 | for (var s = e; s < this['t']; ++s) t[s - e] = this[s]; 602 | t['t'] = Math["max"](this['t'] - e, 0); 603 | t['s'] = this['s']; 604 | }, v['prototype']["lShiftTo"] = function W(e, t) { 605 | var s; 606 | var n = e % this['DB']; 607 | var a = this['DB'] - n; 608 | var o = (1 << a) - 1; 609 | var r = Math["floor"](e / this['DB']); 610 | var i = this['s'] << n & this['DM']; 611 | for (s = this['t'] - 1; 0 <= s; --s) { 612 | t[s + r + 1] = this[s] >> a | i; 613 | i = (this[s] & o) << n; 614 | } 615 | for (s = r - 1; 0 <= s; --s) t[s] = 0; 616 | t[r] = i; 617 | t['t'] = this['t'] + r + 1; 618 | t['s'] = this['s']; 619 | t['clamp'](); 620 | }, v['prototype']["rShiftTo"] = function G(e, t) { 621 | t['s'] = this['s']; 622 | var s = Math["floor"](e / this["DB"]); 623 | if (s >= this['t']) t['t'] = 0; else { 624 | var n = e % this['DB']; 625 | var a = this['DB'] - n; 626 | var o = (1 << n) - 1; 627 | t[0] = this[s] >> n; 628 | for (var r = s + 1; r < this['t']; ++r) { 629 | t[r - s - 1] |= (this[r] & o) << a; 630 | t[r - s] = this[r] >> n; 631 | } 632 | 0 < n && (t[this['t'] - s - 1] |= (this['s'] & o) << a); 633 | t['t'] = this['t'] - s; 634 | t["clamp"](); 635 | } 636 | }, v['prototype']['subTo'] = function Y(e, t) { 637 | 638 | var s = 0; 639 | var n = 0; 640 | var a = Math["min"](e['t'], this['t']); 641 | 642 | while (s < a) { 643 | n += this[s] - e[s]; 644 | t[s++] = n & this['DM']; 645 | n >>= this['DB']; 646 | } 647 | 648 | if (e['t'] < this['t']) { 649 | n -= e['s']; 650 | 651 | while (s < this['t']) { 652 | n += this[s]; 653 | t[s++] = n & this['DM']; 654 | n >>= this['DB']; 655 | } 656 | n += this['s']; 657 | } else { 658 | n += this['s']; 659 | 660 | while (s < e['t']) { 661 | n -= e[s]; 662 | t[s++] = n & this['DM']; 663 | n >>= this['DB']; 664 | } 665 | 666 | n -= e['s']; 667 | } 668 | 669 | n < 0 ? t['s'] = -1 : t['s'] = 0; 670 | n < -1 ? t[s++] = this['DV'] + n : 0 < n && (t[s++] = n); 671 | t['t'] = s; 672 | t['clamp'](); 673 | }, v['prototype']["multiplyTo"] = function Z(e, t) { 674 | var s = this["abs"](); 675 | var n = e["abs"](); 676 | var a = s["t"]; 677 | t['t'] = a + n['t']; 678 | while (0 <= --a) t[a] = 0; 679 | for (a = 0; a < n['t']; ++a) t[a + s['t']] = s["am"](0, n[a], t, a, 0, s['t']); 680 | 681 | t["s"] = 0; 682 | t["clamp"](); 683 | this['s'] != e['s'] && v["ZERO"]["subTo"](t, t); 684 | }, v['prototype']["squareTo"] = function Q(e) { 685 | var t = this["abs"](); 686 | var s = e["t"] = 2 * t['t']; 687 | 688 | while (0 <= --s) e[s] = 0; 689 | 690 | for (s = 0; s < t['t'] - 1; ++s) { 691 | var n = t["am"](s, t[s], e, 2 * s, 0, 1); 692 | (e[s + t['t']] += t["am"](s + 1, 2 * t[s], e, 2 * s + 1, n, t['t'] - s - 1)) >= t["DV"] && (e[s + t['t']] -= t["DV"], e[s + t['t'] + 1] = 1); 693 | } 694 | 695 | 0 < e['t'] && (e[e['t'] - 1] += t['am'](s, t[s], e, 2 * s, 0, 1)); 696 | e["s"] = 0; 697 | e["clamp"](); 698 | }, v['prototype']["divRemTo"] = function J(e, t, s) { 699 | var n = e["abs"](); 700 | if (!(n["t"] <= 0)) { 701 | var a = this['abs'](); 702 | if (a['t'] < n['t']) return null != t && t["fromInt"](0), void (null != s && this["copyTo"](s)); 703 | null == s && (s = w()); 704 | var o = w(); 705 | var r = this["s"]; 706 | var i = e['s']; 707 | 708 | var _ = this["DB"] - x(n[n['t'] - 1]); 709 | 710 | if (0 < _) { 711 | n["lShiftTo"](_, o); 712 | a["lShiftTo"](_, s); 713 | } else { 714 | n["copyTo"](o); 715 | a['copyTo'](s); 716 | } 717 | 718 | var c = o['t']; 719 | var u = o[c - 1]; 720 | 721 | if (0 != u) { 722 | var p = u * (1 << this["F1"]) + (1 < c ? o[c - 2] >> this["F2"] : 0); 723 | var g = this["FV"] / p; 724 | var l = (1 << this["F1"]) / p; 725 | var d = 1 << this["F2"]; 726 | var h = s['t']; 727 | var f = h - c; 728 | 729 | if (null == t) { 730 | var m = w(); 731 | } else { 732 | var m = t; 733 | } 734 | 735 | o["dlShiftTo"](f, m); 736 | 0 <= s["compareTo"](m) && (s[s['t']++] = 1, s["subTo"](m, s)); 737 | v["ONE"]["dlShiftTo"](c, m); 738 | m["subTo"](o, o); 739 | 740 | while (o["t"] < c) o[o['t']++] = 0; 741 | 742 | while (0 <= --f) { 743 | var b = s[--h] == u ? this["DM"] : Math["floor"](s[h] * g + (s[h - 1] + d) * l); 744 | 745 | if ((s[h] += o["am"](0, b, s, f, 0, c)) < b) { 746 | o["dlShiftTo"](f, m); 747 | s['subTo'](m, s); 748 | 749 | while (s[h] < --b) s['subTo'](m, s); 750 | } 751 | } 752 | 753 | null != t && (s["drShiftTo"](c, t), r != i && v["ZERO"]['subTo'](t, t)); 754 | s['t'] = c; 755 | s["clamp"](); 756 | 0 < _ && s["rShiftTo"](_, s); 757 | r < 0 && v["ZERO"]['subTo'](s, s); 758 | } 759 | } 760 | }, v['prototype']["invDigit"] = function K() { 761 | 762 | if (this["t"] < 1) return 0; 763 | var e = this[0]; 764 | if (0 == (1 & e)) return 0; 765 | var t = 3 & e; 766 | return 0 < (t = (t = (t = (t = t * (2 - (15 & e) * t) & 15) * (2 - (255 & e) * t) & 255) * (2 - ((65535 & e) * t & 65535)) & 65535) * (2 - e * t % this["DV"]) % this["DV"]) ? this['DV'] - t : -t; 767 | }, v['prototype']["isEven"] = function ee() { 768 | return 0 == (0 < this['t'] ? 1 & this[0] : this["s"]); 769 | }, v['prototype']["exp"] = function te(e, t) { 770 | if (4294967295 < e || e < 1) return v["ONE"]; 771 | var s = w(); 772 | var n = w(); 773 | var a = t["convert"](this); 774 | var o = x(e) - 1; 775 | a["copyTo"](s); 776 | while (0 <= --o) if (t["sqrTo"](s, n), 0 < (e & 1 << o)) t["mulTo"](n, a, s); else { 777 | var r = s; 778 | s = n; 779 | n = r; 780 | } 781 | return t["revert"](s); 782 | }, v['prototype']["toString"] = function se(e) { 783 | if (this["s"] < 0) return "-" + this["negate"]()["toString"](e); 784 | var t; 785 | if (16 == e) t = 4; else if (8 == e) t = 3; else if (2 == e) t = 1; else if (32 == e) t = 5; else { 786 | if (4 != e) return this["toRadix"](e); 787 | t = 2; 788 | } 789 | var s; 790 | var n = (1 << t) - 1; 791 | var a = !1; 792 | var o = ""; 793 | var r = this["t"]; 794 | var i = this["DB"] - r * this['DB'] % t; 795 | if (0 < r--) { 796 | i < this['DB'] && 0 < (s = this[r] >> i) && (a = !0, o = m(s)); 797 | while (0 <= r) { 798 | i < t ? (s = (this[r] & (1 << i) - 1) << t - i, s |= this[--r] >> (i += this['DB'] - t)) : (s = this[r] >> (i -= t) & n, i <= 0 && (i += this['DB'], --r)); 799 | 0 < s && (a = !0); 800 | a && (o += m(s)); 801 | } 802 | } 803 | 804 | return a ? o : "0"; 805 | }, v['prototype']["negate"] = function ne() { 806 | var e = w(); 807 | return v["ZERO"]["subTo"](this, e), e; 808 | }, v['prototype']["abs"] = function ae() { 809 | 810 | return this['s'] < 0 ? this['negate']() : this; 811 | }, v['prototype']['compareTo'] = function oe(e) { 812 | 813 | var t = this['s'] - e['s']; 814 | if (0 != t) return t; 815 | var s = this['t']; 816 | if (0 != (t = s - e['t'])) return this['s'] < 0 ? -t : t; 817 | 818 | while (0 <= --s) if (0 != (t = this[s] - e[s])) return t; 819 | 820 | return 0; 821 | }, v['prototype']["bitLength"] = function re() { 822 | return this["t"] <= 0 ? 0 : this["DB"] * (this['t'] - 1) + x(this[this['t'] - 1] ^ this["s"] & this["DM"]); 823 | }, v['prototype']["mod"] = function ie(e) { 824 | var t = w(); 825 | return this["abs"]()["divRemTo"](e, null, t), this['s'] < 0 && 0 < t["compareTo"](v["ZERO"]) && e["subTo"](t, t), t; 826 | }, v['prototype']["modPowInt"] = function $_CEW(e, t) { 827 | var s; 828 | return e < 256 || t["isEven"]() ? s = new y(t) : s = new k(t), this["exp"](e, s); 829 | }, v["ZERO"] = b(0), v["ONE"] = b(1), C['prototype']["doPublic"] = function ce(e) { 830 | return e["modPowInt"](this["e"], this['n']); 831 | }, C['prototype']["setPublic"] = function ue(e, t) { 832 | if (null != e && null != t && 0 < e['length'] && 0 < t['length']) { 833 | this['n'] = function s(e, t) { 834 | 835 | return new v(e, t); 836 | }(e, 16); 837 | 838 | this['e'] = parseInt(t, 16); 839 | } else { 840 | console && console["error"] && console['error']("Invalid RSA public key"); 841 | } 842 | }, C['prototype']['encrypt'] = function pe(e) { 843 | var t = function i(e, t) { 844 | if (t < e["length"] + 11) return console && console["error"] && console['error']("Message too long for RSA"), null; 845 | var s = []; 846 | var n = e['length'] - 1; 847 | while (0 <= n && 0 < t) { 848 | var a = e["charCodeAt"](n--); 849 | if (a < 128) { 850 | s[--t] = a; 851 | } else { 852 | if (127 < a && a < 2048) { 853 | s[--t] = 63 & a | 128; 854 | s[--t] = a >> 6 | 192; 855 | } else { 856 | s[--t] = 63 & a | 128; 857 | s[--t] = a >> 6 & 63 | 128; 858 | s[--t] = a >> 12 | 224; 859 | } 860 | } 861 | } 862 | s[--t] = 0; 863 | var o = new g(); 864 | var r = []; 865 | while (2 < t) { 866 | r[0] = 0; 867 | while (0 == r[0]) o["nextBytes"](r); 868 | s[--t] = r[0]; 869 | } 870 | return s[--t] = 2, s[--t] = 0, new v(s); 871 | }(e, this['n']['bitLength']() + 7 >> 3); 872 | 873 | if (null == t) return null; 874 | var s = this['doPublic'](t); 875 | if (null == s) return null; 876 | var n = s['toString'](16); 877 | return 0 == (1 & n['length']) ? n : '0' + n; 878 | }, C; 879 | }(); 880 | 881 | return a; 882 | } 883 | function w(e) { 884 | for (var t = [], s = 0, n = 0; n < 2 * e.length; n += 2) { 885 | t[n >>> 3] |= parseInt(e[s], 10) << 24 - n % 8 * 4; 886 | s++; 887 | } 888 | 889 | for (var a = [], o = 0; o < e.length; o++) { 890 | var r = t[o >>> 2] >>> 24 - o % 4 * 8 & 255; 891 | a.push((r >>> 4).toString(16)); 892 | a.push((15 & r).toString(16)); 893 | } 894 | 895 | return a.join(""); 896 | } 897 | 898 | function get_w(e, track) { 899 | var eee = e; // var n = c.guid() 900 | 901 | var n = "c2fa6d0dde9fd7da"; 902 | eee.track = get_track(track); 903 | var a = new (_())().encrypt(n); 904 | var o = n_encrypt().encrypt(JSON.stringify(eee), n); 905 | return w(o) + a; 906 | } 907 | --------------------------------------------------------------------------------