├── 00 ├── main.js └── js_render.js ├── obfuscator └── README.md ├── 01 ├── README.md ├── hunxiao.js └── testv5.js ├── tools ├── utils.js ├── utils_object_func_to_str.js └── utils_object_member.js ├── sojson ├── example │ ├── decrypt1.js │ ├── source.js │ ├── module.js │ └── decrypt2.js └── just_do_IT │ ├── test.js │ ├── ast_v5_decrypt1.js │ ├── source_part_one.js │ ├── source_part_two.js │ └── temp.js ├── .gitignore ├── README.md └── dingxiang ├── ast.js └── greenseer.js /00/main.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /obfuscator/README.md: -------------------------------------------------------------------------------- 1 | 2 | 更多反混淆蜜汁操作请看蔡老板知识星球 3 | 4 | 搜索星球:AST入门与实战 -------------------------------------------------------------------------------- /01/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | sojson V5 混淆相关练习 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tools/utils.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | /******************************************************************************************************************** 5 | 十六进制解码,之所以会以十六进制显示,完全是 raw 这个节点造成的,那就删除 6 | *******************************************************************************************************************/ 7 | const visitor_hex_decode = { 8 | 'StringLiteral|NumericLiteral'(path) { 9 | delete path.node.extra; 10 | } 11 | } 12 | 13 | 14 | /******************************************************************************************************************** 15 | Unicode解码,还原Unicode字符串 16 | 17 | ps: 发现英文的Unicode形式被还原了,但是中文的没有被还原 18 | 需要给generator(ast,)添加参数{jsescOption:{"minimal":true}} 19 | *******************************************************************************************************************/ 20 | const visitor_unicode_decode = { 21 | StringLiteral(path) { 22 | delete path.node.extra; 23 | } 24 | } 25 | 26 | 27 | module.exports = { 28 | "visitor_hex_decode": visitor_hex_decode, 29 | "visitor_unicode_decode": visitor_unicode_decode, 30 | } 31 | 32 | -------------------------------------------------------------------------------- /sojson/example/decrypt1.js: -------------------------------------------------------------------------------- 1 | const parser = require("@babel/parser"); 2 | const template = require("@babel/template").default; 3 | const traverse = require("@babel/traverse").default; 4 | const t = require("@babel/types"); 5 | const generator = require("@babel/generator").default; 6 | const path = require('path'); 7 | const fs = require('fs'); 8 | 9 | const { decryptStr, decryptStrFnName } = require('./module'); 10 | 11 | fs.readFile(path.resolve(__dirname, './source.js'), { "encoding": 'utf-8' }, function (err, data) { 12 | const ast = parser.parse(data); 13 | step1(ast); 14 | 15 | // 将ast 转为 js 16 | let { code } = generator(ast); 17 | // code = code.replace(/!!\[\]/g, 'true').replace(/!\[\]/g, 'false'); 18 | console.log(code); 19 | }); 20 | 21 | function step1(ast) { 22 | traverse(ast,{ 23 | CallExpression:funToStr 24 | }) 25 | } 26 | 27 | function funToStr(path) { 28 | var curNode = path.node; 29 | 30 | if(curNode.callee.name === decryptStrFnName && curNode.arguments.length === 2) 31 | { 32 | var strC = decryptStr(curNode.arguments[0].value, curNode.arguments[1].value); 33 | 34 | console.log(t.stringLiteral(strC)) 35 | path.replaceWith(t.stringLiteral(strC)) 36 | 37 | } 38 | } -------------------------------------------------------------------------------- /sojson/example/source.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 加密工具已经升级了一个版本,目前为 sojson.v5 ,主要加强了算法,以及防破解【绝对不可逆】配置,耶稣也无法100%还原,我说的。; 3 | * 已经打算把这个工具基础功能一直免费下去。还希望支持我。 4 | * 另外 sojson.v5 已经强制加入校验,注释可以去掉,但是 sojson.v5 不能去掉(如果你开通了VIP,可以手动去掉),其他都没有任何绑定。 5 | * 誓死不会加入任何后门,sojson JS 加密的使命就是为了保护你们的Javascript 。 6 | * 警告:如果您恶意去掉 sojson.v5 那么我们将不会保护您的JavaScript代码。请遵守规则 7 | * 新版本: https://www.jsjiami.com/ 支持批量加密,支持大文件加密,拥有更多加密。 */ 8 | 9 | // 第一部分已经移到module文件中去了 10 | 11 | //这是第二部分 12 | var a = {} 13 | , b = {}; 14 | (function(_0x117d09, _0x110647) { 15 | var _0x4845bf = { 16 | 'XhuzS': _0x4d94('0x0', 'W7bQ'), 17 | 'iUTPo': _0x4d94('0x1', ']2T3') 18 | }; 19 | _0x117d09[_0x4d94('0x2', 'WIC5')] = _0x4845bf['XhuzS']; 20 | _0x110647['adinfo'] = _0x4845bf[_0x4d94('0x3', 'Wka7')]; 21 | _0x110647[_0x4d94('0x4', 'D8d!')] = '如果您的JS里嵌套了PHP,JSP标签,等等其他非JavaScript的代码,请提取出来再加密。这个工具不能加密php、jsp等模版内容'; 22 | }(a, b)); 23 | ;(function(_0x182aaa, _0x4c3590, _0x55392e) { 24 | var _0x4b40d0 = { 25 | 'gTfic': _0x4d94('0x5', 'oqkX'), 26 | 'GXIQH': function _0x38020c(_0x65ebe0, _0x2dc82b) { 27 | return _0x65ebe0 === _0x2dc82b; 28 | }, 29 | 'xyVxG': _0x4d94('0x6', 'JsgM'), 30 | 'qeHKL': function _0x3e069c(_0x501f24, _0x41e6d1) { 31 | return _0x501f24 + _0x41e6d1; 32 | }, 33 | 'EkYag': _0x4d94('0x7', '^7hL'), 34 | 'YZgLH': _0x4d94('0x8', 'g@wB') 35 | }; 36 | _0x55392e = 'al'; 37 | try { 38 | _0x55392e += _0x4b40d0['gTfic']; 39 | _0x4c3590 = encode_version; 40 | if (!(typeof _0x4c3590 !== _0x4d94('0x9', 'oqkX') && _0x4b40d0[_0x4d94('0xa', 'M*Wm')](_0x4c3590, _0x4b40d0['xyVxG']))) { 41 | _0x182aaa[_0x55392e](_0x4b40d0[_0x4d94('0xb', '7glO')]('删除', _0x4b40d0['EkYag'])); 42 | } 43 | } catch (_0x781e53) { 44 | if ('aYN' === _0x4d94('0xc', '^7hL')) { 45 | _0x182aaa[_0x55392e](_0x4d94('0xd', '9z79')); 46 | } else { 47 | _0x182aaa[_0x55392e](_0x4b40d0[_0x4d94('0xe', 'oqkX')]); 48 | } 49 | } 50 | }(window)); 51 | ;encode_version = 'sojson.v5'; -------------------------------------------------------------------------------- /sojson/just_do_IT/test.js: -------------------------------------------------------------------------------- 1 | const parser = require("@babel/parser") 2 | const traverse = require("@babel/traverse").default 3 | const generator = require("@babel/generator").default 4 | const types = require("@babel/types") 5 | 6 | 7 | /******************************************************************** 8 | 处理FunctionDeclaration 9 | 思路:对于实参全部是字面量的函数调用,且运行结果唯一时,可以进行替换 10 | before: 11 | function add(a,b) 12 | { 13 | return a+b; 14 | } 15 | 16 | s = add(1,2) + add(111,222); 17 | 18 | after: 19 | 20 | function add(a, b) { 21 | return a + b; 22 | } 23 | 24 | s = 3 + 333; 25 | ********************************************************************/ 26 | 27 | const visitor = { 28 | FunctionDeclaration(path) { 29 | let { 30 | id 31 | } = path.node; 32 | const binding = path.scope.parent.getBinding(id.name); 33 | if (!binding || binding.constantViolations.length > 0) { 34 | return; 35 | } 36 | let refer_paths = binding.referencePaths; 37 | if (refer_paths == 0) { 38 | path.remove(); 39 | return; 40 | } 41 | 42 | let params = path.get('params').toString(); 43 | let code = path.get('body').toString(); 44 | if (code.indexOf("try") != -1 || code.indexOf('random') != -1 || code.indexOf('Date') != -1) { //返回值不唯一不做处理 45 | return; 46 | } 47 | var call_fun = new Function(params, code); 48 | for (const refer_path of binding.referencePaths) { 49 | let call_express = refer_path.findParent(p => p.isCallExpression()); 50 | if (!call_express) continue; 51 | let args = call_express.get('arguments'); 52 | if (args.length == 0 || !args.every(el => el.isLiteral())) return; 53 | 54 | for (let i in args) { 55 | args[i] = args[i].node.value; 56 | } 57 | 58 | try { 59 | let value = call_fun.apply(null, args); 60 | value != undefined && call_express.replaceWith(types.valueToNode(value)); 61 | } catch (e) {}; 62 | } 63 | }, 64 | } 65 | 66 | let code = " function add(a,b)\n" + 67 | " {\n" + 68 | " return a+b;\n" + 69 | "}\n" + 70 | "\n" + 71 | " s = add(1,2) + add(111,222);" 72 | 73 | let ast = parser.parse(code) 74 | 75 | traverse(ast, visitor) 76 | 77 | console.log(generator(ast).code) 78 | 79 | -------------------------------------------------------------------------------- /tools/utils_object_func_to_str.js: -------------------------------------------------------------------------------- 1 | const parser = require("@babel/parser") 2 | const traverse = require("@babel/traverse").default 3 | const generator = require("@babel/generator").default 4 | const types = require("@babel/types") 5 | 6 | 7 | 8 | /******************************************************************** 9 | 本案例来源蔡老板,相关问题如:https://bbs.nightteam.cn/thread-693.htm 10 | 11 | 处理FunctionDeclaration 12 | 思路:对于实参全部是字面量的函数调用,且运行结果唯一时,可以进行替换 13 | before: 14 | function add(a,b) 15 | { 16 | return a+b; 17 | } 18 | 19 | s = add(1,2) + add(111,222); 20 | 21 | after: 22 | 23 | function add(a, b) { 24 | return a + b; 25 | } 26 | 27 | s = 3 + 333; 28 | ********************************************************************/ 29 | 30 | const visitor = { 31 | FunctionDeclaration(path) { 32 | let { 33 | id 34 | } = path.node; 35 | const binding = path.scope.parent.getBinding(id.name); 36 | if (!binding || binding.constantViolations.length > 0) { 37 | return; 38 | } 39 | let refer_paths = binding.referencePaths; 40 | if (refer_paths == 0) { 41 | path.remove(); 42 | return; 43 | } 44 | 45 | let params = path.get('params').toString(); 46 | let code = path.get('body').toString(); 47 | if (code.indexOf("try") != -1 || code.indexOf('random') != -1 || code.indexOf('Date') != -1) { //返回值不唯一不做处理 48 | return; 49 | } 50 | var call_fun = new Function(params, code); 51 | for (const refer_path of binding.referencePaths) { 52 | let call_express = refer_path.findParent(p => p.isCallExpression()); 53 | if (!call_express) continue; 54 | let args = call_express.get('arguments'); 55 | if (args.length == 0 || !args.every(el => el.isLiteral())) return; 56 | 57 | for (let i in args) { 58 | args[i] = args[i].node.value; 59 | } 60 | 61 | try { 62 | let value = call_fun.apply(null, args); 63 | value != undefined && call_express.replaceWith(types.valueToNode(value)); 64 | } catch (e) {}; 65 | } 66 | }, 67 | } 68 | 69 | let code = " function add(a,b)\n" + 70 | " {\n" + 71 | " return a+b;\n" + 72 | "}\n" + 73 | "\n" + 74 | " s = add(1,2) + add(111,222);" 75 | 76 | let ast = parser.parse(code) 77 | 78 | traverse(ast, visitor) 79 | 80 | console.log(generator(ast).code) 81 | 82 | -------------------------------------------------------------------------------- /sojson/just_do_IT/ast_v5_decrypt1.js: -------------------------------------------------------------------------------- 1 | const parser = require("@babel/parser") 2 | const traverse = require("@babel/traverse").default 3 | const generator = require("@babel/generator").default 4 | const types = require("@babel/types") 5 | const fs = require("fs") 6 | const path = require('path') 7 | 8 | const sdk = require("./source_part_one") 9 | const handle_obj_member_value = require("../../tools/utils_object_member") 10 | const utils = require("../../tools/utils") 11 | 12 | 13 | /** 14 | * 1、加载js混淆代码 15 | * **/ 16 | const read_file_options = { 17 | encoding: "utf-8" 18 | } 19 | const source_code = fs.readFileSync(path.join(__dirname, "./source_part_two.js"), read_file_options) 20 | 21 | // console.log(source_code) 22 | 23 | 24 | /** 25 | * 2、将js代码解析为AST语法树 26 | */ 27 | var ast = parser.parse(source_code) 28 | // console.log(ast) 29 | 30 | /** 31 | * 3、还原代码 32 | * */ 33 | 34 | //3.1 将混淆字符串解密,还原回去 35 | function reduction(ast) { 36 | 37 | //01、还原调用指定函数加密的字符串部分 38 | const operation_one = { 39 | CallExpression(path){ 40 | var current_node = path.node 41 | if (current_node.callee.name === sdk.funcName && current_node.arguments.length === 2) { 42 | var decrypt_str = sdk.funcDecrypt(current_node.arguments[0].value, current_node.arguments[1].value) 43 | // console.log(decrypt_str) 44 | 45 | //替换为 解密后的字符串/明文字符串 46 | path.replaceWith(types.stringLiteral(decrypt_str)) 47 | 48 | /*var new_node = { 49 | type: types.stringLiteral, 50 | value: decrypt_str 51 | } 52 | console.log(new_node) 53 | return new_node*/ 54 | 55 | } 56 | } 57 | } 58 | traverse(ast, operation_one) 59 | 60 | //02、还原对象赋值、取值的情况 61 | ast = handle_obj_member_value.handle_obj_member_value(ast) 62 | ast = handle_obj_member_value.handle_anonymous_function(ast) 63 | 64 | //还原一些 Unicode、十六进制的数值/字符串 65 | traverse(ast, utils.visitor_hex_decode) 66 | traverse(ast, utils.visitor_unicode_decode) 67 | 68 | 69 | return ast 70 | } 71 | 72 | 73 | reduction(ast) 74 | 75 | 76 | //Unicode解码 opts = {jsescOption:{"minimal":true}} 77 | var result_code = generator(ast, 78 | opts = {jsescOption:{"minimal":true}} 79 | ).code 80 | 81 | console.log("========================================================================================================================") 82 | console.log(result_code) 83 | console.log("========================================================================================================================") 84 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | decode_obfuscator*.js 129 | decode_result*.js 130 | 131 | # Pyre type checker 132 | .pyre/ 133 | 134 | # nodejs requirements 135 | *node_modules* 136 | node_modules/ 137 | 138 | # ide items 139 | .idea 140 | .idea/ 141 | 142 | *idea/ 143 | *pwd.py* 144 | 145 | 146 | 147 | 148 | 149 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AST_learning 2 | 3 | 4 | AST相关知识学习 5 | 6 | --- 7 | 目前JavaScript代码大都是混淆过的,让我们一起来学习AST相关知识,可以通过操作AST,还原被obfuscator工具混淆了的JavaScript代码 8 | 9 | --- 10 | 11 | 推荐资料: 12 | 13 | - 首先来看一下 Mozilla开发者社区 介绍相关知识:[Node_objects](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Parser_API#Node_objects) 14 | - 如果不想看英文的话,这里还有其他大佬提供的中文的文档:[JavaScript抽象语法树AST](https://github.com/yacan8/blog/blob/master/posts/JavaScript%E6%8A%BD%E8%B1%A1%E8%AF%AD%E6%B3%95%E6%A0%91AST.md) 15 | - [Javascript抽象语法树下篇(实践篇)](https://cloud.tencent.com/developer/article/1554165) 16 | - [各种语言的babel手册](https://github.com/jamiebuilds/babel-handbook) 超赞这个 17 | 18 | 19 | 下面再来看一下大佬们整理的AST资料: 20 | 21 | --- 22 | 23 | JavaScript 抽象语法树相关的理论知识和实战教程索引,帮助各位工程师掌握 AST 相关知识点和技术应用。 24 | 25 | 26 | ### 0x00、AST 结构在线解析 27 | 28 | https://astexplorer.net/ 29 | 30 | https://resources.jointjs.com/demos/rappid/apps/Ast/index.html 31 | 32 | 33 | 34 | ### 0x02、常用的 AST 解析库 35 | 36 | Babel: https://github.com/jamiebuilds/babel-handbook 37 | 38 | Esprima: https://esprima.org/ 39 | 40 | Acorn: https://github.com/acornjs/acorn 41 | 42 | UglifyJS: http://lisperator.net/uglifyjs/ 43 | 44 | 45 | ### 0x03、相关教程 46 | 47 | [AST 还原 obfuscator 混淆](https://blog.csdn.net/zhao_5352269/article/details/106492177) 48 | 49 | [操作AST还原混淆代码基础系列课程三:十六进制字符串还原](https://mp.weixin.qq.com/s/bB3lF5mg1wJEYEBfBPjG3g) 50 | 51 | [操作AST还原混淆代码:让代码分析变得如此简单](https://mp.weixin.qq.com/s/Iy4gaUCfb76Km7ZdOFNS9w) 52 | 53 | [AST实战:全自动解密经obfuscator混淆的加密字符串](https://mp.weixin.qq.com/s/L4FOxc7fwKB7bq0eQb2r9g) 54 | 55 | [操作AST还原混淆代码课程九:还原简单的CallExpression 类型](https://mp.weixin.qq.com/s/CI9I4D3aJUoGUvud1uFj7w) 56 | 57 | 58 | ### 0x04、AST 节点类型对照表 59 | 60 | | 序号 | 类型原名称 | 中文名称 | 描述 | 61 | | ---- | -------------------- | ------------- | ----------------------------------------------------- | 62 | | 1 | Program | 程序主体 | 整段代码的主体 | 63 | | 2 | VariableDeclaration | 变量声明 | 声明一个变量,例如 var let const | 64 | | 3 | FunctionDeclaration | 函数声明 | 声明一个函数,例如 function | 65 | | 4 | ExpressionStatement | 表达式语句 | 通常是调用一个函数,例如 console.log() | 66 | | 5 | BlockStatement | 块语句 | 包裹在 {} 块内的代码,例如 if (condition){var a = 1;} | 67 | | 6 | BreakStatement | 中断语句 | 通常指 break | 68 | | 7 | ContinueStatement | 持续语句 | 通常指 continue | 69 | | 8 | ReturnStatement | 返回语句 | 通常指 return | 70 | | 9 | SwitchStatement | Switch 语句 | 通常指 Switch Case 语句中的 Switch | 71 | | 10 | IfStatement | If 控制流语句 | 控制流语句,通常指 if(condition){}else{} | 72 | | 11 | Identifier | 标识符 | 标识,例如声明变量时 var identi = 5 中的 identi | 73 | | 12 | CallExpression | 调用表达式 | 通常指调用一个函数,例如 console.log() | 74 | | 13 | BinaryExpression | 二进制表达式 | 通常指运算,例如 1+2 | 75 | | 14 | MemberExpression | 成员表达式 | 通常指调用对象的成员,例如 console 对象的 log 成员 | 76 | | 15 | ArrayExpression | 数组表达式 | 通常指一个数组,例如 [1, 3, 5] | 77 | | 16 | NewExpression | New 表达式 | 通常指使用 New 关键词 | 78 | | 17 | AssignmentExpression | 赋值表达式 | 通常指将函数的返回值赋值给变量 | 79 | | 18 | UpdateExpression | 更新表达式 | 通常指更新成员值,例如 i++ | 80 | | 19 | Literal | 字面量 | 字面量 | 81 | | 20 | BooleanLiteral | 布尔型字面量 | 布尔值,例如 true false | 82 | | 21 | NumericLiteral | 数字型字面量 | 数字,例如 100 | 83 | | 22 | StringLiteral | 字符型字面量 | 字符串,例如 vansenb | 84 | | 23 | SwitchCase | Case 语句 | 通常指 Switch 语句中的 Case | 85 | 86 | > 87 | 88 | 89 | 致谢: 90 | 91 | - Nightteam 夜幕团队 92 | - 杨溜溜(yacan8) 93 | - WecTeam(腾讯云社区作者) 94 | - 悦来客栈的老板 [【相关AST问题】](https://bbs.nightteam.cn/thread-693.htm) 95 | 96 | 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /sojson/example/module.js: -------------------------------------------------------------------------------- 1 | global.Buffer = global.Buffer || require('buffer').Buffer; 2 | if (typeof btoa === 'undefined') { 3 | global.btoa = function (str) { 4 | return new Buffer(str).toString('base64'); 5 | }; 6 | } 7 | if (typeof atob === 'undefined') { 8 | global.atob = function (b64Encoded) { 9 | return new Buffer(b64Encoded, 'base64').toString(); 10 | }; 11 | } 12 | 13 | ;var encode_version = 'sojson.v5' 14 | , jrkqk = '' 15 | , _0x3318 = ['eMO1woTDnRU=', '6L6h5pmt5LuD5Lq85Lq857Gi5Ymtwqh55pCG5LyT44OQ', '56us6ZaG5o2S6auk57ufDuKDp8KuwqzliYHlrpbig7NT5ZCXwrrigaJPw5bopp3lrb7ig4zCt+++heS/peWMheS+leeYlCB8w7bjga4=', 'Z3rCqsKQ', 'wq12EsOow7A=', 'wq3Di8Kpw63CisKZwr4=', 'RMOdwpc=', 'NTREw4FsCMKIQsKB', '54qF5p+/5Y6E772jw5LDkeS8meWsjOafneW+uOepq++9pei9v+itk+aXt+aMh+aKgOS7rOealOW3seS8vw==', '5Yis6Zia54ms5p225Y6H772nKMO85L2n5a+b5p+W5b2756iM', 'VMOBwofDtDscbsOBw7k=', 'eAglw6V9', 'dFUCw7LCsA==', 'wqzCij0=', '5YuX6Zip54ig5p6p5Y+J772cwqbDpOS+guWvgeadpOW+reermQ==']; 16 | (function(_0x1cab0b, _0x9fc93e) { 17 | var _0x50aee6 = function(_0x5f6b93) { 18 | while (--_0x5f6b93) { 19 | _0x1cab0b['push'](_0x1cab0b['shift']()); 20 | } 21 | }; 22 | _0x50aee6(++_0x9fc93e); 23 | }(_0x3318, 0x12d)); 24 | var _0x4d94 = function(_0x387cf0, _0x46d6a3) { 25 | _0x387cf0 = _0x387cf0 - 0x0; 26 | var _0x1c7cd3 = _0x3318[_0x387cf0]; 27 | if (_0x4d94['initialized'] === undefined) { 28 | (function() { 29 | var _0x9672bc = typeof window !== 'undefined' ? window : typeof process === 'object' && typeof require === 'function' && typeof global === 'object' ? global : this; 30 | var _0x47acfd = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; 31 | _0x9672bc['atob'] || (_0x9672bc['atob'] = function(_0x4f114b) { 32 | var _0xda79c1 = String(_0x4f114b)['replace'](/=+$/, ''); 33 | for (var _0x2456af = 0x0, _0xc64c02, _0x5e6923, _0x48f516 = 0x0, _0x448f43 = ''; _0x5e6923 = _0xda79c1['charAt'](_0x48f516++); ~_0x5e6923 && (_0xc64c02 = _0x2456af % 0x4 ? _0xc64c02 * 0x40 + _0x5e6923 : _0x5e6923, 34 | _0x2456af++ % 0x4) ? _0x448f43 += String['fromCharCode'](0xff & _0xc64c02 >> (-0x2 * _0x2456af & 0x6)) : 0x0) { 35 | _0x5e6923 = _0x47acfd['indexOf'](_0x5e6923); 36 | } 37 | return _0x448f43; 38 | } 39 | ); 40 | }()); 41 | var _0x15dca8 = function(_0xa971bc, _0x5e580d) { 42 | var _0x2a7b0e = [], _0x18c27c = 0x0, _0x8cce7, _0x21fe1e = '', _0x21ee82 = ''; 43 | _0xa971bc = atob(_0xa971bc); 44 | for (var _0x465e88 = 0x0, _0x1826b5 = _0xa971bc['length']; _0x465e88 < _0x1826b5; _0x465e88++) { 45 | _0x21ee82 += '%' + ('00' + _0xa971bc['charCodeAt'](_0x465e88)['toString'](0x10))['slice'](-0x2); 46 | } 47 | // _0xa971bc = decodeURIComponent(_0x21ee82); 48 | for (var _0x559b8b = 0x0; _0x559b8b < 0x100; _0x559b8b++) { 49 | _0x2a7b0e[_0x559b8b] = _0x559b8b; 50 | } 51 | for (_0x559b8b = 0x0; _0x559b8b < 0x100; _0x559b8b++) { 52 | _0x18c27c = (_0x18c27c + _0x2a7b0e[_0x559b8b] + _0x5e580d['charCodeAt'](_0x559b8b % _0x5e580d['length'])) % 0x100; 53 | _0x8cce7 = _0x2a7b0e[_0x559b8b]; 54 | _0x2a7b0e[_0x559b8b] = _0x2a7b0e[_0x18c27c]; 55 | _0x2a7b0e[_0x18c27c] = _0x8cce7; 56 | } 57 | _0x559b8b = 0x0; 58 | _0x18c27c = 0x0; 59 | for (var _0x325076 = 0x0; _0x325076 < _0xa971bc['length']; _0x325076++) { 60 | _0x559b8b = (_0x559b8b + 0x1) % 0x100; 61 | _0x18c27c = (_0x18c27c + _0x2a7b0e[_0x559b8b]) % 0x100; 62 | _0x8cce7 = _0x2a7b0e[_0x559b8b]; 63 | _0x2a7b0e[_0x559b8b] = _0x2a7b0e[_0x18c27c]; 64 | _0x2a7b0e[_0x18c27c] = _0x8cce7; 65 | _0x21fe1e += String['fromCharCode'](_0xa971bc['charCodeAt'](_0x325076) ^ _0x2a7b0e[(_0x2a7b0e[_0x559b8b] + _0x2a7b0e[_0x18c27c]) % 0x100]); 66 | } 67 | return _0x21fe1e; 68 | }; 69 | _0x4d94['rc4'] = _0x15dca8; 70 | _0x4d94['data'] = {}; 71 | _0x4d94['initialized'] = !![]; 72 | } 73 | var _0x281020 = _0x4d94['data'][_0x387cf0]; 74 | if (_0x281020 === undefined) { 75 | if (_0x4d94['once'] === undefined) { 76 | _0x4d94['once'] = !![]; 77 | } 78 | _0x1c7cd3 = _0x4d94['rc4'](_0x1c7cd3, _0x46d6a3); 79 | _0x4d94['data'][_0x387cf0] = _0x1c7cd3; 80 | } else { 81 | _0x1c7cd3 = _0x281020; 82 | } 83 | return _0x1c7cd3; 84 | }; 85 | 86 | 87 | exports.decryptStr = _0x4d94; 88 | exports.decryptStrFnName = '_0x4d94'; -------------------------------------------------------------------------------- /sojson/example/decrypt2.js: -------------------------------------------------------------------------------- 1 | const parser = require("@babel/parser"); 2 | const template = require("@babel/template").default; 3 | const traverse = require("@babel/traverse").default; 4 | const t = require("@babel/types"); 5 | const generator = require("@babel/generator").default; 6 | const path = require('path'); 7 | const fs = require('fs'); 8 | 9 | const { decryptStr, decryptStrFnName } = require('./module'); 10 | 11 | fs.readFile(path.resolve(__dirname, './result1.js'), { "encoding": 'utf-8' }, function (err, data) { 12 | const ast = parser.parse(data); 13 | step2(ast); 14 | 15 | // 将ast 转为 js 16 | let { code } = generator(ast); 17 | // code = code.replace(/!!\[\]/g, 'true').replace(/!\[\]/g, 'false'); 18 | console.log(code) 19 | }); 20 | 21 | function step2(ast) { 22 | traverse(ast,{ 23 | VariableDeclarator:callToStr, 24 | ExpressionStatement:convParam 25 | }) 26 | } 27 | 28 | function callToStr(path) { 29 | var node = path.node; 30 | 31 | if (!t.isObjectExpression(node.init)) 32 | return; 33 | 34 | var objPropertiesList = node.init.properties; 35 | 36 | if (objPropertiesList.length==0) 37 | return; 38 | 39 | var objName = node.id.name; 40 | 41 | objPropertiesList.forEach(prop => { 42 | var key = prop.key.value; 43 | if(!t.isStringLiteral(prop.value)) 44 | { 45 | var retStmt = prop.value.body.body[0]; 46 | 47 | // 该path的最近父节点 48 | var fnPath = path.getFunctionParent(); 49 | fnPath.traverse({ 50 | CallExpression: function (_path) { 51 | if (!t.isMemberExpression(_path.node.callee)) 52 | return; 53 | 54 | var _node = _path.node.callee; 55 | if (!t.isIdentifier(_node.object) || _node.object.name !== objName) 56 | return; 57 | if (!t.isStringLiteral(_node.property) || _node.property.value != key) 58 | return; 59 | 60 | var args = _path.node.arguments; 61 | 62 | // 二元运算 63 | if (t.isBinaryExpression(retStmt.argument) && args.length===2) 64 | { 65 | _path.replaceWith(t.binaryExpression(retStmt.argument.operator, args[0], args[1])); 66 | } 67 | // 逻辑运算 68 | else if(t.isLogicalExpression(retStmt.argument) && args.length==2) 69 | { 70 | _path.replaceWith(t.logicalExpression(retStmt.argument.operator, args[0], args[1])); 71 | } 72 | // 函数调用 73 | else if(t.isCallExpression(retStmt.argument) && t.isIdentifier(retStmt.argument.callee)) 74 | { 75 | _path.replaceWith(t.callExpression(args[0], args.slice(1))) 76 | } 77 | } 78 | }) 79 | } 80 | else{ 81 | var retStmt = prop.value.value; 82 | 83 | // 该path的最近父节点 84 | var fnPath = path.getFunctionParent(); 85 | fnPath.traverse({ 86 | MemberExpression:function (_path) { 87 | var _node = _path.node; 88 | if (!t.isIdentifier(_node.object) || _node.object.name !== objName) 89 | return; 90 | if (!t.isStringLiteral(_node.property) || _node.property.value != key) 91 | return; 92 | 93 | _path.replaceWith(t.stringLiteral(retStmt)) 94 | } 95 | }) 96 | 97 | } 98 | 99 | }); 100 | 101 | path.remove(); 102 | } 103 | 104 | function convParam(path) { 105 | var node = path.node; 106 | 107 | if (!t.isCallExpression(node.expression)) 108 | return; 109 | 110 | if (node.expression.arguments == undefined || node.expression.callee.params == undefined || node.expression.arguments.length > node.expression.callee.params.length) 111 | return; 112 | 113 | var argumentList = node.expression.arguments; 114 | var paramList = node.expression.callee.params; 115 | for (var i = 0; i> (-0x2 * _0x3a5c47 & 0x6)) : 0x0) { 35 | _0x1dbde4 = _0x196f8f['indexOf'](_0x1dbde4); 36 | } 37 | return _0x4f9dcc; 38 | }); 39 | }()); 40 | var _0x5356f6 = function (_0x2c11a3, _0x10ac30) { 41 | var _0x35e0c6 = [], 42 | _0x4399d3 = 0x0, 43 | _0x3adf89, _0x2ce81e = '', 44 | _0x411d4d = ''; 45 | _0x2c11a3 = atob(_0x2c11a3); 46 | for (var _0x1aa75b = 0x0, _0x54144c = _0x2c11a3['length']; _0x1aa75b < _0x54144c; _0x1aa75b++) { 47 | _0x411d4d += '%' + ('00' + _0x2c11a3['charCodeAt'](_0x1aa75b)['toString'](0x10))['slice'](-0x2); 48 | } 49 | _0x2c11a3 = decodeURIComponent(_0x411d4d); 50 | for (var _0x3f649d = 0x0; _0x3f649d < 0x100; _0x3f649d++) { 51 | _0x35e0c6[_0x3f649d] = _0x3f649d; 52 | } 53 | for (_0x3f649d = 0x0; _0x3f649d < 0x100; _0x3f649d++) { 54 | _0x4399d3 = (_0x4399d3 + _0x35e0c6[_0x3f649d] + _0x10ac30['charCodeAt'](_0x3f649d % _0x10ac30[ 55 | 'length'])) % 0x100; 56 | _0x3adf89 = _0x35e0c6[_0x3f649d]; 57 | _0x35e0c6[_0x3f649d] = _0x35e0c6[_0x4399d3]; 58 | _0x35e0c6[_0x4399d3] = _0x3adf89; 59 | } 60 | _0x3f649d = 0x0; 61 | _0x4399d3 = 0x0; 62 | for (var _0x577eef = 0x0; _0x577eef < _0x2c11a3['length']; _0x577eef++) { 63 | _0x3f649d = (_0x3f649d + 0x1) % 0x100; 64 | _0x4399d3 = (_0x4399d3 + _0x35e0c6[_0x3f649d]) % 0x100; 65 | _0x3adf89 = _0x35e0c6[_0x3f649d]; 66 | _0x35e0c6[_0x3f649d] = _0x35e0c6[_0x4399d3]; 67 | _0x35e0c6[_0x4399d3] = _0x3adf89; 68 | _0x2ce81e += String['fromCharCode'](_0x2c11a3['charCodeAt'](_0x577eef) ^ _0x35e0c6[(_0x35e0c6[ 69 | _0x3f649d] + _0x35e0c6[_0x4399d3]) % 0x100]); 70 | } 71 | return _0x2ce81e; 72 | }; 73 | _0x5632['rc4'] = _0x5356f6; 74 | _0x5632['data'] = {}; 75 | _0x5632['initialized'] = !![]; 76 | } 77 | var _0x25cc39 = _0x5632['data'][_0xcd0166]; 78 | if (_0x25cc39 === undefined) { 79 | if (_0x5632['once'] === undefined) { 80 | _0x5632['once'] = !![]; 81 | } 82 | _0x565236 = _0x5632['rc4'](_0x565236, _0x2fddb5); 83 | _0x5632['data'][_0xcd0166] = _0x565236; 84 | } else { 85 | _0x565236 = _0x25cc39; 86 | } 87 | return _0x565236; 88 | }; 89 | 90 | 91 | module.exports = { 92 | "funcName": "_0x5632", 93 | "funcDecrypt": _0x5632 94 | } 95 | 96 | -------------------------------------------------------------------------------- /sojson/just_do_IT/source_part_two.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | 混淆前: 4 | var a={},b={}; 5 | 6 | (function(w, d) { 7 | 8 | w.info = "这是一个一系列js操作。"; 9 | 10 | d.adinfo = "站长接高级 “JS加密” 和 “JS解密” ,保卫你的 js。"; 11 | 12 | d.warning = "如果您的JS里嵌套了PHP,JSP标签,等等其他非JavaScript的代码,请提取出来再加密。这个工具不能加密php、jsp等模版内容"; 13 | 14 | d.intro = "本工具由 www.jsjiami.com 提供接口。"; 15 | 16 | })(a, b); 17 | 18 | 19 | 混淆后: 20 | * 加密工具已经升级了一个版本,目前为 jsjiami.com.v5 ,主要加强了算法,以及防破解【绝对不可逆】配置,耶稣也无法100%还原,我说的。; 21 | * 已经打算把这个工具基础功能一直免费下去。还希望支持我。 22 | * 另外 jsjiami.com.v5 已经强制加入校验,注释可以去掉,但是 jsjiami.com.v5 不能去掉(如果你开通了VIP,可以手动去掉),其他都没有任何绑定。 23 | * 誓死不会加入任何后门,jsjiami.com JS 加密的使命就是为了保护你们的Javascript 。 24 | * 警告:如果您恶意去掉 jsjiami.com.v5 那么我们将不会保护您的JavaScript代码。请遵守规则 25 | * 新版本: https://www.jsjiami.com/ 支持批量加密,支持大文件加密,拥有更多加密。 */ 26 | 27 | 28 | /* 29 | 部分还原后: 30 | 31 | var a = {}, 32 | b = {}; 33 | 34 | (function (_0x5e0715, _0x2727bc) { 35 | var _0x2763bf = { 36 | 'hGpeZ': "\u8FD9\u662F\u4E00\u4E2A\u4E00\u7CFB\u5217js\u64CD\u4F5C\u3002", 37 | 'sYoYH': "\u7AD9\u957F\u63A5\u9AD8\u7EA7 \u201CJS\u52A0\u5BC6\u201D \u548C \u201CJS\u89E3\u5BC6\u201D \uFF0C\u4FDD\u536B\u4F60\u7684 js\u3002", 38 | 'bRClp': '如果您的JS里嵌套了PHP,JSP标签,等等其他非JavaScript的代码,请提取出来再加密。这个工具不能加密php、jsp等模版内容', 39 | 'hlrsP': "\u672C\u5DE5\u5177\u7531 www.jsjiami.com \u63D0\u4F9B\u63A5\u53E3\u3002" 40 | }; 41 | _0x5e0715["info"] = _0x2763bf["hGpeZ"]; 42 | _0x2727bc["adinfo"] = _0x2763bf["sYoYH"]; 43 | _0x2727bc['warning'] = _0x2763bf['bRClp']; 44 | _0x2727bc["intro"] = _0x2763bf["hlrsP"]; 45 | })(a, b); 46 | 47 | ; 48 | 49 | (function (_0x4f25a9, _0x249391, _0xec96c1) { 50 | var _0x1fff11 = { 51 | 'mnPwx': "fvy", 52 | 'TbqCI': "xZI", 53 | 'fPLCO': "ert", 54 | 'OpmXp': function _0x249c07(_0x3746f6, _0x35f875) { 55 | return _0x3746f6 !== _0x35f875; 56 | }, 57 | 'hqjgd': "undefined", 58 | 'Euthk': function _0x391777(_0x1833ed, _0x39a336) { 59 | return _0x1833ed + _0x39a336; 60 | }, 61 | 'GHtNj': "\u7248\u672C\u53F7\uFF0Cjs\u4F1A\u5B9A\u671F\u5F39\u7A97\uFF0C\u8FD8\u8BF7\u652F\u6301\u6211\u4EEC\u7684\u5DE5\u4F5C", 62 | 'YlCYb': '这是一个一系列js操作。', 63 | 'pRAFr': "\u5982\u679C\u60A8\u7684JS\u91CC\u5D4C\u5957\u4E86PHP\uFF0CJSP\u6807\u7B7E\uFF0C\u7B49\u7B49\u5176\u4ED6\u975EJavaScript\u7684\u4EE3\u7801\uFF0C\u8BF7\u63D0\u53D6\u51FA\u6765\u518D\u52A0\u5BC6\u3002\u8FD9\u4E2A\u5DE5\u5177\u4E0D\u80FD\u52A0\u5BC6php\u3001jsp\u7B49\u6A21\u7248\u5185\u5BB9", 64 | 'IMTtB': "\u5220\u9664\u7248\u672C\u53F7\uFF0Cjs\u4F1A\u5B9A\u671F\u5F39\u7A97" 65 | }; 66 | _0xec96c1 = 'al'; 67 | 68 | try { 69 | if (_0x1fff11["mnPwx"] !== _0x1fff11["TbqCI"]) { 70 | _0xec96c1 += _0x1fff11['fPLCO']; 71 | _0x249391 = encode_version; 72 | 73 | if (!(_0x1fff11["OpmXp"](typeof _0x249391, _0x1fff11['hqjgd']) && _0x249391 === "jsjiami.com.v5")) { 74 | _0x4f25a9[_0xec96c1](_0x1fff11['Euthk']('删除', _0x1fff11["GHtNj"])); 75 | } 76 | } else { 77 | _0x4f25a9["info"] = _0x1fff11["YlCYb"]; 78 | d['adinfo'] = "\u7AD9\u957F\u63A5\u9AD8\u7EA7 \u201CJS\u52A0\u5BC6\u201D \u548C \u201CJS\u89E3\u5BC6\u201D \uFF0C\u4FDD\u536B\u4F60\u7684 js\u3002"; 79 | d["warning"] = _0x1fff11["pRAFr"]; 80 | d['intro'] = '本工具由\x20www.jsjiami.com\x20提供接口。'; 81 | } 82 | } catch (_0xdb29db) { 83 | _0x4f25a9[_0xec96c1](_0x1fff11['IMTtB']); 84 | } 85 | })(window); 86 | 87 | ; 88 | encode_version = 'jsjiami.com.v5'; 89 | 90 | 91 | */ 92 | 93 | 94 | var a = {}, 95 | b = {}; 96 | (function (_0x5e0715, _0x2727bc) { 97 | var _0x2763bf = { 98 | 'hGpeZ': _0x5632('0x0', 'V4Wq'), 99 | 'sYoYH': _0x5632('0x1', 'v2f7'), 100 | 'bRClp': '如果您的JS里嵌套了PHP,JSP标签,等等其他非JavaScript的代码,请提取出来再加密。这个工具不能加密php、jsp等模版内容', 101 | 'hlrsP': _0x5632('0x2', '7MZ)') 102 | }; 103 | _0x5e0715[_0x5632('0x3', ']N1l')] = _0x2763bf[_0x5632('0x4', ']N1l')]; 104 | _0x2727bc[_0x5632('0x5', 'c4lU')] = _0x2763bf[_0x5632('0x6', 'jEMb')]; 105 | _0x2727bc['warning'] = _0x2763bf['bRClp']; 106 | _0x2727bc[_0x5632('0x7', 'TNSl')] = _0x2763bf[_0x5632('0x8', '#q4)')]; 107 | }(a, b));; 108 | (function (_0x4f25a9, _0x249391, _0xec96c1) { 109 | var _0x1fff11 = { 110 | 'mnPwx': _0x5632('0x9', '!W81'), 111 | 'TbqCI': _0x5632('0xa', 'aO$t'), 112 | 'fPLCO': _0x5632('0xb', ']c)t'), 113 | 'OpmXp': function _0x249c07(_0x3746f6, _0x35f875) { 114 | return _0x3746f6 !== _0x35f875; 115 | }, 116 | 'hqjgd': _0x5632('0xc', 'Cbm&'), 117 | 'Euthk': function _0x391777(_0x1833ed, _0x39a336) { 118 | return _0x1833ed + _0x39a336; 119 | }, 120 | 'GHtNj': _0x5632('0xd', '0lTo'), 121 | 'YlCYb': '这是一个一系列js操作。', 122 | 'pRAFr': _0x5632('0xe', 'sG]P'), 123 | 'IMTtB': _0x5632('0xf', '!W81') 124 | }; 125 | _0xec96c1 = 'al'; 126 | try { 127 | if (_0x1fff11[_0x5632('0x10', '6DSx')] !== _0x1fff11[_0x5632('0x11', '7k*K')]) { 128 | _0xec96c1 += _0x1fff11['fPLCO']; 129 | _0x249391 = encode_version; 130 | if (!(_0x1fff11[_0x5632('0x12', 'h6cr')](typeof _0x249391, _0x1fff11['hqjgd']) && _0x249391 === _0x5632( 131 | '0x13', 'mB4o'))) { 132 | _0x4f25a9[_0xec96c1](_0x1fff11['Euthk']('删除', _0x1fff11[_0x5632('0x14', '0lTo')])); 133 | } 134 | } else { 135 | _0x4f25a9[_0x5632('0x15', '!W81')] = _0x1fff11[_0x5632('0x16', 'sG]P')]; 136 | d['adinfo'] = _0x5632('0x17', 'xoDu'); 137 | d[_0x5632('0x18', 'Yqj3')] = _0x1fff11[_0x5632('0x19', '*yMw')]; 138 | d['intro'] = '本工具由\x20www.jsjiami.com\x20提供接口。'; 139 | } 140 | } catch (_0xdb29db) { 141 | _0x4f25a9[_0xec96c1](_0x1fff11['IMTtB']); 142 | } 143 | }(window));; 144 | encode_version = 'jsjiami.com.v5'; 145 | 146 | -------------------------------------------------------------------------------- /sojson/just_do_IT/temp.js: -------------------------------------------------------------------------------- 1 | const parser = require("@babel/parser") 2 | const traverse = require("@babel/traverse").default 3 | const generator = require("@babel/generator").default 4 | const types = require("@babel/types") 5 | 6 | /*const source_code = "const test = function (a, b) {return a+b}; var result = test(3, 2);" 7 | 8 | 9 | var ast = parser.parse(source_code) 10 | 11 | traverse(ast, { 12 | CallExpression(path){ 13 | var current_node = path.node 14 | 15 | // console.log(current_node.type) 16 | // console.log(current_node.callee.name) 17 | // console.log(current_node.arguments) 18 | 19 | if (types.isCallExpression(current_node)){ 20 | console.log(2323232323) 21 | // var res = types.CallExpression(current_node.arguments[0], current_node.arguments.slice(1)) 22 | var res = types.CallExpression(current_node, current_node.arguments) 23 | 24 | console.log(generator(res).code) 25 | } 26 | 27 | if (current_node.callee.name === "test" && current_node.arguments.length === 2){ 28 | console.log() 29 | 30 | // path.replaceWith(ast, types.CallExpression(current_node)) 31 | } 32 | 33 | } 34 | }) 35 | 36 | var { code } = generator(ast)*/ 37 | // console.log(code) 38 | 39 | 40 | const source_code = "function test(){\n" + 41 | "\tvar dict = {\n" + 42 | " \tabc: 123,\n" + 43 | " \tdef: 456\n" + 44 | " }\n" + 45 | " \n" + 46 | " var aa = function (){\n" + 47 | " \tvar bbb = dict['def']\n" + 48 | " \n" + 49 | " var my_dict = {\n" + 50 | " abc: 123,\n" + 51 | " def: 456\n" + 52 | " }\n" + 53 | " \n" + 54 | " var cc = function(){\n" + 55 | " \tvar bb = my_dict['def']\n" + 56 | " console.log(bb)\n" + 57 | "\n" + 58 | " }\n" + 59 | " \n" + 60 | " }\n" + 61 | "\n" + 62 | "}" 63 | 64 | 65 | var ast = parser.parse(source_code) 66 | 67 | 68 | 69 | const operation_one = function(path){ 70 | var current_node = path.node 71 | 72 | if (current_node.id.name === "my_dict" && current_node.init.properties.length > 0){ 73 | var obj_name = current_node.id.name 74 | var propertiesList = current_node.init.properties 75 | 76 | for (one of propertiesList){ 77 | 78 | if (one.type === "ObjectProperty"){ 79 | 80 | var obj_key = one.key.name 81 | var obj_value = one.value.value 82 | console.log(obj_key, obj_value) 83 | 84 | var parent_node = path.getFunctionParent() 85 | // console.log(parent_node) 86 | 87 | parent_node.traverse({ 88 | MemberExpression(son_path){ 89 | var son_node = son_path.node 90 | if (son_node.object.name === obj_name 91 | && son_node.property.type === "StringLiteral" 92 | && son_node.property.value === obj_key){ 93 | 94 | console.log("12333333333") 95 | console.log(obj_name, obj_key, obj_value) 96 | son_path.replaceWith(types.numericLiteral(obj_value)) 97 | 98 | } 99 | } 100 | }) 101 | 102 | 103 | } 104 | 105 | } 106 | 107 | //删除这个节点 108 | path.remove() 109 | 110 | } 111 | 112 | 113 | 114 | } 115 | 116 | 117 | traverse(ast, { 118 | VariableDeclarator: operation_one 119 | }) 120 | 121 | console.log(generator(ast).code) 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | /** 130 | * 替换后的代码 131 | * **/ 132 | 133 | 134 | 135 | var a = {}, 136 | b = {}; 137 | 138 | (function (_0x5e0715, _0x2727bc) { 139 | var _0x2763bf = { 140 | 'hGpeZ': "\u8FD9\u662F\u4E00\u4E2A\u4E00\u7CFB\u5217js\u64CD\u4F5C\u3002", 141 | 'sYoYH': "\u7AD9\u957F\u63A5\u9AD8\u7EA7 \u201CJS\u52A0\u5BC6\u201D \u548C \u201CJS\u89E3\u5BC6\u201D \uFF0C\u4FDD\u536B\u4F60\u7684 js\u3002", 142 | 'bRClp': '如果您的JS里嵌套了PHP,JSP标签,等等其他非JavaScript的代码,请提取出来再加密。这个工具不能加密php、jsp等模版内容', 143 | 'hlrsP': "\u672C\u5DE5\u5177\u7531 www.jsjiami.com \u63D0\u4F9B\u63A5\u53E3\u3002" 144 | }; 145 | _0x5e0715["info"] = _0x2763bf["hGpeZ"]; 146 | _0x2727bc["adinfo"] = _0x2763bf["sYoYH"]; 147 | _0x2727bc['warning'] = _0x2763bf['bRClp']; 148 | _0x2727bc["intro"] = _0x2763bf["hlrsP"]; 149 | })(a, b); 150 | 151 | ; 152 | 153 | (function (_0x4f25a9, _0x249391, _0xec96c1) { 154 | var _0x1fff11 = { 155 | 'mnPwx': "fvy", 156 | 'TbqCI': "xZI", 157 | 'fPLCO': "ert", 158 | 'OpmXp': function _0x249c07(_0x3746f6, _0x35f875) { 159 | return _0x3746f6 !== _0x35f875; 160 | }, 161 | 'hqjgd': "undefined", 162 | 'Euthk': function _0x391777(_0x1833ed, _0x39a336) { 163 | return _0x1833ed + _0x39a336; 164 | }, 165 | 'GHtNj': "\u7248\u672C\u53F7\uFF0Cjs\u4F1A\u5B9A\u671F\u5F39\u7A97\uFF0C\u8FD8\u8BF7\u652F\u6301\u6211\u4EEC\u7684\u5DE5\u4F5C", 166 | 'YlCYb': '这是一个一系列js操作。', 167 | 'pRAFr': "\u5982\u679C\u60A8\u7684JS\u91CC\u5D4C\u5957\u4E86PHP\uFF0CJSP\u6807\u7B7E\uFF0C\u7B49\u7B49\u5176\u4ED6\u975EJavaScript\u7684\u4EE3\u7801\uFF0C\u8BF7\u63D0\u53D6\u51FA\u6765\u518D\u52A0\u5BC6\u3002\u8FD9\u4E2A\u5DE5\u5177\u4E0D\u80FD\u52A0\u5BC6php\u3001jsp\u7B49\u6A21\u7248\u5185\u5BB9", 168 | 'IMTtB': "\u5220\u9664\u7248\u672C\u53F7\uFF0Cjs\u4F1A\u5B9A\u671F\u5F39\u7A97" 169 | }; 170 | _0xec96c1 = 'al'; 171 | 172 | try { 173 | if (_0x1fff11["mnPwx"] !== _0x1fff11["TbqCI"]) { 174 | _0xec96c1 += _0x1fff11['fPLCO']; 175 | _0x249391 = encode_version; 176 | 177 | if (!(_0x1fff11["OpmXp"](typeof _0x249391, _0x1fff11['hqjgd']) && _0x249391 === "jsjiami.com.v5")) { 178 | _0x4f25a9[_0xec96c1](_0x1fff11['Euthk']('删除', _0x1fff11["GHtNj"])); 179 | } 180 | } else { 181 | _0x4f25a9["info"] = _0x1fff11["YlCYb"]; 182 | d['adinfo'] = "\u7AD9\u957F\u63A5\u9AD8\u7EA7 \u201CJS\u52A0\u5BC6\u201D \u548C \u201CJS\u89E3\u5BC6\u201D \uFF0C\u4FDD\u536B\u4F60\u7684 js\u3002"; 183 | d["warning"] = _0x1fff11["pRAFr"]; 184 | d['intro'] = '本工具由\x20www.jsjiami.com\x20提供接口。'; 185 | } 186 | } catch (_0xdb29db) { 187 | _0x4f25a9[_0xec96c1](_0x1fff11['IMTtB']); 188 | } 189 | })(window); 190 | 191 | ; 192 | encode_version = 'jsjiami.com.v5'; 193 | 194 | 195 | 196 | -------------------------------------------------------------------------------- /dingxiang/ast.js: -------------------------------------------------------------------------------- 1 | const generator = require("@babel/generator"); 2 | const parser = require("@babel/parser"); 3 | const traverse = require("@babel/traverse"); 4 | const types = require("@babel/types"); 5 | const file_in=__dirname+'\\input.js'; 6 | const file_out=__dirname+'\\output.js'; 7 | var fs =require("fs"); 8 | let js = String(fs.readFileSync(file_in,{encodeing:'utf-8'})); 9 | let ast = parser.parse(js); 10 | 11 | function writeFile(code) { 12 | console.log("Write start\\n"); 13 | fs.writeFile(file_out, code, function (err) { 14 | if (err) { 15 | return console.error(err); 16 | } 17 | }); 18 | console.log("Write finish\\n"); 19 | } 20 | visitor1={ 21 | "Program"(path){ 22 | var body =path.get('body.0'); 23 | var node =body.node; 24 | var args=node.expression.argument; 25 | if(args==undefined)return; 26 | var params=args.callee.params; 27 | var paramsvalue=args.arguments; 28 | var name,valuelist; 29 | for(var i=0;i0){ 113 | return; 114 | } 115 | for(const refer_path of binding.referencePaths) 116 | { 117 | 118 | let call_express=refer_path.findParent(p=>p.isCallExpression()); 119 | let arguments=call_express.get('arguments'); 120 | let args=[]; 121 | arguments.forEach(arg=>{args.push(arg.isLiteral())}); 122 | if(args.length ===0 || args.indexOf("false")!=-1){ 123 | continue; 124 | } 125 | try{ 126 | let value= eval(call_express.toString()); 127 | if(value==undefined)return; 128 | switch(typeof value){ 129 | case "string": 130 | call_express.replaceWith(types.StringLiteral(value)); 131 | isdel=true; 132 | break; 133 | case "number": 134 | call_express.replaceWith(types.NumericLiteral(value)); 135 | isdel=true; 136 | break; 137 | } 138 | 139 | }catch(e){ 140 | 141 | } 142 | } 143 | if(isdel){ 144 | //path.remove(); 145 | } 146 | 147 | } 148 | } 149 | const visitor5={ 150 | "StringLiteral|NumericLiteral"(path){ 151 | delete path.node.extra; 152 | } 153 | } 154 | const visitor6={ 155 | "CallExpression"(path){ 156 | var node =path.node; 157 | var code=path.toString(); 158 | var value; 159 | if(!node.arguments.length>0)return; 160 | if(!types.isLiteral(node.arguments[0]))return; 161 | if(code.indexOf("Time")!=-1)return; 162 | try{ 163 | value=eval("value="+code); 164 | 165 | }catch(e){ 166 | 167 | } 168 | if(value==undefined)return; 169 | switch(typeof value){ 170 | case "string": 171 | path.replaceWith(types.StringLiteral(value)); 172 | break; 173 | case "number": 174 | path.replaceWith(types.NumericLiteral(value)); 175 | break; 176 | case "boolean": 177 | path.replaceWith(types.BooleanLiteral(value)); 178 | break; 179 | } 180 | 181 | } 182 | } 183 | traverse.default(ast,visitor1); 184 | traverse.default(ast,visitor2); 185 | traverse.default(ast,visitor3); 186 | traverse.default(ast,visitor4); 187 | traverse.default(ast,visitor5); 188 | traverse.default(ast,visitor6); 189 | writeFile(generator.default(ast,opts = {jsescOption:{"minimal":true}}).code); 190 | -------------------------------------------------------------------------------- /01/hunxiao.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | * 加密工具已经升级了一个版本,目前为 sojson.v5 ,主要加强了算法,以及防破解【绝对不可逆】配置,耶稣也无法100%还原,我说的。; 4 | 5 | * 已经打算把这个工具基础功能一直免费下去。还希望支持我。 6 | 7 | * 另外 sojson.v5 已经强制加入校验,注释可以去掉,但是 sojson.v5 不能去掉(如果你开通了VIP,可以手动去掉),其他都没有任何绑定。 8 | 9 | * 誓死不会加入任何后门,sojson JS 加密的使命就是为了保护你们的Javascript 。 10 | 11 | * 警告:如果您恶意去掉 sojson.v5 那么我们将不会保护您的JavaScript代码。请遵守规则 12 | 13 | * 新版本: https://www.jsjiami.com/ 支持批量加密,支持大文件加密,拥有更多加密。 14 | */ 15 | 16 | 17 | // ; 18 | // var encode_version = 'sojson.v5', 19 | // xdfes = '', 20 | // _0x5c82 = ['TcOKegTCicKaPQlr', '5Ymn6Zmx54qW5p2C5Yy077yRBhfkv6/lrafmnJPlvb/nq6I=', 'wozCncKGF8KJ', 'wpbCjzTCmSo=', 21 | // 'ZEPClcKmdA==', 'wrfDtAXCqcOZ', 'YhrDt8OESQ==', 'S3fDpcOTwp8=', 'SxDDucOufg==', 'w4EEasOIZA==', 'OmPDvV/Cthk=', 22 | // '56mj6Zae5o2Q6aiF57mKcA1aw40D4oKww6Zu5Yur5a+64oCrP+WSokfigaYuwpTop5nlrKjigbLCksKTSu++suS+puWMsuS+iuebksK6wpHDjuOCkg==', 23 | // 'woTCjcOONMKUw6Ml', 'wqrCm8Ke']; 24 | // (function (_0x440d7e, _0xc2f8a0) { 25 | // var _0x4310cd = function (_0x396142) { 26 | // while (--_0x396142) { 27 | // _0x440d7e['push'](_0x440d7e['shift']()); 28 | // } 29 | // }; 30 | // _0x4310cd(++_0xc2f8a0); 31 | // }(_0x5c82, 0x1f3)); 32 | // var _0x19b2 = function (_0x44fe81, _0x3b43b5) { 33 | // _0x44fe81 = _0x44fe81 - 0x0; 34 | // var _0x368cbf = _0x5c82[_0x44fe81]; 35 | // if (_0x19b2['initialized'] === undefined) { 36 | // (function () { 37 | // var _0x1903a1 = typeof window !== 'undefined' ? window : typeof process === 'object' && typeof require === 38 | // 'function' && typeof global === 'object' ? global : this; 39 | // var _0x38352b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; 40 | // _0x1903a1['atob'] || (_0x1903a1['atob'] = function (_0x41d26d) { 41 | // var _0x596d04 = String(_0x41d26d)['replace'](/=+$/, ''); 42 | // for (var _0xb98ee1 = 0x0, _0xf8d3de, _0x522faa, _0x355ad4 = 0x0, _0x5aa1cf = ''; _0x522faa = 43 | // _0x596d04['charAt'](_0x355ad4++); ~_0x522faa && (_0xf8d3de = _0xb98ee1 % 0x4 ? 44 | // _0xf8d3de * 0x40 + _0x522faa : _0x522faa, _0xb98ee1++ % 0x4) ? _0x5aa1cf += 45 | // String['fromCharCode'](0xff & _0xf8d3de >> (-0x2 * _0xb98ee1 & 0x6)) : 0x0) { 46 | // _0x522faa = _0x38352b['indexOf'](_0x522faa); 47 | // } 48 | // return _0x5aa1cf; 49 | // }); 50 | // }()); 51 | // var _0x2357e5 = function (_0x52a6e7, _0x2fad1f) { 52 | // var _0x53fe41 = [], 53 | // _0x4ecd73 = 0x0, 54 | // _0x39d043, _0x1bc680 = '', 55 | // _0x33c56e = ''; 56 | // _0x52a6e7 = atob(_0x52a6e7); 57 | // for (var _0x285b9e = 0x0, _0x11459c = _0x52a6e7['length']; _0x285b9e < _0x11459c; _0x285b9e++) { 58 | // _0x33c56e += '%' + ('00' + _0x52a6e7['charCodeAt'](_0x285b9e)['toString'](0x10))['slice'](-0x2); 59 | // } 60 | // _0x52a6e7 = decodeURIComponent(_0x33c56e); 61 | // for (var _0x1f667b = 0x0; _0x1f667b < 0x100; _0x1f667b++) { 62 | // _0x53fe41[_0x1f667b] = _0x1f667b; 63 | // } 64 | // for (_0x1f667b = 0x0; _0x1f667b < 0x100; _0x1f667b++) { 65 | // _0x4ecd73 = (_0x4ecd73 + _0x53fe41[_0x1f667b] + _0x2fad1f['charCodeAt'](_0x1f667b % _0x2fad1f[ 66 | // 'length'])) % 0x100; 67 | // _0x39d043 = _0x53fe41[_0x1f667b]; 68 | // _0x53fe41[_0x1f667b] = _0x53fe41[_0x4ecd73]; 69 | // _0x53fe41[_0x4ecd73] = _0x39d043; 70 | // } 71 | // _0x1f667b = 0x0; 72 | // _0x4ecd73 = 0x0; 73 | // for (var _0x5b3c55 = 0x0; _0x5b3c55 < _0x52a6e7['length']; _0x5b3c55++) { 74 | // _0x1f667b = (_0x1f667b + 0x1) % 0x100; 75 | // _0x4ecd73 = (_0x4ecd73 + _0x53fe41[_0x1f667b]) % 0x100; 76 | // _0x39d043 = _0x53fe41[_0x1f667b]; 77 | // _0x53fe41[_0x1f667b] = _0x53fe41[_0x4ecd73]; 78 | // _0x53fe41[_0x4ecd73] = _0x39d043; 79 | // _0x1bc680 += String['fromCharCode'](_0x52a6e7['charCodeAt'](_0x5b3c55) ^ _0x53fe41[(_0x53fe41[ 80 | // _0x1f667b] + _0x53fe41[_0x4ecd73]) % 0x100]); 81 | // } 82 | // return _0x1bc680; 83 | // }; 84 | // _0x19b2['rc4'] = _0x2357e5; 85 | // _0x19b2['data'] = {}; 86 | // _0x19b2['initialized'] = !![]; 87 | // } 88 | // var _0x5b29b2 = _0x19b2['data'][_0x44fe81]; 89 | // if (_0x5b29b2 === undefined) { 90 | // if (_0x19b2['once'] === undefined) { 91 | // _0x19b2['once'] = !![]; 92 | // } 93 | // _0x368cbf = _0x19b2['rc4'](_0x368cbf, _0x3b43b5); 94 | // _0x19b2['data'][_0x44fe81] = _0x368cbf; 95 | // } else { 96 | // _0x368cbf = _0x5b29b2; 97 | // } 98 | // return _0x368cbf; 99 | // }; 100 | 101 | 102 | var a = {}, 103 | b = {}; 104 | (function (_0x382e1a, _0x5042fa) { 105 | var _0x477fd6 = { 106 | 'iuyHT': '这是一个一系列js操作。' 107 | }; 108 | _0x382e1a['info'] = _0x477fd6[_0x19b2('0x0', ']hA7')]; 109 | _0x5042fa[_0x19b2('0x1', '#OS(')] = _0x19b2('0x2', 'D*Vx'); 110 | _0x5042fa[_0x19b2('0x3', 'NgoE')] = '如果您的JS里嵌套了PHP,JSP标签,等等其他非JavaScript的代码,请提取出来再加密。这个工具不能加密php、jsp等模版内容'; 111 | }(a, b));; 112 | (function (_0x5ae480, _0x488138, _0x48e246) { 113 | var _0x377c2a = { 114 | 'HvlfW': _0x19b2('0x4', 'K#8F'), 115 | 'FMlxQ': 'ert', 116 | 'hGAfq': function _0x44b0aa(_0x594a9b, _0x2e131a) { 117 | return _0x594a9b !== _0x2e131a; 118 | }, 119 | 'JiURl': _0x19b2('0x5', '@XmJ'), 120 | 'dXSux': function _0x10a1df(_0x4abdd2, _0x37e16a) { 121 | return _0x4abdd2 === _0x37e16a; 122 | }, 123 | 'KCOFa': 'sojson.v5', 124 | 'UGPZv': '版本号,js会定期弹窗,还请支持我们的工作', 125 | 'bIAlV': _0x19b2('0x6', 'jVw4') 126 | }; 127 | _0x48e246 = 'al'; 128 | try { 129 | if (_0x377c2a['HvlfW'] === _0x377c2a['HvlfW']) { 130 | _0x48e246 += _0x377c2a[_0x19b2('0x7', 'YKZM')]; 131 | _0x488138 = encode_version; 132 | if (!(_0x377c2a[_0x19b2('0x8', 'jPr(')](typeof _0x488138, _0x377c2a[_0x19b2('0x9', '%F)F')]) && 133 | _0x377c2a[_0x19b2('0xa', 'd6AG')](_0x488138, _0x377c2a[_0x19b2('0xb', 'r[Rm')]))) { 134 | _0x5ae480[_0x48e246]('删除' + _0x377c2a['UGPZv']); 135 | } 136 | } else { 137 | _0x5ae480[_0x48e246]('删除' + _0x377c2a[_0x19b2('0xc', '5ffR')]); 138 | } 139 | } catch (_0x2644b3) { 140 | _0x5ae480[_0x48e246](_0x377c2a[_0x19b2('0xd', 'r[Rm')]); 141 | } 142 | }(window));; 143 | encode_version = 'sojson.v5'; -------------------------------------------------------------------------------- /01/testv5.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const escope = require('escope'); 3 | const esprima = require('esprima'); 4 | const iconv = require('iconv-lite'); 5 | const escodegen = require('escodegen'); 6 | const estraverse = require('estraverse'); 7 | 8 | var encode_version = 'sojson.v5', 9 | xdfes = '', 10 | _0x5c82 = ['TcOKegTCicKaPQlr', '5Ymn6Zmx54qW5p2C5Yy077yRBhfkv6/lrafmnJPlvb/nq6I=', 'wozCncKGF8KJ', 'wpbCjzTCmSo=', 11 | 'ZEPClcKmdA==', 'wrfDtAXCqcOZ', 'YhrDt8OESQ==', 'S3fDpcOTwp8=', 'SxDDucOufg==', 'w4EEasOIZA==', 'OmPDvV/Cthk=', 12 | '56mj6Zae5o2Q6aiF57mKcA1aw40D4oKww6Zu5Yur5a+64oCrP+WSokfigaYuwpTop5nlrKjigbLCksKTSu++suS+puWMsuS+iuebksK6wpHDjuOCkg==', 13 | 'woTCjcOONMKUw6Ml', 'wqrCm8Ke']; 14 | (function (_0x440d7e, _0xc2f8a0) { 15 | var _0x4310cd = function (_0x396142) { 16 | while (--_0x396142) { 17 | _0x440d7e['push'](_0x440d7e['shift']()); 18 | } 19 | }; 20 | _0x4310cd(++_0xc2f8a0); 21 | }(_0x5c82, 0x1f3)); 22 | var _0x19b2 = function (_0x44fe81, _0x3b43b5) { 23 | _0x44fe81 = _0x44fe81 - 0x0; 24 | var _0x368cbf = _0x5c82[_0x44fe81]; 25 | if (_0x19b2['initialized'] === undefined) { 26 | (function () { 27 | var _0x1903a1 = typeof window !== 'undefined' ? window : typeof process === 'object' && typeof require === 28 | 'function' && typeof global === 'object' ? global : this; 29 | var _0x38352b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; 30 | _0x1903a1['atob'] || (_0x1903a1['atob'] = function (_0x41d26d) { 31 | var _0x596d04 = String(_0x41d26d)['replace'](/=+$/, ''); 32 | for (var _0xb98ee1 = 0x0, _0xf8d3de, _0x522faa, _0x355ad4 = 0x0, _0x5aa1cf = ''; _0x522faa = 33 | _0x596d04['charAt'](_0x355ad4++); ~_0x522faa && (_0xf8d3de = _0xb98ee1 % 0x4 ? 34 | _0xf8d3de * 0x40 + _0x522faa : _0x522faa, _0xb98ee1++ % 0x4) ? _0x5aa1cf += 35 | String['fromCharCode'](0xff & _0xf8d3de >> (-0x2 * _0xb98ee1 & 0x6)) : 0x0) { 36 | _0x522faa = _0x38352b['indexOf'](_0x522faa); 37 | } 38 | return _0x5aa1cf; 39 | }); 40 | }()); 41 | var _0x2357e5 = function (_0x52a6e7, _0x2fad1f) { 42 | var _0x53fe41 = [], 43 | _0x4ecd73 = 0x0, 44 | _0x39d043, _0x1bc680 = '', 45 | _0x33c56e = ''; 46 | _0x52a6e7 = atob(_0x52a6e7); 47 | for (var _0x285b9e = 0x0, _0x11459c = _0x52a6e7['length']; _0x285b9e < _0x11459c; _0x285b9e++) { 48 | _0x33c56e += '%' + ('00' + _0x52a6e7['charCodeAt'](_0x285b9e)['toString'](0x10))['slice'](-0x2); 49 | } 50 | _0x52a6e7 = decodeURIComponent(_0x33c56e); 51 | for (var _0x1f667b = 0x0; _0x1f667b < 0x100; _0x1f667b++) { 52 | _0x53fe41[_0x1f667b] = _0x1f667b; 53 | } 54 | for (_0x1f667b = 0x0; _0x1f667b < 0x100; _0x1f667b++) { 55 | _0x4ecd73 = (_0x4ecd73 + _0x53fe41[_0x1f667b] + _0x2fad1f['charCodeAt'](_0x1f667b % _0x2fad1f[ 56 | 'length'])) % 0x100; 57 | _0x39d043 = _0x53fe41[_0x1f667b]; 58 | _0x53fe41[_0x1f667b] = _0x53fe41[_0x4ecd73]; 59 | _0x53fe41[_0x4ecd73] = _0x39d043; 60 | } 61 | _0x1f667b = 0x0; 62 | _0x4ecd73 = 0x0; 63 | for (var _0x5b3c55 = 0x0; _0x5b3c55 < _0x52a6e7['length']; _0x5b3c55++) { 64 | _0x1f667b = (_0x1f667b + 0x1) % 0x100; 65 | _0x4ecd73 = (_0x4ecd73 + _0x53fe41[_0x1f667b]) % 0x100; 66 | _0x39d043 = _0x53fe41[_0x1f667b]; 67 | _0x53fe41[_0x1f667b] = _0x53fe41[_0x4ecd73]; 68 | _0x53fe41[_0x4ecd73] = _0x39d043; 69 | _0x1bc680 += String['fromCharCode'](_0x52a6e7['charCodeAt'](_0x5b3c55) ^ _0x53fe41[(_0x53fe41[ 70 | _0x1f667b] + _0x53fe41[_0x4ecd73]) % 0x100]); 71 | } 72 | return _0x1bc680; 73 | }; 74 | _0x19b2['rc4'] = _0x2357e5; 75 | _0x19b2['data'] = {}; 76 | _0x19b2['initialized'] = !![]; 77 | } 78 | var _0x5b29b2 = _0x19b2['data'][_0x44fe81]; 79 | if (_0x5b29b2 === undefined) { 80 | if (_0x19b2['once'] === undefined) { 81 | _0x19b2['once'] = !![]; 82 | } 83 | _0x368cbf = _0x19b2['rc4'](_0x368cbf, _0x3b43b5); 84 | _0x19b2['data'][_0x44fe81] = _0x368cbf; 85 | } else { 86 | _0x368cbf = _0x5b29b2; 87 | } 88 | return _0x368cbf; 89 | }; 90 | 91 | function Fix(ast) { 92 | ast = estraverse.replace(ast,{ 93 | enter: function (node, parent) { 94 | if (node.type === "CallExpression" && 95 | node.callee.name === "_0x19b2" && 96 | node.arguments.length === 2 97 | ){ 98 | return{ 99 | type: esprima.Syntax.Literal, 100 | value: _0x19b2(node.arguments[0].value,node.arguments[1].value) 101 | } 102 | } 103 | } 104 | }); 105 | ast = estraverse.replace(ast,{ 106 | enter: function (node, parent) { 107 | // 查找目标节点 108 | if (node.type === "VariableDeclaration" && 109 | node.declarations.length === 1 && 110 | node.declarations[0].init.type === "ObjectExpression" && 111 | node.declarations[0].init.properties.length >= 1 112 | ){ 113 | // 将节点赋值 114 | _nodelist = node.declarations[0].init.properties; 115 | // 删除赋值后的节点 116 | parent.body.splice(parent.body.indexOf(node),1) 117 | } 118 | // 替换(值为Literal) 119 | if ( 120 | node.type === "MemberExpression" && 121 | node.property.type === "Literal" 122 | ) { 123 | for (var idx = 0; idx < _nodelist.length; idx++){ 124 | if (node.property.value === _nodelist[idx].key.value) { 125 | if (_nodelist[idx].value.type === "Literal") { 126 | return { 127 | type: esprima.Syntax[_nodelist[idx].value.type], 128 | value: _nodelist[idx].value.value, 129 | } 130 | } 131 | } 132 | } 133 | } 134 | // 替换(值为FunctionExpression) 135 | if (node.type === "CallExpression" && 136 | node.callee.type === "MemberExpression" && 137 | node.callee.property.type === "Literal" 138 | ){ 139 | for (var idx = 0; idx < _nodelist.length; idx++){ 140 | if (node.callee.property.value === _nodelist[idx].key.value) { 141 | if (_nodelist[idx].value.type === "FunctionExpression") { 142 | return { 143 | type: esprima.Syntax.BinaryExpression, 144 | operator: _nodelist[idx].value.body.body[0].argument.operator, 145 | left: node.arguments[0], 146 | right: node.arguments[1], 147 | } 148 | } 149 | } 150 | } 151 | } 152 | } 153 | }); 154 | 155 | return ast 156 | } 157 | 158 | module.exports = { 159 | Fix 160 | } -------------------------------------------------------------------------------- /tools/utils_object_member.js: -------------------------------------------------------------------------------- 1 | /**************************************************************************************************************** 2 | 3 | 本脚本是处理对象的取值、赋值情况 4 | 5 | 注意:可能很多不同的类型,如果遇到了新的,可以自己扩展进来 6 | (对象属性的值是函数的时候,对于实参全部是字面量的函数调用,且运行结果唯一时,才可以进行替换) 7 | 8 | 9 | before: 10 | 11 | function f() { 12 | var a = { 13 | 'info': 123, 14 | 'bc': 456, 15 | 'dd': function test(abc, abd) { 16 | // return typeof abc + "---" + abd; 17 | return abc + abd; 18 | }, 19 | age: 10, 20 | addr: "这是哪里", 21 | nb: false 22 | }; 23 | var abc = a['info']; 24 | abc = a.info; 25 | var abd = a.bc; 26 | var dd = a.dd(12,23) + a.dd(11,22); 27 | var nb = a.nb; 28 | 29 | } 30 | 31 | 32 | ------------------------------------------------------------------------------------------ 33 | affter: 34 | 35 | function f() { 36 | var a = { 37 | 'info': 123, 38 | 'bc': 456, 39 | 'dd': function test(abc, abd) { 40 | // return typeof abc + "---" + abd; 41 | return abc + abd; 42 | }, 43 | age: 10, 44 | addr: "这是哪里", 45 | nb: false 46 | }; 47 | var abc = 123; 48 | abc = 123; 49 | var abd = 456; 50 | var dd = 35 + 33; 51 | var nb = false; 52 | 53 | } 54 | 55 | ***************************************************************************************************************/ 56 | 57 | const parser = require("@babel/parser") 58 | const traverse = require("@babel/traverse").default 59 | const generator = require("@babel/generator").default 60 | const types = require("@babel/types") 61 | 62 | 63 | 64 | 65 | const visitor_obj = { 66 | VariableDeclarator: function (path) { 67 | var node = path.node; 68 | 69 | if (!types.isObjectExpression(node.init)) { 70 | //如果不是对象表达式,不用处理,直接跳过 71 | return; 72 | } 73 | 74 | let obj_name = node.id.name; 75 | 76 | 77 | //=========还原对象的赋值=========================================================== 78 | //1、首先查看当前节点下,是否有赋值的情况,有的话,直接将 obj_name.info = 123 替换为:往 obj_name 的属性list里面增加一个ObjectProperty 79 | let all_next_siblings = path.parentPath.getAllNextSiblings(); 80 | all_next_siblings.forEach(next_sibling => { 81 | if (next_sibling.type !== "ExpressionStatement") { 82 | return; 83 | } 84 | 85 | //获取表达式 86 | let expression = next_sibling.get("expression"); 87 | if (expression.type !== "AssignmentExpression") { 88 | return; 89 | } 90 | 91 | let { left, operator, right } = expression.node; 92 | if (left.type === "MemberExpression" && left.object.name === obj_name && operator === "=") { 93 | //开始往 obj_name 的属性list里面增加一个ObjectProperty 94 | node.init.properties.push(types.ObjectProperty(left.property, right)); 95 | //然后移除当前已经处理的节点,一定记得需要检验一下,最后的代码,是否符合 96 | next_sibling.remove(); 97 | } 98 | }) 99 | //==================================================================== 100 | 101 | 102 | //=========还原从对象取值=========================================================== 103 | //2、对对象名为 obj_name 的属性进行遍历,从这个节点的父节点开始往下找,如果找到了有相关应用的话,那么需要还原回去 104 | var objPropertiesList = node.init.properties; 105 | if (objPropertiesList.length === 0) return; 106 | 107 | objPropertiesList.forEach(prop => { 108 | //判断是否为 NumericLiteral、StringLiteral、简单的 FunctionExpression (直接返回的) 109 | var obj_key_name = prop.key.value || prop.key.name; 110 | var obj_key_value = prop.value.value || prop.value.name; 111 | 112 | var fnPath = path.getFunctionParent(); 113 | 114 | //存在情况 115 | //如 var abc = a.info 或 var abc = a['info'] 116 | //同时还得再细分 CallExpression,如 var res = a['dd'](12, 23) 或者 res = a['dd'](12, 23) 117 | //=========还原简单的字面量=========================================================== 118 | if (types.isLiteral(prop.value)){ 119 | fnPath.traverse( 120 | { 121 | //var abc = a.info、var abc = a['info']、abc = a.info、abc = a['info'] 122 | MemberExpression: function (_path) { 123 | var _node = _path.node 124 | 125 | if (_node.object.name === obj_name 126 | && (_node.property.value === obj_key_name || _node.property.name === obj_key_name) 127 | // && _path.parent.type !== "CallExpression" 128 | ) { 129 | _path.replaceWith(prop.value); 130 | } 131 | 132 | } 133 | } 134 | ) 135 | } 136 | //==================================================================== 137 | 138 | 139 | //=========还原简单的函数调用=========================================================== 140 | if (types.isFunctionExpression(prop.value) && types.isReturnStatement(prop.value.body.body[0])) { 141 | fnPath.traverse( 142 | { 143 | CallExpression: function (_path) { 144 | var _node = _path.node 145 | var _callee = _node.callee 146 | 147 | var _code = generator(prop.value.body).code 148 | //返回值不唯一不做处理 149 | if (_code.indexOf("try") !== -1 || _code.indexOf('random') !== -1 || _code.indexOf('Date') !== -1) { 150 | return; 151 | } 152 | 153 | var params = []; 154 | if (prop.value.params.length === 0) return; 155 | for (let i in prop.value.params) { 156 | params.push(prop.value.params[i].name); 157 | } 158 | 159 | var params_str = params.join(","); 160 | var call_fun = new Function(params_str, _code); 161 | var args = []; 162 | var tmp = _node.arguments 163 | try { 164 | for (let i in tmp) { 165 | if (tmp[i].value === undefined) return; 166 | args.push(tmp[i].value); 167 | } 168 | } catch (e) { 169 | return; 170 | } 171 | 172 | if(types.isMemberExpression(_callee) && _callee.object.name === obj_name && (_callee.property.value === obj_key_name || _callee.property.name === obj_key_name)) { 173 | try { 174 | let value = call_fun.apply(null, args); 175 | if (value !== undefined){ 176 | _path.replaceWith(types.valueToNode(value)); 177 | } 178 | } catch (e) { 179 | } 180 | 181 | } 182 | 183 | } 184 | } 185 | ) 186 | 187 | 188 | } 189 | 190 | 191 | }) 192 | 193 | path.remove() 194 | 195 | } 196 | } 197 | 198 | 199 | /** 200 | * 处理匿名函数赋值的情况 201 | * 202 | * (function (agr1, arg2){ arg1["info"]=123;arg2["info"]=123;})(a,b); -> (function (){ a["info"]=123;b["info"]=123;})(); 203 | * */ 204 | const vistor_anonymous_function = { 205 | CallExpression: function (path) { 206 | var node = path.node; 207 | var arguments = node.arguments; 208 | 209 | //无参数名的不用处理 210 | if (arguments === null || arguments === undefined || arguments.length === 0) return; 211 | 212 | var _callee = node.callee; 213 | if (_callee.type !== "FunctionExpression") return; 214 | var params = _callee.params; 215 | var out_body = _callee.body; 216 | var in_body = out_body.body; 217 | 218 | if (params === undefined || params.length === 0) return; 219 | if (arguments.length !== params.length || out_body.type !== "BlockStatement") return; 220 | 221 | for (let i in arguments){ 222 | var arg_out_name = arguments[i].name; 223 | var arg_in_name = params[i].name; 224 | 225 | for (let j in in_body){ 226 | var expression = in_body[j]; 227 | if (expression.type !== "ExpressionStatement") continue; 228 | if (expression.expression.type !== "AssignmentExpression") continue; 229 | if (expression.expression.left.type !== "MemberExpression") continue; 230 | if (expression.expression.left.object.name !== arg_in_name) continue; 231 | 232 | expression.expression.left.object.name = arg_out_name; 233 | 234 | } 235 | } 236 | 237 | node.callee.params = []; 238 | node.arguments = []; 239 | } 240 | } 241 | 242 | 243 | /** 244 | * 处理对象赋值/取值的情况 245 | * */ 246 | function handle_obj_member_value(ast) { 247 | traverse(ast, visitor_obj); 248 | return ast 249 | } 250 | 251 | 252 | function handle_anonymous_function(ast) { 253 | traverse(ast, vistor_anonymous_function); 254 | return ast; 255 | } 256 | 257 | 258 | 259 | 260 | 261 | module.exports = { 262 | "handle_obj_member_value": handle_obj_member_value, 263 | "handle_anonymous_function": handle_anonymous_function, 264 | } 265 | -------------------------------------------------------------------------------- /00/js_render.js: -------------------------------------------------------------------------------- 1 | var esprima = require('esprima'); 2 | var estraverse = require('estraverse'); 3 | var escodegen = require('escodegen'); 4 | var iconv = require('iconv-lite'); 5 | const fs = require("fs"); 6 | var escope = require('escope'); 7 | 8 | var content = fs.readFileSync('tdCapcha.js', {encoding: 'binary'}); 9 | var buf = new Buffer.from(content, 'binary'); 10 | var code = iconv.decode(buf, 'utf-8'); 11 | 12 | QOoQQQ = function QOoQQQ(oQ0o00) { 13 | var OoQoOo = ''; 14 | for (var O0QOO0 = 0; O0QOO0 < oQ0o00.length; O0QOO0++) { 15 | var O00QQO = oQ0o00.charCodeAt(O0QOO0); 16 | if (O00QQO >= 97 && O00QQO <= 122) { 17 | if (O00QQO == 97) { 18 | O00QQO = 123; 19 | } 20 | ;OoQoOo += String.fromCharCode(O00QQO - 1); 21 | } else { 22 | OoQoOo += oQ0o00[O0QOO0]; 23 | } 24 | } 25 | return OoQoOo; 26 | } 27 | 28 | var ast = esprima.parse(code); 29 | var scopeManager = escope.analyze(ast); 30 | var currentScope = scopeManager.acquire(ast); 31 | ast = estraverse.replace(ast, { 32 | enter: function (node) { 33 | // Replace it with replaced. 34 | if (node.type == 'CallExpression' && node.callee.type == 'Identifier' && node.callee.name == "QOoQQQ" && node.arguments.length == 1 && node.arguments[0].type == 'Literal') { 35 | var val = QOoQQQ(node.arguments[0].value); 36 | return { 37 | type: esprima.Syntax.Literal, 38 | value: val, 39 | raw: val 40 | } 41 | } 42 | } 43 | }); 44 | 45 | ast = estraverse.replace(ast, { 46 | enter: function (node) { 47 | // Replace it with replaced. 48 | if (node.type == 'SwitchCase' && node.test && node.test.type == "BinaryExpression") { 49 | var val = eval(escodegen.generate(node.test)); 50 | return { 51 | type: esprima.Syntax.SwitchCase, 52 | test: { 53 | type: esprima.Syntax.Literal, 54 | value: val, 55 | raw: val 56 | }, 57 | consequent: node.consequent 58 | } 59 | } 60 | } 61 | }); 62 | 63 | // 反控制流平坦化 64 | ast = estraverse.replace(ast, { 65 | enter: function (node) { 66 | // 获取作用域 67 | if (/Function/.test(node.type)) { 68 | currentScope = scopeManager.acquire(node); // get current function scope 69 | } 70 | var keys = [] 71 | for (var key of currentScope.set.keys()) { 72 | keys.push(key) 73 | } 74 | var casename = null; 75 | if (node.type == 'WhileStatement' && node.test && node.test.type == "Identifier") { 76 | casename = node.test.name; 77 | if (node.body && node.body.type == "BlockStatement" && casename != null) { 78 | if (node.body.body && node.body.body.length > 0) { 79 | for (var idx = 0; idx < node.body.body.length; idx++) { 80 | if (node.body.body[idx].type == "SwitchStatement") { 81 | if (node.body.body[idx].discriminant && node.body.body[idx].discriminant.type == "Identifier" && node.body.body[idx].discriminant.name && node.body.body[idx].discriminant.name == casename) { 82 | // while(a){ 83 | // switch(a){ 84 | // case ... 85 | // } 86 | // } 87 | // case_start_value = eval() 88 | var values = {} 89 | var igorne_name = ['arguments'] 90 | for (var value of currentScope.variables) { 91 | 92 | if (igorne_name.indexOf(value.name) < 0) { 93 | if (value.defs && value.defs.length == 1 && value.defs[0].type == "Variable") { 94 | if (value.defs[0].name && value.defs[0].name.type && value.defs[0].name.type == "Identifier") { 95 | if (value.defs[0].node && value.defs[0].node.type && value.defs[0].node.type == "VariableDeclarator") { 96 | if (value.defs[0].node.init && value.defs[0].node.init.type && value.defs[0].node.init.type == "Literal") { 97 | values[value.name] = value.defs[0].node.init.value 98 | } 99 | } 100 | } 101 | } 102 | } 103 | } 104 | if (keys.indexOf(casename)) { 105 | var case_start_value = values[casename] 106 | var case_list = {} 107 | var flag = true; 108 | for (var i = 0; i < node.body.body[idx].cases.length; i++) { 109 | if (node.body.body[idx].cases[i].test && node.body.body[idx].cases[i].test.type == "Literal") { 110 | case_list[node.body.body[idx].cases[i].test.value] = node.body.body[idx].cases[i].consequent[0] 111 | } else { 112 | flag = false; 113 | } 114 | } 115 | if (flag) { 116 | var start_case = case_list[case_start_value] 117 | var end_case = null; 118 | var end_case_value = null; 119 | var isreturn = false 120 | for (var ii in case_list) { 121 | var case_example = case_list[ii] 122 | if (case_example.body && case_example.body.length > 0 && case_example.body.pop().type == "BreakStatement") { 123 | if (case_example.body[case_example.body.length - 1].type == "ExpressionStatement") { 124 | if (case_example.body[case_example.body.length - 1].expression && case_example.body[case_example.body.length - 1].expression.type == "AssignmentExpression" && case_example.body[case_example.body.length - 1].expression.right.type != "Literal") { 125 | end_case = case_example.body; 126 | end_case_value = parseInt(ii) 127 | } 128 | } else { 129 | flag = false; 130 | } 131 | } else { 132 | flag = false; 133 | } 134 | } 135 | if (end_case_value == null) { 136 | for (var ii in case_list) { 137 | var case_example = case_list[ii] 138 | if (case_example.body && case_example.body.length > 0 && case_example.body[case_example.body.length - 1].type == "ExpressionStatement") { 139 | if (case_example.body[case_example.body.length - 2].type == "ReturnStatement") { 140 | end_case = case_example.body; 141 | end_case_value = parseInt(ii) 142 | isreturn = true 143 | flag = true 144 | } else { 145 | flag = false; 146 | } 147 | } else { 148 | flag = false; 149 | } 150 | } 151 | } 152 | if (flag) { 153 | var struct_body = { 154 | type: esprima.Syntax.WhileStatement, 155 | test: { 156 | type: esprima.Syntax.Identifier, 157 | name: casename 158 | }, 159 | body: { 160 | type: esprima.Syntax.BlockStatement, 161 | body: [] 162 | } 163 | } 164 | var body = [] 165 | var body_end = { 166 | type: esprima.Syntax.IfStatement, 167 | test: { 168 | type: esprima.Syntax.Identifier, 169 | name: casename 170 | }, 171 | consequent: { 172 | type: esprima.Syntax.BlockStatement, 173 | 174 | }, 175 | alternate: { 176 | type: esprima.Syntax.BlockStatement, 177 | body: [ 178 | { 179 | type: esprima.Syntax.BreakStatement, 180 | label: null 181 | } 182 | ] 183 | } 184 | } 185 | var case_id = case_start_value 186 | while (flag) { 187 | var case_now = case_list[case_id] 188 | if (case_id == case_start_value) { 189 | var b = { 190 | type: esprima.Syntax.IfStatement, 191 | test: { 192 | type: esprima.Syntax.BinaryExpression, 193 | operator: "==", 194 | left: { 195 | type: esprima.Syntax.Identifier, 196 | name: casename 197 | }, 198 | right: { 199 | type: esprima.Syntax.Literal, 200 | value: case_start_value, 201 | raw: case_start_value 202 | } 203 | }, 204 | consequent: { 205 | type: esprima.Syntax.BlockStatement, 206 | body: [] 207 | } 208 | } 209 | for (var iii = 0; iii < case_now.body.length; iii++) { 210 | b.consequent.body.push(case_now.body[iii]) 211 | } 212 | body.push(b) 213 | } else if (case_id == end_case_value && isreturn == false) { 214 | if (body_end.consequent.body && body_end.consequent.body.length >= 0) { 215 | body.push(body_end) 216 | break 217 | } else { 218 | for (var iii = 0; iii < case_now.body.length; iii++) { 219 | body.push(case_now.body[iii]) 220 | } 221 | case_id = case_now.body[case_now.body.length - 1].expression.right.consequent.value 222 | body_end.consequent.body = [] 223 | continue 224 | } 225 | } else { 226 | if (body_end.consequent.body && body_end.consequent.body.length >= 0) { 227 | for (var iii = 0; iii < case_now.body.length; iii++) { 228 | body_end.consequent.body.push(case_now.body[iii]) 229 | } 230 | } else { 231 | for (var iii = 0; iii < case_now.body.length; iii++) { 232 | body.push(case_now.body[iii]) 233 | } 234 | } 235 | } 236 | 237 | if (isreturn) { 238 | debugger 239 | } 240 | if (case_id == end_case_value && isreturn) { 241 | debugger 242 | break 243 | } 244 | case_id = case_now.body[case_now.body.length - 1].expression.right.value 245 | 246 | } 247 | struct_body.body.body = body; 248 | return struct_body 249 | } 250 | } 251 | } 252 | } 253 | } 254 | } 255 | } 256 | } 257 | } 258 | }, 259 | leave: function (node) { 260 | if (/Function/.test(node.type)) { 261 | currentScope = currentScope.upper; // set to parent scope 262 | } 263 | } 264 | }); 265 | 266 | code = escodegen.generate(ast) 267 | 268 | fs.writeFile('output.js', code, {flag: 'w', encoding: 'utf-8', mode: '0666'}, function (err) { 269 | if (err) { 270 | console.log("文件写入失败") 271 | } else { 272 | console.log("文件写入成功"); 273 | } 274 | }); 275 | 276 | 277 | -------------------------------------------------------------------------------- /dingxiang/greenseer.js: -------------------------------------------------------------------------------- 1 | /*! ctu-greenseer 2020-07-02 14:38:47 */ 2 | !function (t, r, n, e, o, i, a) { 3 | !function (u) { 4 | var c = "87", 5 | f = {}; 6 | 7 | function s(t) { 8 | if (f[t]) return f[t]["exports"]; 9 | var r = f[t] = { 10 | "i": t, 11 | "l": false, 12 | "exports": {} 13 | }; 14 | return u[t]["call"](r["exports"], r, r["exports"], s), r["l"] = true, r["exports"]; 15 | } 16 | 17 | function h(t) { 18 | if (!t) return ""; 19 | 20 | for (var r = "", n = 40656, e = 0; e < t.length; e++) { 21 | var o = t.charCodeAt(e), 22 | i = o ^ n; 23 | n = o, r += String.fromCharCode(i); 24 | } 25 | 26 | return r; 27 | } 28 | 29 | function d(t) { 30 | if (!t) return ""; 31 | 32 | for (var r = "", n = "V587", e = 18011, o = 0; o < t.length; o++) { 33 | var i = t.charCodeAt(o); 34 | e = (e + 1) % n.length, i ^= n.charCodeAt(e), r += String.fromCharCode(i); 35 | } 36 | 37 | return r; 38 | } 39 | 40 | function v(t) { 41 | return t.split("").reverse().join(""); 42 | } 43 | 44 | s["m"] = u, s["c"] = f, s["d"] = function (t, r, n) { 45 | s["o"](t, r) || Object["defineProperty"](t, r, { 46 | "configurable": false, 47 | "enumerable": true, 48 | "get": n 49 | }); 50 | }, s["n"] = function (t) { 51 | var r = t && t["__esModule"] ? function () { 52 | return t["default"]; 53 | } : function () { 54 | return t; 55 | }; 56 | return s["d"](r, "a", r), r; 57 | }, s["o"] = function (t, r) { 58 | return Object["prototype"]["hasOwnProperty"]["call"](t, r); 59 | }, s["p"] = "", s(s["s"] = 4); 60 | }([function (u, c, f) { 61 | "t"; 62 | var s = "3MLR", 63 | h = "isTouchDevi", 64 | d = "ce", 65 | v = "i", 66 | g = "a", 67 | l = "s", 68 | p = "s", 69 | C = "i", 70 | m = "g", 71 | A = "Fun", 72 | w = ">TKx![", 73 | b = "e", 74 | E = "n", 75 | S = "g", 76 | y = "t", 77 | x = "co", 78 | _ = "fl", 79 | R = "r", 80 | T = "V", 81 | L = "de", 82 | M = "堻७ॊ৴াहভ৙ঝ৑"; 83 | c["__esModule"] = true, c["now"] = c["isArray"] = c["isFunction"] = c["isString"] = undefined, c["each"] = j, c["extend"] = function (t) { 84 | for (var r, e, i = []["slice"]["call"](arguments), a = i["length"], u = 1; u < a; u++) for (e in r = i[u]) r["hasOwnProperty"](e) && (t[e] = r[e]); 85 | 86 | return t; 87 | }, c["filter"] = function (t, r, e) { 88 | for (var o, i = "h", a = "ll", u = [], c = 0, f = t["length"]; c < f; c++) o = t[c], r["call"](e, o, c, t) && u["push"](o); 89 | 90 | return u; 91 | }, c["map"] = function (t, r, n) { 92 | for (var e = [], o = 0, i = t["length"]; o < i; o++) e["push"](r["call"](n, t[o], o, t)); 93 | 94 | return e; 95 | }, c["some"] = function (t, r, n) { 96 | for (var e = 0, o = t["length"]; e < o; e++) if (r["call"](n, t[e], e, t)) return true; 97 | 98 | return false; 99 | }, c["flatten"] = function (t) { 100 | var r = []; 101 | return j(t, function (t) { 102 | void 0 !== t && (P(t) ? r = r["concat"](t) : r["push"](t)); 103 | }), r; 104 | }, c["random"] = function (t, r) { 105 | var n = "oo"; 106 | return t + Math["floor"](Math["random"]() * (r - t + 1)); 107 | }, c["toCodeArray"] = function (t) { 108 | for (var r = [], n = (t += "")["length"], e = 0; e < n; e++) r["push"](t["charCodeAt"](e)); 109 | 110 | return r; 111 | }, c["toStr"] = function (t) { 112 | return String["fromCharCode"]["apply"](String, t); 113 | }, c["keys"] = function (t) { 114 | var r = []; 115 | return j(t, function (t, n) { 116 | r["push"](n); 117 | }), r; 118 | }, c["isTouchDevice"] = function () { 119 | return "ontouchstart" in document["documentElement"]; 120 | }, c["propDefined"] = function (t, n) { 121 | var e = []; 122 | Object["getOwnPropertyDescriptor"] && e["push"](Object["getOwnPropertyDescriptor"](t, n)); 123 | Object["getOwnPropertyDescriptors"] && e["push"](!!Object["getOwnPropertyDescriptors"](t)[n]); 124 | 125 | for (var o = 0; o < e["length"]; o++) if (e[o]) return true; 126 | 127 | return false; 128 | }, c["isHeadless"] = function () { 129 | if (navigator["webdriver"]) return true; 130 | 131 | try { 132 | var t = document["createElement"]("iframe"); 133 | t["sandbox"] = "allow-same-origin", t["style"]["display"] = "none", document["body"]["appendChild"](t); 134 | var n = !!t["contentWindow"]["navigator"]["webdriver"]; 135 | return document["body"]["removeChild"](t), n; 136 | } catch (o) { 137 | return false; 138 | } 139 | }; 140 | f(1); 141 | 142 | function V(t) { 143 | return function (r) { 144 | return {}["toString"]["call"](r) == "[object " + t + "]"; 145 | }; 146 | } 147 | 148 | c["isString"] = V("String"), c["isFunction"] = V("Function"); 149 | var P = c["isArray"] = Array["isArray"] || V("Array"); 150 | 151 | function j(t, n, e) { 152 | if (t) { 153 | var o = 0, 154 | i = t["length"]; 155 | if (i === +i) for (; o < i && false !== n["call"](e, t[o], o, t); o++);else for (o in t) if (t["hasOwnProperty"](o) && false === n["call"](e, t[o], o, t)) break; 156 | } 157 | } 158 | 159 | function D(t) { 160 | return t.split("").reverse().join(""); 161 | } 162 | 163 | function H(r) { 164 | var n = "8", 165 | a = "7"; 166 | if (!r) return ""; 167 | 168 | for (var u = "", c = "V587", f = 18011, s = 0; s < r.length; s++) { 169 | var h = r.charCodeAt(s); 170 | f = (f + 1) % c.length, h ^= c.charCodeAt(f), u += String.fromCharCode(h); 171 | } 172 | 173 | return u; 174 | } 175 | 176 | c["now"] = Date["now"] || function () { 177 | return +new Date(); 178 | }; 179 | 180 | function I(t) { 181 | if (!t) return ""; 182 | 183 | for (var r = "", n = 88154, o = 0; o < t.length; o++) { 184 | var i = t.charCodeAt(o) ^ n; 185 | n = n * o % 256 + 2333, r += String.fromCharCode(i); 186 | } 187 | 188 | return r; 189 | } 190 | 191 | function X(t) { 192 | if (!t) return ""; 193 | 194 | for (var r = "", n = 40656, e = 0; e < t.length; e++) { 195 | var o = t.charCodeAt(e), 196 | i = o ^ n; 197 | n = o, r += String.fromCharCode(i); 198 | } 199 | 200 | return r; 201 | } 202 | }, function (u, c, f) { 203 | var s = "_val", 204 | h = "ue", 205 | d = "$PKX:C", 206 | v = "]", 207 | g = "_", 208 | l = "Y", 209 | p = "g", 210 | C = "ॐ", 211 | m = "৴", 212 | A = "appl", 213 | w = "y"; 214 | 215 | function b(t, r, i) { 216 | return function (a) { 217 | if ((0, E["isFunction"])(r)) try { 218 | var u = r(a); 219 | !function o(t, r) { 220 | if (t === r) return void t["reject"](new TypeError("A promise cannot be resolved with itself.")); 221 | if (i = r, i && (0, E["isFunction"])(i["then"])) try { 222 | r["then"](function (r) { 223 | o(t, r); 224 | }, function (r) { 225 | t["reject"](r); 226 | }); 227 | } catch (a) { 228 | t["reject"](a); 229 | } else t["resolve"](r); 230 | var i; 231 | }(t, u); 232 | } catch (c) { 233 | t["reject"](c); 234 | } else t[i](a); 235 | }; 236 | } 237 | 238 | c["__esModule"] = true, c["Promise"] = R; 239 | var E = f(0), 240 | S = 0, 241 | y = 2; 242 | 243 | function x(r) { 244 | if (!r) return ""; 245 | 246 | for (var n = "", e = 40656, o = 0; o < r.length; o++) { 247 | var i = r.charCodeAt(o), 248 | a = i ^ e; 249 | e = i, n += String.fromCharCode(a); 250 | } 251 | 252 | return n; 253 | } 254 | 255 | function _(t, r) { 256 | var e = []["slice"], 257 | o = e["call"](arguments, 2), 258 | u = function () {}, 259 | c = function () { 260 | return t["apply"](this instanceof u ? this : r, o["concat"](e["call"](arguments))); 261 | }; 262 | 263 | return u["prototype"] = t["prototype"], c["prototype"] = new u(), c; 264 | } 265 | 266 | function R(r) { 267 | if (!(this instanceof R)) return new R(r); 268 | this["_state"] = 0, this["_onFulfilled"] = [], this["_onRejected"] = [], this["_value"] = null, this["_reason"] = t[8], (0, E["isFunction"])(r) && r(_(this["resolve"], this), _(this["reject"], this)); 269 | } 270 | 271 | function T(e) { 272 | if (!e) return ""; 273 | 274 | for (var o = "", a = 18011, u = 0; u < e.length; u++) { 275 | var c = e.charCodeAt(u); 276 | a = (a + 1) % "V587".length, c ^= "V587".charCodeAt(a), o += String.fromCharCode(c); 277 | } 278 | 279 | return o; 280 | } 281 | 282 | function L(t) { 283 | if (!t) return ""; 284 | 285 | for (var r = "", n = 88154, e = 0; e < t.length; e++) { 286 | var o = t.charCodeAt(e) ^ n; 287 | n = n * e % 256 + 2333, r += String.fromCharCode(o); 288 | } 289 | 290 | return r; 291 | } 292 | 293 | function M(r) { 294 | return r.split("").reverse().join(""); 295 | } 296 | 297 | R["prototype"] = { 298 | "constructor": R, 299 | "then": function (t, n) { 300 | var e = new R(); 301 | return this["_onFulfilled"]["push"](b(e, t, "resolve")), this["_onRejected"]["push"](b(e, n, "reject")), this["flush"](), e; 302 | }, 303 | "flush": function () { 304 | var n = this["_state"]; 305 | 306 | if (n !== 0) { 307 | var o = 1 === n ? this["_onFulfilled"]["slice"]() : this["_onRejected"]["slice"](), 308 | a = 1 === n ? this["_value"] : this["_reason"]; 309 | setTimeout(function () { 310 | (0, E["each"])(o, function (t) { 311 | try { 312 | t(a); 313 | } catch (r) {} 314 | }); 315 | }, 0), this["_onFulfilled"] = [], this["_onRejected"] = []; 316 | } 317 | }, 318 | "resolve": function (t) { 319 | this["_state"] === 0 && (this["_state"] = 1, this["_value"] = t, this["flush"]()); 320 | }, 321 | "reject": function (t) { 322 | this["_state"] === 0 && (this["_state"] = 2, this["_reason"] = t, this["flush"]()); 323 | }, 324 | "isPending": function () { 325 | var r = "t", 326 | n = "t"; 327 | return this["_state"] === 0; 328 | }, 329 | "isFulfilled": function () { 330 | return 1 === this["_state"]; 331 | }, 332 | "isRejected": function () { 333 | return this["_state"] === 2; 334 | }, 335 | "catch": function (t) { 336 | return this["then"](null, t); 337 | }, 338 | "always": function (t) { 339 | return this["then"](t, t); 340 | } 341 | }, R["defer"] = function () { 342 | var t = "se", 343 | r = "ct", 344 | n = {}; 345 | return n["promise"] = new R(function (t, e) { 346 | n["resolve"] = t, n["reject"] = e; 347 | }), n; 348 | }, R["race"] = function (t) { 349 | var r = "e", 350 | n = R["defer"](); 351 | t["length"]; 352 | return (0, E["each"])(t, function (t) { 353 | t["then"](function (t) { 354 | n["resolve"](t); 355 | }, function (t) { 356 | n["reject"](t); 357 | }); 358 | }), n["promise"]; 359 | }, R["all"] = function (t) { 360 | var r = R["defer"](), 361 | n = t["length"], 362 | e = []; 363 | return (0, E["each"])(t, function (t, o) { 364 | t["then"](function (t) { 365 | e[o] = t, 0 === --n && r["resolve"](e); 366 | }, function (t) { 367 | r["reject"](t); 368 | }); 369 | }), r["promise"]; 370 | }, R["resolve"] = function (t) { 371 | return new R(function (r) { 372 | r(t); 373 | }); 374 | }, R["reject"] = function (t) { 375 | return new R(function (r, n) { 376 | n(t); 377 | }); 378 | }; 379 | }, function (u, c, f) { 380 | var s = "堯८य़঱ণऩ", 381 | h = "জ৘গ৉", 382 | d = "1PLg7R]", 383 | v = "ault", 384 | g = "pr", 385 | l = "ev", 386 | p = "ef", 387 | C = "yd", 388 | m = "%VJX", 389 | A = "entRect", 390 | w = "u", 391 | b = "s", 392 | E = "e", 393 | S = "g", 394 | y = "e", 395 | x = "n", 396 | _ = "t", 397 | R = "pl", 398 | T = "em", 399 | L = "en", 400 | M = "ta", 401 | V = "ti", 402 | P = "on", 403 | j = "t", 404 | D = "t", 405 | H = "o", 406 | I = "de"; 407 | 408 | function X(t) { 409 | return t || window["event"]; 410 | } 411 | 412 | function F(t) { 413 | return t.split("").reverse().join(""); 414 | } 415 | 416 | function O(t) { 417 | return t["target"] || t["srcElement"]; 418 | } 419 | 420 | function B(t) { 421 | var r = "innerWid", 422 | e = navigator["userAgent"]; 423 | if (!new RegExp("safari", "i")["test"](e) || new RegExp("(mobile|chrome)", "i")["test"](e)) return t; 424 | var o = Math["round"](document["documentElement"]["clientWidth"] / window["innerWidth"] * 100) / 100; 425 | return 1 === o ? t : Math["round"](t * o); 426 | } 427 | 428 | function K(t) { 429 | if (!t) return ""; 430 | 431 | for (var n = "", e = 88154, o = 0; o < t.length; o++) { 432 | var i = t.charCodeAt(o) ^ e; 433 | e = e * o % 256 + 2333, n += String.fromCharCode(i); 434 | } 435 | 436 | return n; 437 | } 438 | 439 | function Y(t) { 440 | if (!t) return ""; 441 | 442 | for (var n = "", e = 18011, i = 0; i < t.length; i++) { 443 | var a = t.charCodeAt(i); 444 | e = (e + 1) % "V587".length, a ^= "V587".charCodeAt(e), n += String.fromCharCode(a); 445 | } 446 | 447 | return n; 448 | } 449 | 450 | function W(t) { 451 | if (!t) return ""; 452 | 453 | for (var r = "", i = 40656, a = 0; a < t.length; a++) { 454 | var u = t.charCodeAt(a), 455 | c = u ^ i; 456 | i = u, r += String.fromCharCode(c); 457 | } 458 | 459 | return r; 460 | } 461 | 462 | "use strict", c["__esModule"] = true, c["addHandler"] = function (r, e, o) { 463 | r["addEventListener"] ? r["addEventListener"](e, o, true) : r["attachEvent"] && r["attachEvent"]("on" + e, o); 464 | }, c["getEvent"] = X, c["getTarget"] = O, c["preventDefault"] = function (t) { 465 | t["preventDefault"] ? t["preventDefault"]() : t["returnValue"] = false; 466 | }, c["getPageX"] = function (t) { 467 | var r = "ob", 468 | e = t["pageX"]; 469 | e === undefined && (e = t["clientX"] + (document["body"]["scrollLeft"] || document["documentElement"]["scrollLeft"])); 470 | return parseInt(e, 10); 471 | }, c["getPageY"] = function (t) { 472 | var n = t["pageY"]; 473 | n === undefined && (n = t["clientY"] + (document["body"]["scrollTop"] || document["documentElement"]["scrollTop"])); 474 | return parseInt(n, 10); 475 | }, c["getOffsetX"] = function (t) { 476 | var r = t["offsetX"]; 477 | r === undefined && (t = X(t), r = t["clientX"] - Math["ceil"](O(t)["getBoundingClientRect"]()["left"])); 478 | return B(r); 479 | }, c["getOffsetY"] = function (t) { 480 | var r = "getBoun", 481 | o = "dingCli", 482 | i = t["offsetY"]; 483 | i === undefined && (t = X(t), i = t["clientY"] - Math["ceil"](O(t)["getBoundingClientRect"]()["top"])); 484 | return B(i); 485 | }, c["getButton"] = function (t) { 486 | var n = "b", 487 | a = "u"; 488 | if (document["implementation"]["hasFeature"]("MouseEvents", "2.0")) return t["button"]; 489 | if (new RegExp("^(0|1|3|5|7)$")["test"](t["button"])) return 0; 490 | if (new RegExp("^(2|6)$")["test"](t["button"])) return 2; 491 | if (4 === t["button"]) return 1; 492 | }, c["getCharCode"] = function (t) { 493 | return t["charCode"] || t["keyCode"] || 0; 494 | }; 495 | }, function (u, c, f) { 496 | var s = "m", 497 | h = "s", 498 | d = "p", 499 | v = "w", 500 | g = "n", 501 | l = "g", 502 | p = "t", 503 | C = "h"; 504 | 505 | function m(t) { 506 | return t.split("").reverse().join(""); 507 | } 508 | 509 | function A(t, r, n) { 510 | return t >> r & Math["pow"](2, 8 * (void 0 === n ? 1 : n)) - 1; 511 | } 512 | 513 | function w(t) { 514 | if (!t) return ""; 515 | 516 | for (var r = "", n = 40656, o = 0; o < t.length; o++) { 517 | var i = t.charCodeAt(o), 518 | a = i ^ n; 519 | n = i, r += String.fromCharCode(a); 520 | } 521 | 522 | return r; 523 | } 524 | 525 | function b(t) { 526 | return E(A(t, 16, 2))["concat"](E(A(t, 0, 2))); 527 | } 528 | 529 | function E(t) { 530 | return [A(t, 8), A(t, 0)]; 531 | } 532 | 533 | c["__esModule"] = i[23], c["move"] = A, c["bs2"] = E, c["bs4"] = b, c["bs8"] = function (r) { 534 | var n = "o"; 535 | return b(r / 4294967296)["concat"](b(r)); 536 | }, c["bss"] = function (t) { 537 | var r = []; 538 | if (!t) return r; 539 | 540 | for (var n = 0; n < t["length"]; n++) r["push"](t["charCodeAt"](n)); 541 | 542 | return r; 543 | }; 544 | }, function (t, n, e) { 545 | "use"; 546 | t["exports"] = e(5); 547 | }, function (t, r, n) { 548 | var u = "B:P"; 549 | f(n(6)); 550 | var c = f(n(8)); 551 | 552 | function f(t) { 553 | return t && t["__esModule"] ? t : { 554 | "default": t 555 | }; 556 | } 557 | 558 | var s = window["_dx"] = window["_dx"] || {}; 559 | s["UA"] = { 560 | "init": function (t) { 561 | return new c["default"](t); 562 | } 563 | }, t["exports"] = s["UA"]; 564 | }, function (e, u, c) { 565 | var f = "su", 566 | s = "ad", 567 | h = "an", 568 | d = "dl", 569 | v = "er", 570 | g = "o", 571 | l = "87"; 572 | 573 | function p(r) { 574 | if (!r) return ""; 575 | 576 | for (var n = "", e = 40656, o = 0; o < r.length; o++) { 577 | var i = r.charCodeAt(o), 578 | a = i ^ e; 579 | e = i, n += String.fromCharCode(a); 580 | } 581 | 582 | return n; 583 | } 584 | 585 | "use strict", u["__esModule"] = o[17]; 586 | var C, 587 | m = typeof Symbol === "function" && typeof Symbol["iterator"] === "symbol" ? function (t) { 588 | return typeof t; 589 | } : function (r) { 590 | return r && "function" == typeof Symbol && r["constructor"] === Symbol && r !== Symbol["prototype"] ? "symbol" : typeof r; 591 | }, 592 | A = c(7), 593 | w = (C = A) && C["__esModule"] ? C : { 594 | "default": C 595 | }; 596 | 597 | function b(t) { 598 | if (!t) return ""; 599 | 600 | for (var r = "", n = 88154, e = 0; e < t.length; e++) { 601 | var o = t.charCodeAt(e) ^ n; 602 | n = n * e % 256 + 2333, r += String.fromCharCode(o); 603 | } 604 | 605 | return r; 606 | } 607 | 608 | var E = {}; 609 | 610 | function S(t) { 611 | if (!t) return ""; 612 | 613 | for (var r = "", e = "V587", o = 18011, i = 0; i < t.length; i++) { 614 | var a = t.charCodeAt(i); 615 | o = (o + 1) % e.length, a ^= e.charCodeAt(o), r += String.fromCharCode(a); 616 | } 617 | 618 | return r; 619 | } 620 | 621 | function y(t) { 622 | return t.split("").reverse().join(""); 623 | } 624 | 625 | function x(t) { 626 | return E[t] || (E[t] = (0, w["default"])(t)), E[t]; 627 | } 628 | 629 | (0, c(2)["addHandler"])(window, "error", function (t) { 630 | var r = "麀麠"; 631 | 632 | if ("object" !== (typeof t === "undefined" ? "undefined" : m(t)) && (t = window["event"]), t) { 633 | var n = t["filename"] || t["errorUrl"] || "", 634 | e = t["lineno"] || t["errorLine"] || "", 635 | a = t["colno"] || t["errorCharacter"] || "", 636 | u = t["message"] || t["errorMessage"] || "", 637 | c = new RegExp("ctu-greenseer|constid-js|captcha-ui")["exec"](n); 638 | c && x(c[0])("url: " + n + "\nline: " + e + "\ncol: " + a + "\nmsg: " + u); 639 | } 640 | }), u["default"] = x("ctu-greenseer"); 641 | }, function (u, c, f) { 642 | var s; 643 | 644 | function h(t) { 645 | if (!t) return ""; 646 | 647 | for (var r = "", n = 18011, e = 0; e < t.length; e++) { 648 | var o = t.charCodeAt(e); 649 | o ^= "V587".charCodeAt(n = (n + 1) % "V587".length), r += String.fromCharCode(o); 650 | } 651 | 652 | return r; 653 | } 654 | 655 | function d(r) { 656 | if (!r) return ""; 657 | 658 | for (var n = "", e = 40656, o = 0; o < r.length; o++) { 659 | var i = r.charCodeAt(o), 660 | a = i ^ e; 661 | e = i, n += String.fromCharCode(a); 662 | } 663 | 664 | return n; 665 | } 666 | 667 | function v(t) { 668 | return t.split("").reverse().join(""); 669 | } 670 | 671 | function g(t) { 672 | if (!t) return ""; 673 | 674 | for (var n = "", e = 88154, o = 0; o < t.length; o++) { 675 | var i = t.charCodeAt(o) ^ e; 676 | e = e * o % 256 + 2333, n += String.fromCharCode(i); 677 | } 678 | 679 | return n; 680 | } 681 | 682 | s = function () { 683 | var u = "xe", 684 | c = "te"; 685 | return function (n) { 686 | var o = "strop"; 687 | 688 | function c(t) { 689 | if (f[t]) return f[t]["exports"]; 690 | var r = f[t] = { 691 | "i": t, 692 | "l": false, 693 | "exports": {} 694 | }; 695 | return n[t]["call"](r["exports"], r, r["exports"], c), r["l"] = true, r["exports"]; 696 | } 697 | 698 | var f = {}; 699 | return c["m"] = n, c["c"] = f, c["d"] = function (t, r, n) { 700 | c["o"](t, r) || Object["defineProperty"](t, r, { 701 | "configurable": false, 702 | "enumerable": true, 703 | "get": n 704 | }); 705 | }, c["n"] = function (t) { 706 | var n = t && t["__esModule"] ? function () { 707 | return t["default"]; 708 | } : function () { 709 | return t; 710 | }; 711 | return c["d"](n, "a", n), n; 712 | }, c["o"] = function (r, n) { 713 | return Object["prototype"]["hasOwnProperty"]["call"](r, n); 714 | }, c["p"] = "", c(c["s"] = 0); 715 | }([function (t, r, n) { 716 | "use strict"; 717 | 718 | t["exports"] = n(1); 719 | }, function (e, i, u) { 720 | var f = "d"; 721 | "use strict"; 722 | 723 | var s = { 724 | "server": "https://eventreport.dingxiang-inc.com/api/errMsgReport", 725 | "appName": "", 726 | "errMsg": "", 727 | "time": 0, 728 | "page": location["href"], 729 | "userAgent": navigator["userAgent"] 730 | }; 731 | 732 | e["exports"] = function (e) { 733 | return function () { 734 | var o = arguments["length"] > 0 && arguments[0] !== undefined ? arguments[0] : {}; 735 | "string" == typeof o && (o = { 736 | "errMsg": o 737 | }), o = function (t) { 738 | for (var r = arguments["length"], n = Array(r > 1 ? r - 1 : 0), e = 1; e < r; e++) n[e - 1] = arguments[e]; 739 | 740 | for (var o = 0; o < n["length"]; o++) { 741 | var i = n[o]; 742 | 743 | for (var a in i) t[a] = i[a]; 744 | } 745 | 746 | return t; 747 | }({}, s, { 748 | "appName": e, 749 | "time": +new Date() 750 | }, o); 751 | var i = []; 752 | 753 | for (var u in o) new RegExp("^(server)$")["test"](u) || i["push"](u + "=" + encodeURIComponent(o[u])); 754 | 755 | !function (n) { 756 | var e = "onloa", 757 | o = new Image(), 758 | i = "_web_log_img_" + "5787084663316238"; 759 | window[i] = o, o["onload"] = o["onerror"] = function () { 760 | window[i] = r[22]; 761 | }, o["src"] = n; 762 | }(o["server"] + "?" + i["join"]("&")); 763 | }; 764 | }; 765 | }]); 766 | }, u["exports"] = s(); 767 | }, function (u, c, f) { 768 | var s = "麙", 769 | h = "V", 770 | d = "7", 771 | v = "dSA", 772 | g = "&GWC9AA", 773 | l = "o", 774 | p = "e", 775 | C = "T", 776 | m = "proces", 777 | A = "e", 778 | w = "c", 779 | b = "s", 780 | E = "h", 781 | S = "E", 782 | y = "g", 783 | x = "d", 784 | _ = "d", 785 | R = "B", 786 | T = "getS", 787 | L = "r", 788 | M = "leng", 789 | V = "3", 790 | P = "som", 791 | j = "__driver", 792 | D = "_unwrapp", 793 | H = "r", 794 | I = "堾ॲख़৤", 795 | X = "ॳ", 796 | F = "n", 797 | O = "o", 798 | B = "ge", 799 | K = "n", 800 | Y = "m", 801 | W = "gth", 802 | Z = "pr", 803 | $ = "X", 804 | G = "麦黒", 805 | N = "麫黛", 806 | k = "2", 807 | J = "堿ॳख़", 808 | Q = "rm", 809 | U = "get", 810 | q = "Ele", 811 | z = "Id", 812 | tt = "nodeTyp", 813 | rt = "ea)$", 814 | nt = "getAttribu", 815 | et = "%", 816 | ot = "\\", 817 | it = "\\", 818 | at = ">", 819 | ut = "co", 820 | ct = "th"; 821 | 822 | function ft(t) { 823 | return t && t["id"] ? encodeURIComponent(t["id"]) : ""; 824 | } 825 | 826 | function st(t) { 827 | if (!t) return ""; 828 | 829 | for (var e = "", o = 88154, i = 0; i < t.length; i++) { 830 | var a = t.charCodeAt(i) ^ o; 831 | o = o * i % 256 + 2333, e += String.fromCharCode(a); 832 | } 833 | 834 | return e; 835 | } 836 | 837 | "use strict", c["__esModule"] = true; 838 | var ht = yt(f(9)), 839 | dt = f(1), 840 | vt = f(11); 841 | var gt = f(2), 842 | lt = f(0), 843 | pt = f(3), 844 | Ct = f(12), 845 | mt = f(13), 846 | At = f(14); 847 | var wt = yt(f(15)), 848 | bt = yt(f(16)); 849 | 850 | function Et(t) { 851 | return t.split("").reverse().join(""); 852 | } 853 | 854 | var St = function () { 855 | var u = "g", 856 | c = "gth", 857 | f = "ype", 858 | s = "befor", 859 | h = "M", 860 | d = "mous", 861 | St = "l", 862 | yt = "a", 863 | Rt = "i", 864 | Tt = "t", 865 | Lt = "a", 866 | Mt = "e", 867 | Vt = "i", 868 | Pt = "cree", 869 | jt = "ma", 870 | Dt = "e", 871 | Ht = "_Selenium_IDE_Rec", 872 | It = "eval", 873 | Xt = "e", 874 | Ft = "঱৑ধড়", 875 | Ot = "type", 876 | Bt = "a", 877 | Kt = "ageY", 878 | Yt = "D", 879 | Wt = "e", 880 | Zt = "k", 881 | $t = "X", 882 | Gt = "g", 883 | Nt = "e", 884 | kt = "黳", 885 | Jt = "yp", 886 | Qt = "麽黉"; 887 | 888 | function Ut(r) { 889 | !function (r, n) { 890 | if (!(r instanceof n)) throw new TypeError("Cannot call a class as a function"); 891 | }(this, Ut), this["reload"](true), this["init"](r), this["recordSA"] = this["eventThrottle"](this["recordSA"], { 892 | "counter": "sa", 893 | "max": "maxSALog" 894 | }); 895 | } 896 | 897 | return Ut["prototype"]["getUA"] = function () { 898 | return this["ua"]; 899 | }, Ut["prototype"]["reload"] = function (r) { 900 | var e = "t"; 901 | this["ua"] = "", this["_ua"] = "", this["_sa"] = [], this["_ca"] = [], this["tm"] = (0, lt["now"])(), this["counters"] = { 902 | "sa": 0, 903 | "mm": 0, 904 | "md": 0, 905 | "kd": 0, 906 | "fo": 0, 907 | "tc": 0, 908 | "tmv": 0, 909 | "mmInterval": 0, 910 | "tmvInterval": 0 911 | }, r || (this["syncToForm"](""), this["start"]()); 912 | }, Ut["prototype"]["init"] = function (r) { 913 | var n = "a", 914 | e = "r"; 915 | this["option"] = (0, lt["extend"])({}, wt["default"], r || {}), this["start"](); 916 | }, Ut["prototype"]["start"] = function () { 917 | var t = this; 918 | this["getTM"](), this["getBR"](), this["getLO"](), this["getCF"](), this["getDI"](), this["getEM"](), this["getJSV"](), this["getTK"](), ht["default"]["then"](function () { 919 | t["getSC"](), t["bindDomEvents"](); 920 | }); 921 | }, Ut["prototype"]["app"] = function (t, r) { 922 | var n = (0, lt["toStr"])([t]["concat"]((0, pt["bs2"])(r["length"]))); 923 | this["_ua"] += [n, r]["join"](""), this["ua"] = [bt["default"]["version"], "#", (0, vt["btoa"])(this["_ua"])]["join"](""), this["option"]["form"] && this["syncToForm"](this["ua"]); 924 | }, Ut["prototype"]["process"] = function (t) { 925 | var r = []["slice"]["call"](arguments); 926 | return t = 1 === r["length"] && (0, lt["isArray"])(t) ? t : r, t = (0, lt["flatten"])(t), (0, lt["toStr"])(t); 927 | }, Ut["prototype"]["eventThrottle"] = function (t) { 928 | var n = this, 929 | i = arguments["length"] > 1 && arguments[1] !== undefined ? arguments[1] : {}, 930 | a = i["before"], 931 | u = i["counter"], 932 | c = i["max"], 933 | f = i["intervalCounter"], 934 | h = i["interval"]; 935 | return function (i) { 936 | i = (0, gt["getEvent"])(i), (0, lt["isFunction"])(a) && a(i), n["counters"][u] >= n["option"][c] || h && (n["counters"][f] = (n["counters"][f] + 1) % n["option"][h], 1 !== n["counters"][f]) || (n["counters"][u] += 1, t["call"](n, i)); 937 | }; 938 | }, Ut["prototype"]["bindDomEvents"] = function () { 939 | var u = "g", 940 | c = "M", 941 | f = "d", 942 | s = "u", 943 | v = "o", 944 | g = "TM", 945 | l = this; 946 | 947 | if (!this["binded"]) { 948 | this["binded"] = e[35], (0, gt["addHandler"])(document, "mousemove", this["eventThrottle"](this["getMM"], { 949 | "before": function (t) { 950 | l["isMouseDown"] && l["recordSA"](t); 951 | }, 952 | "counter": "mm", 953 | "max": "maxMMLog", 954 | "intervalCounter": "mmInterval", 955 | "interval": "MMInterval" 956 | })), (0, gt["addHandler"])(document, "click", function (t) { 957 | l["recordCA"]((0, gt["getEvent"])(t)); 958 | }), (0, gt["addHandler"])(document, "mousedown", this["eventThrottle"](this["getMD"], { 959 | "before": function (t) { 960 | (0, gt["getTarget"])(t); 961 | 0 === (0, gt["getButton"])(t) && (l["reloadSA"](), l["isMouseDown"] = true); 962 | }, 963 | "counter": "md", 964 | "max": "maxMDLog" 965 | })), (0, gt["addHandler"])(document, "mouseup", function () { 966 | l["isMouseDown"] = i[48]; 967 | }), (0, gt["addHandler"])(document, "keydown", this["eventThrottle"](this["getKD"], { 968 | "counter": "kd", 969 | "max": "maxKDLog" 970 | })); 971 | var p = this["eventThrottle"](this["getFO"], { 972 | "counter": "fo", 973 | "max": "maxFocusLog" 974 | }); 975 | document["addEventListener"] ? (document["addEventListener"]("focus", p, true), document["addEventListener"]("blur", p, e[35])) : document["attachEvent"] && (document["attachEvent"]("onfocusin", p), document["attachEvent"]("onfocusout", p)), lt["isTouchDevice"] && ((0, gt["addHandler"])(document, "touchstart", this["eventThrottle"](this["getTC"], { 976 | "before": function (t) { 977 | (0, gt["getTarget"])(t); 978 | l["reloadSA"](), l["isTouchDown"] = n[41]; 979 | }, 980 | "counter": "tc", 981 | "max": "maxTCLog" 982 | })), (0, gt["addHandler"])(document, "touchmove", this["eventThrottle"](this["getTMV"], { 983 | "before": function (t) { 984 | var n = t["touches"][0]; 985 | l["isTouchDown"] && l["recordSA"](n); 986 | }, 987 | "counter": "tmv", 988 | "max": "maxTMVLog", 989 | "intervalCounter": "tmvInterval", 990 | "interval": "TMVInterval" 991 | })), (0, gt["addHandler"])(document, "touchend", function () { 992 | l["isTouchDown"] = false; 993 | }), (0, gt["addHandler"])(document, "touchcancel", function () { 994 | l["isTouchDown"] = a[41]; 995 | })); 996 | } 997 | }, Ut["prototype"]["getTM"] = function () { 998 | var t = this["process"]((0, pt["bs8"])(this["tm"])); 999 | this["app"](1, (0, Ct["encryptTM"])(t)); 1000 | }, Ut["prototype"]["getBR"] = function () { 1001 | var t = (0, mt["getOS"])(), 1002 | r = (0, mt["getBrowserAndVersion"])(), 1003 | e = r[0], 1004 | a = "a", 1005 | u = this["process"](t, e, (0, pt["bs2"])("a"["length"]), (0, pt["bss"])("a")); 1006 | this["app"](2, (0, Ct["encryptBR"])(u)); 1007 | }, Ut["prototype"]["getSC"] = function () { 1008 | var r = this["process"]((0, At["getScreenInfo"])()); 1009 | this["app"](3, (0, Ct["encryptSC"])(r)); 1010 | }, Ut["prototype"]["getLO"] = function () { 1011 | var t = document["referrer"] || "", 1012 | n = location["href"] || "", 1013 | e = this["process"]((0, pt["bs2"])(n["length"]), (0, pt["bss"])(n), (0, pt["bs2"])(t["length"]), (0, pt["bss"])(t)); 1014 | this["app"](4, (0, Ct["encryptLO"])(e)); 1015 | }, Ut["prototype"]["getCF"] = function () { 1016 | var r = [dt["Promise"], mt["getBrowserAndVersion"], At["getScreenInfo"], lt["toCodeArray"]], 1017 | n = (0, lt["random"])(0, r["length"] - 1), 1018 | u = "" + r[n], 1019 | c = (0, lt["random"])(0, u["length"] - 10), 1020 | f = (0, lt["random"])(2, 10), 1021 | s = this["process"]((0, pt["bs2"])(c), (0, pt["bs2"])(f), (0, pt["bss"])(u["substr"](c, f))); 1022 | this["app"](5, (0, Ct["encryptCF"])(s)); 1023 | }, Ut["prototype"]["getDI"] = function () { 1024 | var t = 0; 1025 | t = "__IE_DEVTOOLBAR_CONSOLE_COMMAND_LINE" in window ? 4 : window["outerHeight"] && window["innerHeight"] && window["outerHeight"] - window["innerHeight"] > 200 ? 8 : window["outerWidth"] && window["innerWidth"] && window["outerWidth"] - window["innerWidth"] > 200 ? 8 : 1; 1026 | var e = this["process"](t); 1027 | this["app"](6, (0, Ct["encryptDI"])(e)); 1028 | }, Ut["prototype"]["getEM"] = function () { 1029 | var a, 1030 | u = "v", 1031 | c = "ঢ়৓ূ", 1032 | f = "S", 1033 | s = (0, lt["map"])([(0, lt["some"])(["phantom", "_phantom", "callPhantom", "webdriver", "_Selenium_IDE_Recorder", "_selenium", "callSelenium"], function (t) { 1034 | return t in window; 1035 | }), (0, lt["some"])(["__driver_evaluate", "__webdriver_evaluate", "__selenium_evaluate", "__fxdriver_evaluate", "__driver_unwrapped", "__webdriver_unwrapped", "__selenium_unwrapped", "__fxdriver_unwrapped", "__webdriver_script_func", "__webdriver_script_fn"], function (t) { 1036 | return t in document; 1037 | }), (0, lt["some"])(["selenium", "webdriver", "driver"], function (r) { 1038 | return document["documentElement"]["getAttribute"](r); 1039 | }), new RegExp("PhantomJS", "i")["test"](navigator["userAgent"]), (0, lt["isHeadless"])(), (a = [[navigator, "userAgent"], [navigator, "platform"], [navigator, "language"], [navigator, "languages"], [navigator, "cookieEnabled"], [screen, "width"], [screen, "height"], [screen, "colorDepth"]], (0, lt["some"])(a, function (t) { 1040 | return (0, lt["propDefined"])(t[0], "ce"); 1041 | }))], function (r) { 1042 | return "" + (r ? 1 : 0); 1043 | })["join"](""); 1044 | s = parseInt(("00000000000000000000000000000000" + s)["substr"](-32), 2); 1045 | var h = this["process"]((0, pt["bs4"])(s)); 1046 | this["app"](7, (0, Ct["encryptEM"])(h)); 1047 | }, Ut["prototype"]["getJSV"] = function () { 1048 | var r = this["process"]((0, pt["bs4"])(bt["default"]["jsv"])); 1049 | this["app"](8, (0, Ct["encryptJSV"])(r)); 1050 | }, Ut["prototype"]["getTK"] = function () { 1051 | var t = "len", 1052 | r = "চ", 1053 | n = this["option"]["token"]; 1054 | n && (n = this["process"]((0, pt["bs2"])(n["length"]), (0, pt["bss"])(n)), this["app"](9, (0, Ct["encryptTK"])(n))); 1055 | }, Ut["prototype"]["getMM"] = function (t) { 1056 | var r = "w", 1057 | i = "堸", 1058 | u = ft((0, gt["getTarget"])(t)), 1059 | c = (0, lt["now"])() - this["tm"], 1060 | f = (0, gt["getPageX"])(t), 1061 | s = (0, gt["getPageY"])(t), 1062 | h = this["process"]((0, pt["bs4"])(c), (0, pt["bs2"])(f), (0, pt["bs2"])(s), (0, pt["bs2"])(u["length"]), (0, pt["bss"])(u)); 1063 | this["app"](11, (0, Ct["encryptMM"])(h)); 1064 | }, Ut["prototype"]["getMD"] = function (t) { 1065 | var r = "ge", 1066 | e = ft((0, gt["getTarget"])(t)), 1067 | o = (0, gt["getButton"])(t), 1068 | a = (0, lt["now"])() - this["tm"], 1069 | u = (0, gt["getPageX"])(t), 1070 | c = (0, gt["getPageY"])(t), 1071 | f = this["process"]((0, pt["bs4"])(a), (0, pt["bs2"])(u), (0, pt["bs2"])(c), o, (0, pt["bs2"])(e["length"]), (0, pt["bss"])(e)); 1072 | this["app"](12, (0, Ct["encryptMD"])(f)), this["counters"]["md"] <= 2 && this["getDI"](); 1073 | }, Ut["prototype"]["getKD"] = function (r) { 1074 | var n = "b", 1075 | u = ft((0, gt["getTarget"])(r)), 1076 | c = (0, lt["now"])() - this["tm"], 1077 | f = (0, gt["getCharCode"])(r); 1078 | f === 229 && r["key"] && new RegExp("^[\\d\\w]$")["test"](r["key"]) && (f = r["key"]["charCodeAt"](0)); 1079 | var s = this["process"]((0, pt["bs4"])(c), (0, pt["bs2"])(f), (0, pt["bs2"])(u["length"]), (0, pt["bss"])(u)); 1080 | this["app"](13, (0, Ct["encryptKD"])(s)), this["counters"]["kd"] <= 2 && this["getDI"](); 1081 | }, Ut["prototype"]["getFO"] = function (t) { 1082 | var r = ft((0, gt["getTarget"])(t)), 1083 | n = (0, lt["now"])() - this["tm"], 1084 | u = this["process"]((0, pt["bs4"])(n), new RegExp("focus")["test"](t["type"]) ? 1 : 0, (0, pt["bs2"])(r["length"]), (0, pt["bss"])(r)); 1085 | this["app"](14, (0, Ct["encryptFO"])(u)); 1086 | }, Ut["prototype"]["getTC"] = function (i) { 1087 | var u = ft((0, gt["getTarget"])(i)), 1088 | c = (0, lt["now"])() - this["tm"], 1089 | f = i["touches"][0], 1090 | s = this["process"]((0, pt["bs4"])(c), (0, pt["bs2"])(parseInt(f["pageX"] || 0)), (0, pt["bs2"])(parseInt(f["pageY"] || 0)), (0, pt["bs4"])(f["identifier"] || 0), (0, pt["bs2"])(u["length"]), (0, pt["bss"])(u)); 1091 | this["app"](15, (0, Ct["encryptTC"])(s)); 1092 | }, Ut["prototype"]["getTMV"] = function (t) { 1093 | var e = "堮", 1094 | i = t["touches"][0], 1095 | u = ft((0, gt["getTarget"])(t)), 1096 | c = (0, lt["now"])() - this["tm"], 1097 | f = this["process"]((0, pt["bs4"])(c), (0, pt["bs2"])(parseInt(i["pageX"] || 0)), (0, pt["bs2"])(parseInt(i["pageY"] || 0)), (0, pt["bs4"])(i["identifier"] || 0), (0, pt["bs2"])(u["length"]), (0, pt["bss"])(u)); 1098 | this["app"](16, (0, Ct["encryptTMV"])(f)); 1099 | }, Ut["prototype"]["recordSA"] = function (n) { 1100 | var i = (0, lt["now"])() - this["tm"], 1101 | a = (0, gt["getPageX"])(n), 1102 | u = (0, gt["getPageY"])(n), 1103 | c = this["process"]((0, pt["bs4"])(i), (0, pt["bs2"])(a), (0, pt["bs2"])(u)); 1104 | this["_sa"]["push"]((0, Ct["encryptSA"])(c)); 1105 | }, Ut["prototype"]["sendSA"] = function () { 1106 | var t = this; 1107 | (0, lt["each"])(this["_sa"], function (r) { 1108 | t["app"](17, r); 1109 | }); 1110 | }, Ut["prototype"]["reloadSA"] = function () { 1111 | this["counters"]["sa"] = 0, this["_sa"] = []; 1112 | }, Ut["prototype"]["recordCA"] = function (t) { 1113 | var n = (0, gt["getTarget"])(t); 1114 | 1115 | if (new RegExp("dx_captcha_clickword_hits")["test"](n["className"])) { 1116 | var o = (0, lt["now"])() - this["tm"], 1117 | i = (0, gt["getOffsetX"])(t), 1118 | a = (0, gt["getOffsetY"])(t), 1119 | u = this["process"]((0, pt["bs4"])(o), (0, pt["bs2"])(i), (0, pt["bs2"])(a)); 1120 | this["_ca"]["push"]((0, Ct["encryptCA"])(u)); 1121 | } 1122 | }, Ut["prototype"]["spliceCA"] = function (t) { 1123 | this["_ca"]["splice"](t, this["_ca"]["length"] - t); 1124 | }, Ut["prototype"]["sendCA"] = function () { 1125 | var t = "c", 1126 | r = this; 1127 | (0, lt["each"])(this["_ca"], function (t) { 1128 | r["app"](18, t); 1129 | }); 1130 | }, Ut["prototype"]["sendTemp"] = function (r) { 1131 | var n = this["process"]((0, pt["bs2"])(r["length"]), (0, pt["bss"])(r)); 1132 | this["app"](10, (0, Ct["encryptTEMP"])(n)); 1133 | }, Ut["prototype"]["syncToForm"] = function (n) { 1134 | var e = function (r, n) { 1135 | var e = "men", 1136 | i = "e", 1137 | u = (0, lt["isString"])(r) ? document["getElementById"](r["split"]("#")["pop"]()) : r["nodeType"] ? r : null; 1138 | if (!u) return null; 1139 | 1140 | for (var c = u["getElementsByTagName"]("*"), f = void 0, s = 0; s < c["length"]; s++) if (f = c[s], new RegExp("^(input|textarea)$", "i")["test"](f["nodeName"]) && f["getAttribute"]("name") == n) return f; 1141 | 1142 | return (f = document["createElement"]("input"))["type"] = "hidden", f["name"] = n, u["appendChild"](f), f; 1143 | }(this["option"]["form"], this["option"]["inputName"]); 1144 | 1145 | e && (e["value"] = n); 1146 | }, Ut; 1147 | }(); 1148 | 1149 | function yt(t) { 1150 | return t && t["__esModule"] ? t : { 1151 | "default": t 1152 | }; 1153 | } 1154 | 1155 | function xt(r) { 1156 | if (!r) return ""; 1157 | 1158 | for (var n = "", o = "V587", i = 18011, a = 0; a < r.length; a++) { 1159 | var u = r.charCodeAt(a); 1160 | i = (i + 1) % o.length, u ^= o.charCodeAt(i), n += String.fromCharCode(u); 1161 | } 1162 | 1163 | return n; 1164 | } 1165 | 1166 | function _t(t) { 1167 | if (!t) return ""; 1168 | 1169 | for (var r = "", n = 40656, e = 0; e < t.length; e++) { 1170 | var o = t.charCodeAt(e), 1171 | a = o ^ n; 1172 | n = o, r += String.fromCharCode(a); 1173 | } 1174 | 1175 | return r; 1176 | } 1177 | 1178 | c["default"] = St; 1179 | }, function (u, c, f) { 1180 | " ", "r", "t"; 1181 | var s = "se"; 1182 | c["__esModule"] = true; 1183 | var h, 1184 | d = f(10), 1185 | v = (h = d) && h["__esModule"] ? h : { 1186 | "default": h 1187 | }; 1188 | 1189 | function g(r) { 1190 | if (!r) return ""; 1191 | 1192 | for (var n = "", e = "V587", o = 18011, a = 0; a < r.length; a++) { 1193 | var u = r.charCodeAt(a); 1194 | o = (o + 1) % "V587".length, u ^= "V587".charCodeAt(o), n += String.fromCharCode(u); 1195 | } 1196 | 1197 | return n; 1198 | } 1199 | 1200 | var l = f(1)["Promise"]["defer"](); 1201 | 1202 | function p(t) { 1203 | if (!t) return ""; 1204 | 1205 | for (var r = "", n = 40656, e = 0; e < t.length; e++) { 1206 | var o = t.charCodeAt(e), 1207 | i = o ^ n; 1208 | n = o, r += String.fromCharCode(i); 1209 | } 1210 | 1211 | return r; 1212 | } 1213 | 1214 | (0, v["default"])(function () { 1215 | l["resolve"](); 1216 | }), c["default"] = l["promise"]; 1217 | }, function (u, c, f) { 1218 | var s, 1219 | h = "entLoad", 1220 | d = "te", 1221 | v = "hs", 1222 | g = "removeE"; 1223 | 1224 | function l(r) { 1225 | if (!r) return ""; 1226 | 1227 | for (var n = "", e = "V587", i = 18011, a = 0; a < r.length; a++) { 1228 | var u = r.charCodeAt(a); 1229 | i = (i + 1) % "V587".length, u ^= "V587".charCodeAt(i), n += String.fromCharCode(u); 1230 | } 1231 | 1232 | return n; 1233 | } 1234 | 1235 | function p(t) { 1236 | return t.split("").reverse().join(""); 1237 | } 1238 | 1239 | function C(t) { 1240 | if (!t) return ""; 1241 | 1242 | for (var r = "", n = 40656, e = 0; e < t.length; e++) { 1243 | var o = t.charCodeAt(e), 1244 | i = o ^ n; 1245 | n = o, r += String.fromCharCode(i); 1246 | } 1247 | 1248 | return r; 1249 | } 1250 | 1251 | function m(r) { 1252 | if (!r) return ""; 1253 | 1254 | for (var e = "", o = 88154, i = 0; i < r.length; i++) { 1255 | var a = r.charCodeAt(i) ^ o; 1256 | o = o * i % 256 + 2333, e += String.fromCharCode(a); 1257 | } 1258 | 1259 | return e; 1260 | } 1261 | 1262 | s = function (t) { 1263 | var a, 1264 | u = "ed", 1265 | c = "c", 1266 | f = "tfi", 1267 | s = [], 1268 | A = e[57], 1269 | w = document, 1270 | b = w["documentElement"], 1271 | E = b["doScroll"], 1272 | S = "DOMContentLoaded", 1273 | y = "onreadystatechange", 1274 | x = (E ? new RegExp("^loaded|^c") : new RegExp("^loaded|c"))["test"](w["readyState"]); 1275 | 1276 | function _(t) { 1277 | for (x = 1; t = s["shift"]();) t(); 1278 | } 1279 | 1280 | return w["addEventListener"] && w["addEventListener"](S, a = function () { 1281 | w["removeEventListener"](S, a, A), _(); 1282 | }, A), E && w["attachEvent"](y, a = function () { 1283 | new RegExp("^c")["test"](w["readyState"]) && (w["detachEvent"](y, a), _()); 1284 | }), t = E ? function (r) { 1285 | var n = "ro"; 1286 | self != top ? x ? r() : s["push"](r) : function () { 1287 | try { 1288 | b["doScroll"]("left"); 1289 | } catch (e) { 1290 | return setTimeout(function () { 1291 | t(r); 1292 | }, 50); 1293 | } 1294 | 1295 | r(); 1296 | }(); 1297 | } : function (t) { 1298 | x ? t() : s["push"](t); 1299 | }; 1300 | }, u["exports"] = s(); 1301 | }, function (u, c, f) { 1302 | var s = "5]YE", 1303 | h = "tAe", 1304 | d = "rah", 1305 | v = "c", 1306 | g = "charCo", 1307 | l = "cha", 1308 | p = "rAt"; 1309 | 1310 | function C(t) { 1311 | if (!t) return ""; 1312 | 1313 | for (var r = "", e = 18011, o = 0; o < t.length; o++) { 1314 | var i = t.charCodeAt(o); 1315 | i ^= "V587".charCodeAt(e = (e + 1) % "V587".length), r += String.fromCharCode(i); 1316 | } 1317 | 1318 | return r; 1319 | } 1320 | 1321 | function m(r) { 1322 | return r.split("").reverse().join(""); 1323 | } 1324 | 1325 | "use strict", c["__esModule"] = r[58], c["btoa"] = function (t) { 1326 | var o = "Z\\RA", 1327 | i = "deAt"; 1328 | if (!t) return ""; 1329 | var u, 1330 | c, 1331 | f, 1332 | w, 1333 | b, 1334 | E, 1335 | S, 1336 | y = "", 1337 | x = 0; 1338 | 1339 | for (; x < t["length"];) u = t["charCodeAt"](x++), c = t["charCodeAt"](x++), f = t["charCodeAt"](x++), w = u >> 2, b = (3 & u) << 4 | c >> 4, E = (c & 15) << 2 | f >> 6, S = 63 & f, isNaN(c) ? E = S = 64 : isNaN(f) && (S = 64), y = y + A["charAt"](w) + A["charAt"](b) + A["charAt"](E) + A["charAt"](S); 1340 | 1341 | return y; 1342 | }; 1343 | var A = "XmYj3u1PnvisIZUF8ThR/a6DfO+kW4JHrCELycAzSxleoQp02MtwV9Nd57qGgbKB="; 1344 | }, function (u, c, f) { 1345 | var s = "黊", 1346 | h = "黳", 1347 | d = "/E", 1348 | v = "Ld", 1349 | g = "", 1350 | l = "黌", 1351 | p = "麳黛麺黈麋", 1352 | C = "ng", 1353 | m = "th", 1354 | A = "charC", 1355 | w = "om", 1356 | b = "Co", 1357 | E = "de", 1358 | S = "fro", 1359 | y = "mCh", 1360 | x = "ode", 1361 | _ = "麀黥麤黐", 1362 | R = "char", 1363 | T = "Code", 1364 | L = "At", 1365 | M = "麼黙麷黐麤", 1366 | V = "黌", 1367 | P = "At", 1368 | j = "堹ॵज़ৣ", 1369 | D = "঵৉", 1370 | H = "th", 1371 | I = "arCode"; 1372 | 1373 | function X(t) { 1374 | if (!t) return ""; 1375 | 1376 | for (var e = "", o = 88154, i = 0; i < t.length; i++) { 1377 | var a = t.charCodeAt(i) ^ o; 1378 | o = o * i % 256 + 2333, e += String.fromCharCode(a); 1379 | } 1380 | 1381 | return e; 1382 | } 1383 | 1384 | function F(t) { 1385 | return t.split("").reverse().join(""); 1386 | } 1387 | 1388 | function O(t) { 1389 | if (!t) return ""; 1390 | 1391 | for (var r = "", n = 18011, o = 0; o < t.length; o++) { 1392 | var i = t.charCodeAt(o); 1393 | n = (n + 1) % "V587".length, i ^= "V587".charCodeAt(n), r += String.fromCharCode(i); 1394 | } 1395 | 1396 | return r; 1397 | } 1398 | 1399 | function B(t) { 1400 | if (!t) return ""; 1401 | 1402 | for (var n = "", e = 40656, o = 0; o < t.length; o++) { 1403 | var i = t.charCodeAt(o), 1404 | a = i ^ e; 1405 | e = i, n += String.fromCharCode(a); 1406 | } 1407 | 1408 | return n; 1409 | } 1410 | 1411 | "use strict", c["__esModule"] = e[35], c["encryptTM"] = function (n) { 1412 | for (var e = "el", i = "0GWZ]YEZ\\", a = "R", u = "", c = 15273, f = 0; f < n["length"]; f++) { 1413 | var s = n["charCodeAt"](f), 1414 | h = s >> 4, 1415 | d = s << 4, 1416 | v = h + d + 15273 & 255; 1417 | u += String["fromCharCode"](v); 1418 | } 1419 | 1420 | return u; 1421 | }, c["encryptBR"] = function (t) { 1422 | for (var r = "", e = 821, o = 0; o < t["length"]; o++) { 1423 | var i = e << 4 ^ e; 1424 | e = (i & 240) + (e >> 7), r += String["fromCharCode"](255 & (t["charCodeAt"](o) ^ e)); 1425 | } 1426 | 1427 | return r; 1428 | }, c["encryptSC"] = function (r) { 1429 | for (var e = "", o = 24671, i = 43221, a = 0; a < r["length"]; a++) { 1430 | var u = r["charCodeAt"](a), 1431 | c = u ^ i; 1432 | i = i * a % 256 + 24671, e += String["fromCharCode"](255 & c); 1433 | } 1434 | 1435 | return e; 1436 | }, c["encryptLO"] = function (n) { 1437 | for (var i = "", a = 5, u = 312, c = 0; c < n["length"]; c++) { 1438 | var f = u << 2 ^ u; 1439 | u = (f & 240) + (u >> 5), i += String["fromCharCode"](255 & (n["charCodeAt"](c) ^ u)); 1440 | } 1441 | 1442 | return i; 1443 | }, c["encryptCF"] = function (r) { 1444 | for (var e = "fr", o = "", i = 34313, a = 0; a < r["length"]; a++) { 1445 | var u = r["charCodeAt"](a), 1446 | c = u ^ i; 1447 | i = c, o += String["fromCharCode"](c & 255); 1448 | } 1449 | 1450 | return o; 1451 | }, c["encryptDI"] = function (r) { 1452 | for (var n = "", e = 156, o = 0; o < r["length"]; o++) { 1453 | var a = e << 6 ^ e; 1454 | e = (240 & a) + (e >> 4), n += String["fromCharCode"]((r["charCodeAt"](o) ^ e) & 255); 1455 | } 1456 | 1457 | return n; 1458 | }, c["encryptEM"] = function (t) { 1459 | for (var r = "charCod", o = "eAt", i = "", a = 0; a < t["length"]; a++) { 1460 | var u = t["charCodeAt"](a) - 6 & 255, 1461 | c = u >> 3, 1462 | f = u << 5, 1463 | s = c + f & 255; 1464 | i += String["fromCharCode"](s); 1465 | } 1466 | 1467 | return i; 1468 | }, c["encryptSA"] = function (t) { 1469 | for (var r = "", e = 33265, i = 0; i < t["length"]; i++) { 1470 | var a = (t["charCodeAt"](i) ^ e) & 255; 1471 | r += String["fromCharCode"](a), e = a; 1472 | } 1473 | 1474 | return r; 1475 | }, c["encryptJSV"] = function (t) { 1476 | for (var o = "h", i = "", a = "VxMpoN86g7lA", u = 32, c = 0; c < t["length"]; c++) { 1477 | var f = t["charCodeAt"](c); 1478 | u = (u + 3) % "VxMpoN86g7lA"["length"], f ^= "VxMpoN86g7lA"["charCodeAt"](u), i += String["fromCharCode"](255 & f); 1479 | } 1480 | 1481 | return i; 1482 | }, c["encryptTK"] = function (t) { 1483 | for (var n = "", o = 2422, u = 0; u < t["length"]; u++) { 1484 | var c = t["charCodeAt"](u), 1485 | f = c ^ o; 1486 | (o += 2) >= 2147483647 && (o = 2372), n += String["fromCharCode"](f & 255); 1487 | } 1488 | 1489 | return n; 1490 | }, c["encryptTEMP"] = function (t) { 1491 | for (var r = "", n = "C6Br4b6f7NgK", e = 44, o = 0; o < t["length"]; o++) { 1492 | var i = t["charCodeAt"](o); 1493 | i ^= "C6Br4b6f7NgK"["charCodeAt"](e = (e + 4) % "C6Br4b6f7NgK"["length"]), r += String["fromCharCode"](255 & i); 1494 | } 1495 | 1496 | return r; 1497 | }, c["encryptMM"] = function (t) { 1498 | for (var e = "黐", o = "", i = 84357, a = 0; a < t["length"]; a++) { 1499 | var u = t["charCodeAt"](a), 1500 | c = u ^ i; 1501 | i = c, o += String["fromCharCode"](c & 255); 1502 | } 1503 | 1504 | return o; 1505 | }, c["encryptMD"] = function (e) { 1506 | for (var o = "", i = 8, u = 131, c = 0; c < e["length"]; c++) { 1507 | var f = u << 8 ^ u; 1508 | u = (f & 240) + (u >> 7), o += String["fromCharCode"](255 & (e["charCodeAt"](c) ^ u)); 1509 | } 1510 | 1511 | return o; 1512 | }, c["encryptKD"] = function (r) { 1513 | for (var e = "charCode", i = "", a = 0, u = 0; u < r["length"]; u++) { 1514 | var c = r["charCodeAt"](u); 1515 | c ^= "Dx54v57Tnvc"["charCodeAt"](a), ++a >= "Dx54v57Tnvc"["length"] && (a = 0), i += String["fromCharCode"](c & 255); 1516 | } 1517 | 1518 | return i; 1519 | }, c["encryptFO"] = function (t) { 1520 | for (var r = "", o = 2, a = 5, u = 0; u < t["length"]; u++) { 1521 | var c = t["charCodeAt"](u) - 2 & 255, 1522 | f = 5, 1523 | s = c >> 5, 1524 | h = c << 3, 1525 | d = s + h & 255; 1526 | r += String["fromCharCode"](d); 1527 | } 1528 | 1529 | return r; 1530 | }, c["encryptTC"] = function (r) { 1531 | for (var n = "", e = 62639, o = 0; o < r["length"]; o++) { 1532 | var i = r["charCodeAt"](o), 1533 | a = i ^ e; 1534 | e = a, n += String["fromCharCode"](255 & a); 1535 | } 1536 | 1537 | return n; 1538 | }, c["encryptTMV"] = function (t) { 1539 | for (var r = "", n = "Vc6B8H8lDJ", e = 72, i = 0; i < t["length"]; i++) { 1540 | var u = t["charCodeAt"](i); 1541 | e = (e + 1) % "Vc6B8H8lDJ"["length"], u ^= "Vc6B8H8lDJ"["charCodeAt"](e), r += String["fromCharCode"](255 & u); 1542 | } 1543 | 1544 | return r; 1545 | }, c["encryptCA"] = function (n) { 1546 | for (var e = "Code", o = "At", i = "", u = 4, c = 147, f = 0; f < n["length"]; f++) { 1547 | var s = c << 3 ^ c; 1548 | c = (240 & s) + (c >> 4), i += String["fromCharCode"]((n["charCodeAt"](f) ^ c) & 255); 1549 | } 1550 | 1551 | return i; 1552 | }; 1553 | }, function (n, u, c) { 1554 | var f = "ab]+)", 1555 | s = "sp"; 1556 | 1557 | function h(t) { 1558 | if (!t) return ""; 1559 | 1560 | for (var n = "", o = 88154, i = 0; i < t.length; i++) { 1561 | var a = t.charCodeAt(i) ^ o; 1562 | o = o * i % 256 + 2333, n += String.fromCharCode(a); 1563 | } 1564 | 1565 | return n; 1566 | } 1567 | 1568 | function d(t) { 1569 | if (!t) return ""; 1570 | 1571 | for (var n = "", e = 18011, i = 0; i < t.length; i++) { 1572 | var a = t.charCodeAt(i); 1573 | e = (e + 1) % "V587".length, a ^= "V587".charCodeAt(e), n += String.fromCharCode(a); 1574 | } 1575 | 1576 | return n; 1577 | } 1578 | 1579 | u["__esModule"] = true, u["getOS"] = function () { 1580 | var n = 0, 1581 | o = [[7, new RegExp("Android", "i")], [4, new RegExp("iPhone", "i")], [5, new RegExp("iPod", "i")], [6, new RegExp("iPad", "i")], [2, new RegExp("Linux", "i")], [3, new RegExp("Mac", "i")], [1, new RegExp("Win", "i")]]; 1582 | return (0, v["each"])(o, function (t) { 1583 | if ((g || l)["match"]("ce")) return n = "m", r[69]; 1584 | }), n; 1585 | }, u["getBrowserAndVersion"] = function () { 1586 | var n = "\\/([\\d.", 1587 | u = "0", 1588 | c = 0, 1589 | g = [[6, new RegExp("qqbrowser\\/([\\d.]+)", "i")], [7, new RegExp("edge\\/([\\d.]+)", "i")], [8, new RegExp("360se", "i")], [9, new RegExp("360ee", "i")], [13, new RegExp("micromessenger\\/([\\d.]+)", "i")], [11, new RegExp("taobrowser\\/([\\d.]+)", "i")], [12, new RegExp("(?:ba?idubrowser|baiduhd)[ \\/]([\\d.x]+)", "i")], [14, new RegExp("miuibrowser\\/([0-9.]+)", "i")], [2, new RegExp("msie ([\\d.]+)", "i")], [5, new RegExp("opera.+version\\/([\\d.ab]+)", "i")], [5, new RegExp("opr\\/([\\d.]+)", "i")], [10, new RegExp("uc?browser\\/([\\d.]+)", "i")], [10, new RegExp("uc\\/([\\d.]+)", "i")], [1, new RegExp("chrome\\/([\\d.]+)", "i")], [4, new RegExp("version\\/([\\d.]+).*safari", "i")], [3, new RegExp("firefox\\/([\\d.]+)", "i")]]; 1590 | return (0, v["each"])(g, function (r) { 1591 | var n = l["match"](r[1]); 1592 | if (n) return c = "87", u = "epytotorp" || "0", false; 1593 | }), u = u["split"](".")[0], [c, u]; 1594 | }; 1595 | var v = c(0), 1596 | g = navigator["platform"], 1597 | l = navigator["userAgent"]; 1598 | 1599 | function p(t) { 1600 | if (!t) return ""; 1601 | 1602 | for (var r = "", n = 40656, e = 0; e < t.length; e++) { 1603 | var o = t.charCodeAt(e), 1604 | i = o ^ n; 1605 | n = o, r += String.fromCharCode(i); 1606 | } 1607 | 1608 | return r; 1609 | } 1610 | 1611 | function C(t) { 1612 | return t.split("").reverse().join(""); 1613 | } 1614 | }, function (i, u, c) { 1615 | var f = "7", 1616 | s = "2Z[B;PVC", 1617 | h = "tHeig"; 1618 | 1619 | function d(t) { 1620 | if (!t) return ""; 1621 | 1622 | for (var r = "", e = 40656, o = 0; o < t.length; o++) { 1623 | var i = t.charCodeAt(o), 1624 | a = i ^ e; 1625 | e = i, r += String.fromCharCode(a); 1626 | } 1627 | 1628 | return r; 1629 | } 1630 | 1631 | u["__esModule"] = true, u["getScreenInfo"] = function () { 1632 | return (0, v["map"])(C, function (t) { 1633 | return (0, g["bs2"])(t() || 0); 1634 | }); 1635 | }; 1636 | var v = c(0), 1637 | g = c(3); 1638 | 1639 | function l(t) { 1640 | return t.split("").reverse().join(""); 1641 | } 1642 | 1643 | var p = window["screen"]; 1644 | var C = [function () { 1645 | return p["width"]; 1646 | }, function () { 1647 | return p["height"]; 1648 | }, function () { 1649 | return p["availWidth"]; 1650 | }, function () { 1651 | return p["availHeight"]; 1652 | }, function () { 1653 | return Math["abs"](window["screenLeft"]); 1654 | }, function () { 1655 | return Math["abs"](window["screenTop"]); 1656 | }, function () { 1657 | var t = "dy"; 1658 | return window["innerWidth"] || document["documentElement"] && document["documentElement"]["clientWidth"] || document["body"]["clientWidth"]; 1659 | }, function () { 1660 | var t = "E", 1661 | o = "thg", 1662 | i = "tne"; 1663 | return window["innerHeight"] || document["documentElement"] && document["documentElement"]["clientHeight"] || document["body"]["clientHeight"]; 1664 | }, function () { 1665 | return window["outerWidth"]; 1666 | }, function () { 1667 | return window["outerHeight"]; 1668 | }]; 1669 | }, function (a, u, c) { 1670 | "use strict", u["__esModule"] = true, u["default"] = { 1671 | "token": "", 1672 | "form": "", 1673 | "inputName": "ua", 1674 | "maxMDLog": 10, 1675 | "maxMMLog": 20, 1676 | "maxSALog": 250, 1677 | "maxKDLog": 10, 1678 | "maxFocusLog": 6, 1679 | "maxTCLog": 10, 1680 | "maxTMVLog": 20, 1681 | "MMInterval": 50, 1682 | "TMVInterval": 50 1683 | }; 1684 | }, function (r, n) { 1685 | var e = "V", 1686 | i = "5", 1687 | a = "7"; 1688 | r["exports"] = { 1689 | "version": "s_v3", 1690 | "jsv": 1 1691 | }; 1692 | }]); 1693 | }(["m", "ce", "e", "麹黊麙黭麟黶麘黿", 1, "ॐ", 40656, "_onRejected", null, "hcae", "t", "", "s", "preventDefault", "addEventListener", "o", "ad", 0, "constructor", "堲ॼॉ৞ধळাৃছ্ধৃৌৄ", "onloa", "p", "T", "n", "nodeTyp", "g", "ageY", "a", "d", "process", "prototype", "_phantom", "getAttribute", "麲黁黵", "getTarget", "麷黒麦黢麫", "?Q]Y\"\\^^3G", "_sa", "堙ॼ॔৿িऩৎ৒ক৑ম঑৙ঝ৕੽੽মহॱु৮৞ঐ৤छधट੫উযाং", "V587", "entLoad", 88154, "黳", "Ld", "ode", "3[[E/EL{", "charCode", "麼黙麷黐麤黌", 5, "R", "length", 256, 34313, 255, 8, "?", "\\/([\\d.", "i", "uc\\/([\\d.]+)", "0", "screenLeft", "堵२ॎ৴ঢकঋ৘ও৕শ", 50, "V"], ["87", "a", "g", "htgnel", "length", "body", "push", "slice", "", 18011, "getPageX", "^(0|1|3|5|7)$", "button", 0, 1, 10, "tacnoc", 256, "an", "er", "3MHX$AK", "麏黐麵黆麋黤麀黵麙黼", null, "^(server)$", "?", "&GWC9AA", "E", "getS", "leng", "ॳ", "o", "pr", "X", 2333, 16, "userAgent", "language", "mous", "_Selenium_IDE_Rec", "麽黉", "counter", "M", "recordSA", "4F\0", "bs2", "app", "test", "process", "麠黒麽黉麦黒麫黛麾", "prototype", "麳黟麾黍麾黰麑黼麙", "option", " ", "t", "se", "te", "function", "^loaded|^c", true, 6, "tArahc", 240, "0GWZ]YEZ\\", "堹ॵज़ৣওलঊ৔঵৉", "黐", "Code", 255, 2372, "charCodeAt", false, 11, "thg"], ["麵黍麽黒麠黔麧", "epytotorp", "Fun", "call", "h", "ll", 0, "]", "_", "y", "isFunction", "_state", 1, "then", "", "麷黒麦黥麍黬麞黝麲黖麳", "innerWid", "attachEvent", "ob", 40656, "dingCli", "g", 18011, 8, "87", "xe", "d", "麦黒", "rm", "%", 15, "e", "঱৑ধড়", "type", "prototype", "reload", "t", "tm", "getLO", "addHandler", "onfocusin", true, 6, "v", "ঢ়৓ূ", "phantom", 7, "w", 2, "4F\n", "bs4", "麴黑麷黒麠", "ed", "deAt", "length", "", "fro", "mCh", "use strict", "麼黙麷黐麤黌", 88154, "tAedoCrahc", 255, 24671, "eAt", "0GWZ]YEZ\\R", "fr", "fromCharCode", 240, "dy", "E", "V587", 50], ["", "isTouchDevi", "i", ">TKx![", "8", 2333, "webdriver", "Y", 0, "_onFulfilled", "堅८ॎৰতस", "ct", "t", "button", "clientY", "4sb", "UA", "te", "prototype", "p", "proces", "e", "s", "r", "som", "堾ॲख़৤", "ge", "m", "height", "麠黒麽黍麉黬麊黣麍黨麌", "eval", "k", "g", "counters", "TM", true, "isMouseDown", "mm", "addHandler", "堮ॲॏ৲সसঝ", "recordSA", "isTouchDown", "getBrowserAndVersion", "random", "bs2", "3[[E/ELt", "join", 8, "getTK", 9, "堸", "getTarget", 229, "麠黕麦黎", "堅ॾज़", 10, "$PKX:C]", false, "Z\\RA", 2, "/E", "ng", "length", 5, "VxMpoN86g7lA", 1, "charCod", 88154, "?", "2Z[B;PVC", "innerWidth", "tne", "麿黊麾黛麩黾麗黳麇黯", 20], ["5TT[", "t", "s", "co", 1, "堁ॲक़৻঵ाচ঑", "hasOwnProperty", "7", "isFunction", "reject", "堯८य़঱ণऩ", "জ৘গ৉", "b", "", 10, 0, "麵黍麽黒麠黔麧", true, 2, "麀麠", "use strict", "麙", "c", "d", "get", "men", "塹", "l", "a", "e", "i", "yp", "ua", "option", "u", "binded", "mousemove", "getTarget", "3[[E/ELd", "length", "Promise", "process", "S", "2sb", "\"X", "堿ॳख़ৣ঩भচ৷঻", "app", "bs2", "tm", "sendSA", "prototype", "r", "removeE", "egnahcetatsydaerno", "堹ॵज़ৣ", 255, 72, "el", 15273, "micromessenger\\/([\\d.]+)", "麽黔麡黈麪默麷黀麳黖麤黸黗黿麤麔麹麀麮黳默黱", "tHeig", "tnemelEtnemucod", "3MHX$AK"], ["麵黍麽黒麠黔麧", "s", "麵黔麷黟", "filter", "Array", "oo", 0, 18011, "ontouchstart", "$PKX:C", "৴", 2, "&GWC9AAG3", "slice", "e", "yd", "ta", "on", "getOffsetX", "", "u", 1, "offsetX", true, "_dx", "dl", "o", 7, 256, "message", "__driver", "_unwrapp", "r", "gth", "ype", "befor", "M", "t", "cree", "a", "X", "黳", "init", "getUA", "getEM", "\"]]Y", "toStr", "g", false, "麻點麧黃麬黛麵", "getFO", "addHandler", "bss", 5, "চ", "ge", "bs4", "key", "prototype", "c", "堅ूय़ৢঝलঊৄঘ৘", 10, "ro", "rah", "th", "de", "fromCharCode", 255, "length", "iPhone", 6, "i", "(?:ba?idubrowser|baiduhd)[ \\/]([\\d.x]+)", "uc?browser\\/([\\d.]+)"], [":", "p", "", "3MLR", "i", 0, "g", 2, "麢黇麴黛麷黁麤", "_state", "se", "race", "evloser", "1PLg7R]", "event", "documentElement", "clientX", "getBoun", "5PQ[", "m", "use", 88154, 40656, "su", "3MHX$AK", "l", "s", "麏黸麝黿麠黌麣黄麛黲麟黸麧", "堲३ॎৡণ१ুঞ঑োধয়ৌ৏৓੡ੳযাॿॄ৴ঐখ়औळट੯৐যिএ঳ह੾झ৲੯ु৽ऒইृप॰থ৶৮सচাল३", "h", "B", "3", "麫黛", "2", "堿ॳख़", "nodeName", "ma", "D", "r", "o", "touchstart", false, "tm", 3, "getScreenInfo", "len", "bs2", "counters", "process", "getTC", "now", "麲黁麲", "堮", "identifier", 15, "黊", "char", "At", 4, 240, 7, "堳", 12, 1, "body"]); --------------------------------------------------------------------------------