├── .gitignore ├── .github └── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature_request.yml │ └── bug_report.yml ├── package.json ├── config.json ├── README.md ├── LICENSE └── Jsjiemi.js /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | /node_modules/ 3 | /local_files/ 4 | /template/ 5 | /JsjiemiResult0.js 6 | /JsjiemiResult1.js 7 | /JsjiemiResult2.js 8 | /JsjiemiResult3.js 9 | /JsjiemiResult4.js 10 | /JsjiemiResult5.js 11 | /JsjiemiResult6.js 12 | /target.js 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: 问题咨询 4 | url: https://github.com/NXY666/Jsjiemi/discussions/new?category=%E9%97%AE%E9%A2%98%E5%92%A8%E8%AF%A2 5 | about: 解密器不会使用、代码细节咨询等在此提问。为了提升效率,请完整阅读 README.md 后再提问。 -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: 功能建议 2 | description: 新功能需求、文字提示建议、解密流程建议等在此提交。 3 | labels: 4 | - 建议 5 | body: 6 | - type: textarea 7 | id: Details 8 | attributes: 9 | label: 建议详情 10 | validations: 11 | required: true 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jsjiemi", 3 | "version": "2.16.1", 4 | "description": "A decryptor for JavaScript.", 5 | "keywords": ["javascript", "decryptor", "jsjiemi"], 6 | "homepage": "https://github.com/NXY666/Jsjiemi", 7 | "bugs": { 8 | "url": "https://github.com/NXY666/Jsjiemi/issues" 9 | }, 10 | "license": "AGPL-3.0", 11 | "author": "NXY666", 12 | "main": "Jsjiemi.js", 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/NXY666/Jsjiemi.git" 16 | }, 17 | "optionalDependencies": { 18 | "vm2": "^3.9.19" 19 | }, 20 | "scripts": { 21 | "decrypt": "node Jsjiemi.js" 22 | } 23 | } -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: BUG提交 2 | description: 全局解密函数识别异常、解密过程报错、解密结果有误等问题在此反馈。 3 | labels: 4 | - BUG 5 | body: 6 | - type: dropdown 7 | id: OS_dropdown 8 | attributes: 9 | label: 操作系统 10 | description: 系统的差异可能导致兼容性问题,因此需要你提供遇到问题时使用的操作系统。 11 | multiple: true 12 | options: 13 | - Windows 14 | - Linux 15 | - MacOS 16 | - 其它 17 | validations: 18 | required: true 19 | - type: input 20 | id: NodeVersion_input 21 | attributes: 22 | label: Node.js 版本号 23 | description: "解密器在发布前只使用最新LTS版本进行测试。如果你使用的并非最新版本,请在命令行中运行`node -v`获取正在使用的版本号。" 24 | placeholder: "最新版本" 25 | - type: textarea 26 | id: Details_textarea 27 | attributes: 28 | label: 问题详情 29 | validations: 30 | required: true 31 | - type: textarea 32 | id: Code_textarea 33 | attributes: 34 | label: 目标代码 35 | description: 不同的目标代码可能产生不同的解密效果。你可以 `填写链接` 或 `粘贴代码` 。 36 | render: JavaScript 37 | validations: 38 | required: true 39 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | /** 3 | * 目标脚本文件路径 4 | * ·支持使用相对路径,起始路径为启动解密器时所在的路径,而不是解密器所在的位置。 5 | */ 6 | "target": "./target.js", 7 | /** 8 | * 输出脚本文件路径 9 | * ·支持使用相对路径,起始路径为启动解密器时所在的路径,而不是解密器所在的位置。 10 | * ·输出路径可使用占位符“{:xxx}”,在文件输出时会被替换为对应的值,目前支持的占位符有: 11 | * · {:N} - 必填。用于区分某个解密步骤的输出文件; 12 | * · {:TN} - 目标脚本文件的文件名; 13 | * · {:TD} - 目标脚本文件所在文件夹的绝对路径。 14 | */ 15 | "output": "./JsjiemiResult{:N}.js", 16 | /** 17 | * 安静模式 18 | * ·启用后自动跳过所有暂停,这可能错过重要的安全警告。 19 | * ·若系统不支持暂停则必须启用该选项。 20 | * ·可选值:true | false 21 | */ 22 | "quietMode": false, 23 | /** 24 | * 日志配置 25 | * ·调整解密器执行时展示的日志样式。 26 | */ 27 | "logger": { 28 | /** 29 | * 内容样式 30 | * ·默认内容样式: 31 | * * 解密完成! 32 | * · 耗时:25326ms 33 | */ 34 | "content": { 35 | // 行前缀 36 | "linePrefix": { 37 | // 首行前缀 38 | "first": "* ", 39 | // 非首行前缀 40 | "others": "· " 41 | } 42 | }, 43 | /** 44 | * 进度条样式 45 | * ·默认进度条样式: 46 | * ·已知进度:[================================= ] 67.7% 47 | * ·未知进度:[ ========== ] 48 | */ 49 | "progress": { 50 | // 进度条总长度(单位:字符) 51 | "length": 50, 52 | // 进度条最小刷新间隔(单位:毫秒) 53 | "frequency": 100, 54 | // 进度条背景 55 | "emptyStr": " ", 56 | // 进度条滑块 57 | "fullStr": "=" 58 | } 59 | }, 60 | /** 61 | * 可选功能 62 | * ·你可以根据需求开关以下可选功能。 63 | * ·错误地配置可选功能可能导致解密效果不佳,若你不了解功能的具体用途建议维持现状。 64 | */ 65 | "optionalFunction": { 66 | // 合并串联字符串('spl'+'it' → 'split') 67 | "MergeString": true, 68 | // 转换十六进制数字(0xf → 15) 69 | "ConvertHex": true, 70 | // 替换索引器(Object['keys'] → Object.keys) 71 | "ReplaceIndexer": true, 72 | // 转换Unicode字符(\x22 → ") 73 | "ConvertUnicode": true 74 | } 75 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Jsjiemi 2 | 3 | > [!IMPORTANT] 4 | > 本项目不再维护,出于以下多方面的考虑: 5 | > 6 | > * 用于执行代码的 vm2 库因**无法解决**的安全问题停止维护,这个解密器可能不再安全。 7 | > * 使用**垃圾加密工具**的人越来越少了,Jsjiemi 也完成了它的使命(抵制恶心人的垃圾加密工具)。 8 | > * 目前正在开发其它开源项目,没有足够的时间和精力维护。 9 | 10 | `Jsjiemi` 是一款基于正则匹配的 `JavaScript` 解密工具。旨在提供一个**简易**的检测手段,以便评估您所使用的加密工具是否具备足够的安全性。倘若您的代码在经过加密处理后能被成功解密,则代表该加密工具**不具有有效的代码保护能力**。 11 | 12 | ## 远程仓库 13 | 14 | > 仓库总是由 [![GitHub](https://img.shields.io/badge/GitHub-181717?style=plastic&logo=Github)](https://github.com/) 15 | > 同步至 [![Gitee](https://img.shields.io/badge/Gitee-C71D23?style=plastic&logo=Gitee)](https://gitee.com/) ,同步可能会有延迟。 16 | 17 | [![Jsjiemi - GitHub](https://img.shields.io/badge/GitHub-Jsjiemi-white?logo=Github&labelColor=181717)](https://github.com/NXY666/Jsjiemi.git)
18 | [![Jsjiemi - Gitee](https://img.shields.io/badge/Gitee-Jsjiemi-white?logo=Gitee&labelColor=C71D23)](https://gitee.com/NXY666/Jsjiemi.git) 19 | 20 | ## 解密效果 21 | 22 |
源代码 23 | 24 | ```javascript 25 | function cancelMacWithUserNameAndMac(userId, userMac, trid) { 26 | var test = confirm("关闭无感认证后,只能在设备本机上再次开启!"); 27 | if (test) { 28 | AuthInterFace.cancelMacWithUserNameAndMac(userId, userMac, function (data) { 29 | if (data.result == 'success') { 30 | //$("#"+trid).hide(); 31 | //$("#autoMacNumTip").html($("#autoMacNumTip").html()-1); 32 | var userIndex = getQueryStringByName("userIndex"); 33 | AuthInterFace.freshOnlineUserInfo(userIndex, function (freshOnline) { 34 | getTime = 1; 35 | fillData(); 36 | }); 37 | } else { 38 | alert(data.message); 39 | } 40 | }); 41 | } 42 | } 43 | ``` 44 | 45 |
46 |
加密后 47 | 48 | > 已省略全局解密函数 49 | 50 | > 为方便对比已进行格式化处理 51 | 52 | ```javascript 53 | function cancelMacWithUserNameAndMac(_0x1437f8, _0x17c421, _0x18daca) { 54 | var _0x18d784 = { 55 | 'OGRic': '4|2|6|8|0|5|7|3|9|1', 56 | 'AAvHe': function (_0x4a9629, _0x140a6c) { 57 | return _0x4a9629(_0x140a6c); 58 | }, 59 | 'wIUwe': 'margin-left', 60 | 'TQJfu': '#loginFrameLogofood_hk_2', 61 | 'Ussjm': function (_0x3a631e, _0x5a538a) { 62 | return _0x3a631e - _0x5a538a; 63 | }, 64 | 'mwhyn': function (_0x5c1515, _0x3e12d0) { 65 | return _0x5c1515 * _0x3e12d0; 66 | }, 67 | 'eMmnc': '#hk_margin_left_1', 68 | 'pROLs': _0x64f0('9c5', 'DWlJ'), 69 | 'RtPyd': function (_0x1a2925, _0x3178e2) { 70 | return _0x1a2925(_0x3178e2); 71 | }, 72 | 'ktmyn': _0x64f0('9c6', 'NMy2'), 73 | 'gxaAs': 'width', 74 | 'QzLeH': function (_0x52c760, _0x2740a1) { 75 | return _0x52c760(_0x2740a1); 76 | }, 77 | 'MhTAi': _0x64f0('9c7', '*6xD'), 78 | 'FkPFD': '#leftId', 79 | 'izkEP': _0x64f0('9c8', 'a5h*'), 80 | 'qjdIA': function (_0x2af297, _0xb650bb) { 81 | return _0x2af297 * _0xb650bb; 82 | }, 83 | 'feKqI': function (_0x1f7f78, _0x596751) { 84 | return _0x1f7f78 === _0x596751; 85 | }, 86 | 'hmFcx': 'yhlbV', 87 | 'lNkRh': function (_0x16de55) { 88 | return _0x16de55(); 89 | }, 90 | 'mGvzI': _0x64f0('9c9', 'hSvn'), 91 | 'mjXUQ': function (_0x112f06, _0x404547) { 92 | return _0x112f06 - _0x404547; 93 | }, 94 | 'dKWSL': function (_0x5dba1c, _0x2b83a9) { 95 | return _0x5dba1c(_0x2b83a9); 96 | }, 97 | 'oOHzr': function (_0x3e2c53, _0x4c0c40) { 98 | return _0x3e2c53 - _0x4c0c40; 99 | }, 100 | 'KnyVW': function (_0x1a0714, _0x336008) { 101 | return _0x1a0714(_0x336008); 102 | }, 103 | 'oJrGK': function (_0x3f8456, _0x1ddba4) { 104 | return _0x3f8456 / _0x1ddba4; 105 | }, 106 | 'hQFPI': function (_0xd930d9, _0x1db4bd) { 107 | return _0xd930d9 - _0x1db4bd; 108 | }, 109 | 'EZHrV': function (_0x5ab773, _0x3893c7) { 110 | return _0x5ab773(_0x3893c7); 111 | }, 112 | 'lMeUM': function (_0x34d463, _0x4d6b7b) { 113 | return _0x34d463 - _0x4d6b7b; 114 | }, 115 | 'aycWe': function (_0x58ef0e, _0x3891ab) { 116 | return _0x58ef0e - _0x3891ab; 117 | }, 118 | 'lKwci': _0x64f0('9ca', 'OJFQ'), 119 | 'ZkOVs': function (_0x4a6dbd, _0x4542cb) { 120 | return _0x4a6dbd - _0x4542cb; 121 | }, 122 | 'zyJTu': function (_0x5e1b93, _0x446452) { 123 | return _0x5e1b93 / _0x446452; 124 | }, 125 | 'vjWbs': function (_0x2575e0, _0x11c14c) { 126 | return _0x2575e0 / _0x11c14c; 127 | }, 128 | 'NFCIT': _0x64f0('9cb', 'Zg5['), 129 | 'dsuhf': function (_0x89f937, _0x597b3f) { 130 | return _0x89f937 + _0x597b3f; 131 | }, 132 | 'ncXTx': function (_0x12a7de, _0x22e70b) { 133 | return _0x12a7de > _0x22e70b; 134 | }, 135 | 'lPPfO': function (_0x275710, _0x5a84db) { 136 | return _0x275710(_0x5a84db); 137 | }, 138 | 'JBQXr': function (_0x287953, _0x123071, _0x2eab92) { 139 | return _0x287953(_0x123071, _0x2eab92); 140 | }, 141 | 'AMUoZ': _0x64f0('9cc', 'NMy2'), 142 | 'OzLtF': _0x64f0('9cd', 'DWlJ'), 143 | 'TBrqo': 'userIndex', 144 | 'zaUUW': function (_0x43ad2d, _0x154b85) { 145 | return _0x43ad2d !== _0x154b85; 146 | }, 147 | 'GJkAC': _0x64f0('9ce', 'gS57'), 148 | 'uJjdS': _0x64f0('9cf', 'y@FJ'), 149 | 'GKNWk': function (_0x446ff5, _0x613452) { 150 | return _0x446ff5 !== _0x613452; 151 | }, 152 | 'PcETE': _0x64f0('9d0', 'tkAR') 153 | }; 154 | var _0x3c08d6 = _0x18d784[_0x64f0('9d1', 'HmCh')](confirm, _0x18d784[_0x64f0('9d2', ')rYM')]); 155 | if (_0x3c08d6) { 156 | if (_0x18d784[_0x64f0('9d3', 'y@FJ')](_0x64f0('9d4', '7#T0'), _0x18d784['PcETE'])) { 157 | var _0x2cfb1e = _0x18d784[_0x64f0('9d5', 'a5h*')][_0x64f0('9d6', 'z1V4')]('|'), _0x234a2d = 0x0; 158 | while (!![]) { 159 | switch (_0x2cfb1e[_0x234a2d++]) { 160 | case'0': 161 | _0x18d784[_0x64f0('9d7', 'fv0b')]($, _0x64f0('9d8', 'A4bS'))[_0x64f0('9d9', '*E$X')](_0x18d784['wIUwe'], $marginLeft - 0x64); 162 | continue; 163 | case'1': 164 | $(_0x18d784[_0x64f0('9da', '7zoT')])[_0x64f0('871', 'G%jM')]('margin-left', _0x18d784['Ussjm'](0xc8, _0x18d784['mwhyn']($body, 0.1))); 165 | continue; 166 | case'2': 167 | _0x18d784[_0x64f0('9db', 'TR]&')]($, _0x18d784['eMmnc'])['css'](_0x18d784['pROLs'], $marginLeft); 168 | continue; 169 | case'3': 170 | _0x18d784[_0x64f0('9dc', 'JsoZ')]($, _0x18d784['ktmyn'])['css'](_0x18d784[_0x64f0('9dd', 'nO3k')], $width); 171 | continue; 172 | case'4': 173 | if ($marginLeft < 0x6e) { 174 | $marginLeft = 0x6e; 175 | } 176 | continue; 177 | case'5': 178 | _0x18d784[_0x64f0('9de', 'Zg5[')]($, _0x18d784['ktmyn'])['css'](_0x64f0('9df', 'xViR'), $marginLeft); 179 | continue; 180 | case'6': 181 | _0x18d784[_0x64f0('9e0', 'xViR')]($, _0x18d784[_0x64f0('9e1', '8Vu)')])['css'](_0x18d784[_0x64f0('9e2', '(DaA')], $marginLeft); 182 | continue; 183 | case'7': 184 | $(_0x18d784[_0x64f0('9e3', 't7O$')])['css'](_0x64f0('9e4', 'HmCh'), $width); 185 | continue; 186 | case'8': 187 | $(_0x18d784[_0x64f0('9e5', '8Vu)')])[_0x64f0('289', 'hSvn')](_0x64f0('9e6', 'OJFQ'), $marginLeft - 0x6e); 188 | continue; 189 | case'9': 190 | $(_0x18d784['izkEP'])[_0x64f0('26f', 'fv0b')](_0x18d784['wIUwe'], 0xc8 - _0x18d784[_0x64f0('9e7', 'kUYz')]($body, 0.1)); 191 | continue; 192 | } 193 | break; 194 | } 195 | } else { 196 | AuthInterFace[_0x64f0('9e8', 'j510')](_0x1437f8, _0x17c421, function (_0x2380dc) { 197 | var _0x3d57b1 = { 198 | 'MfrKs': function (_0x423e2b, _0x595c7e) { 199 | return _0x18d784[_0x64f0('9e9', 'hY8M')](_0x423e2b, _0x595c7e); 200 | }, 201 | 'riefY': _0x18d784[_0x64f0('9ea', '8Vu)')], 202 | 'XnjaP': function (_0x154812, _0x17b089) { 203 | return _0x18d784[_0x64f0('9eb', '4Ats')](_0x154812, _0x17b089); 204 | }, 205 | 'BtknR': function (_0x4afb84, _0x199c9f) { 206 | return _0x18d784[_0x64f0('9ec', 'DWlJ')](_0x4afb84, _0x199c9f); 207 | }, 208 | 'qyGnJ': function (_0x489a77, _0x12aaa3) { 209 | return _0x18d784[_0x64f0('9ed', 'Bk0K')](_0x489a77, _0x12aaa3); 210 | }, 211 | 'AFDMo': function (_0x4abfba, _0x219d81) { 212 | return _0x18d784[_0x64f0('9eb', '4Ats')](_0x4abfba, _0x219d81); 213 | }, 214 | 'mPxnb': function (_0x3693d8, _0x598331) { 215 | return _0x18d784['lPPfO'](_0x3693d8, _0x598331); 216 | }, 217 | 'eoqvl': function (_0x24b619, _0xfe706) { 218 | return _0x18d784[_0x64f0('9ee', 'NMy2')](_0x24b619, _0xfe706); 219 | }, 220 | 'YICcj': '小时', 221 | 'sUjOF': function (_0x1661d8, _0x395e79, _0x34d552) { 222 | return _0x18d784['JBQXr'](_0x1661d8, _0x395e79, _0x34d552); 223 | } 224 | }; 225 | if (_0x18d784[_0x64f0('9ef', 'JsoZ')](_0x18d784['AMUoZ'], _0x18d784['OzLtF'])) { 226 | limit = limit[_0x64f0('9f0', 'FBUA')](0x0, limit[_0x64f0('9f1', 'EeGR')]('B')); 227 | limit = _0x3d57b1[_0x64f0('9f2', 'kUYz')](limit, 0x400) + 'KB'; 228 | } else { 229 | if (_0x2380dc['result'] == _0x64f0('9f3', 'hSvn')) { 230 | var _0x36923d = getQueryStringByName(_0x18d784[_0x64f0('9f4', 'fv0b')]); 231 | AuthInterFace[_0x64f0('9f5', '3Pmi')](_0x36923d, function (_0x5c66cc) { 232 | if (_0x18d784[_0x64f0('9f6', '(DaA')](_0x18d784['hmFcx'], 'IAutA')) { 233 | var _0x130c29 = _0x3d57b1['riefY']['split']('|'), _0x5d6347 = 0x0; 234 | while (!![]) { 235 | switch (_0x130c29[_0x5d6347++]) { 236 | case'0': 237 | var _0x2d9053 = _0x3d57b1[_0x64f0('9f7', '3Pmi')](theTime2, ''); 238 | continue; 239 | case'1': 240 | if (_0x3d57b1['BtknR'](_0x2d9053[_0x64f0('9f8', 'Q((!')]('.'), -0x1)) { 241 | _0x2d9053 = _0x2d9053['substring'](0x0, _0x2d9053['indexOf']('.')); 242 | } 243 | continue; 244 | case'2': 245 | if (_0x3d57b1[_0x64f0('9f9', 'j510')](_0x542dd2, 0x0)) { 246 | _0x2d9053 = _0x3d57b1[_0x64f0('9fa', '7zoT')](_0x3d57b1[_0x64f0('9fb', '8Vu)')](parseInt, _0x2d9053), _0x542dd2); 247 | } 248 | continue; 249 | case'3': 250 | result = _0x3d57b1['AFDMo'](_0x3d57b1[_0x64f0('9fc', '7#T0')]('', _0x2d9053), _0x3d57b1['YICcj']); 251 | continue; 252 | case'4': 253 | var _0x542dd2 = _0x3d57b1[_0x64f0('9fd', 'kUYz')](fomatFloat, _0x3d57b1[_0x64f0('9fe', '(DaA')](_0x3d57b1[_0x64f0('9ff', 'Lclw')](parseInt, theTime1), 0x3c), 0x1); 254 | continue; 255 | } 256 | break; 257 | } 258 | } else { 259 | getTime = 0x1; 260 | _0x18d784[_0x64f0('a00', 'xViR')](fillData); 261 | } 262 | }); 263 | } else { 264 | if (_0x18d784[_0x64f0('a01', 'DWlJ')](_0x18d784[_0x64f0('a02', 'hSvn')], _0x18d784[_0x64f0('a03', '*6xD')])) { 265 | var _0x529cc9 = _0x18d784[_0x64f0('a04', 'A4bS')][_0x64f0('a05', 'EeGR')]('|'), 266 | _0x5cbedb = 0x0; 267 | while (!![]) { 268 | switch (_0x529cc9[_0x5cbedb++]) { 269 | case'0': 270 | _0x18d784[_0x64f0('a06', 'wpSi')]($, _0x64f0('a07', 'tUE5'))[_0x64f0('894', 'nO3k')](_0x18d784[_0x64f0('a08', 'Lclw')], _0x18d784[_0x64f0('a09', 'F[EM')](_0x18d784[_0x64f0('a0a', 'F[EM')]($body, 0x384) / 0x2, 0xfa)); 271 | continue; 272 | case'1': 273 | _0x18d784[_0x64f0('a0b', 'tkAR')]($, '#divPop')['css'](_0x18d784[_0x64f0('a0c', 'fv0b')], _0x18d784['oOHzr'](_0x18d784[_0x64f0('a0d', '3Pmi')]($body, 0x384) / 0x2, 0xfa)); 274 | continue; 275 | case'2': 276 | _0x18d784['KnyVW']($, _0x64f0('a0e', ')rYM'))['css'](_0x18d784[_0x64f0('a0f', 'G%jM')], _0x18d784[_0x64f0('a10', 'wpSi')](_0x18d784[_0x64f0('a11', 'hSvn')]($body, 0x384), 0x2) - 0xfa); 277 | continue; 278 | case'3': 279 | _0x18d784['EZHrV']($, _0x64f0('a12', 'G%jM'))[_0x64f0('4ed', '4Ats')](_0x64f0('a13', 'xViR'), _0x18d784[_0x64f0('a14', 'FBUA')](_0x18d784[_0x64f0('a15', 'Zg5[')](_0x18d784['aycWe']($body, 0x384), 0x2), 0xfa)); 280 | continue; 281 | case'4': 282 | $(_0x18d784[_0x64f0('a16', '4Ats')])['css'](_0x18d784['wIUwe'], _0x18d784[_0x64f0('a17', 'hSvn')](_0x18d784[_0x64f0('a18', 'Lclw')](_0x18d784[_0x64f0('a19', 'm*Jj')]($body, 0x384), 0x2), 0xd2)); 283 | continue; 284 | } 285 | break; 286 | } 287 | } else { 288 | alert(_0x2380dc[_0x64f0('868', 'xViR')]); 289 | } 290 | } 291 | } 292 | }); 293 | } 294 | } 295 | } 296 | ``` 297 | 298 |
299 |
解密后 300 | 301 | > 为方便对比已进行格式化处理 302 | 303 | ```javascript 304 | function cancelMacWithUserNameAndMac(_0x1437f8, _0x17c421, _0x18daca) { 305 | var _0x3c08d6 = confirm('关闭无感认证后,只能在设备本机上再次开启!'); 306 | if (_0x3c08d6) { 307 | AuthInterFace.cancelMacWithUserNameAndMac(_0x1437f8, _0x17c421, function (_0x2380dc) { 308 | if (_0x2380dc.result == 'success') { 309 | var _0x36923d = getQueryStringByName('userIndex'); 310 | AuthInterFace.freshOnlineUserInfo(_0x36923d, function (_0x5c66cc) { 311 | getTime = 1; 312 | fillData(); 313 | }); 314 | } else { 315 | alert(_0x2380dc.message); 316 | } 317 | }); 318 | } 319 | } 320 | ``` 321 | 322 |
323 | 324 | ## 功能介绍 325 | 326 | * 解除全局加密 327 | * 还原类似 `_0x51f5('7', 'Ik*@')` 的加密内容。 328 | * 解除代码块加密 329 | * 还原代码块中被统一收集的字符串及运算符。 330 | * 清理死代码(花指令) 331 | 1. 清理仅包含常量字符串判断的 if 语句。 332 | 2. 还原使用 `switch...while` 打乱顺序执行的语句。 333 | * 解除环境限制 334 | 1. 解除 `禁止控制台调试` 限制。 335 | 2. 解除 `禁止控制台输出` 限制。 336 | 3. 解除 `防止格式化` 限制。 337 | 4. 解除 `安全域名` 限制。 338 | * 提升代码可读性 339 | 1. 合并串联字符串(`'spl'+'it'` → `'split'`) 340 | 2. 转换十六进制数字(`0xf` → `15`) 341 | 3. 替换索引器(`Object['keys']` → `Object.keys`) 342 | 4. 转换Unicode字符(`\x22` → `"`) 343 | * 格式化代码 344 | 1. 将代码根据语句进行简易的代码缩进。 345 | 2. 因能力有限且类似工具颇多,不做更多的优化和处理。 346 | 347 | ## 使用须知 348 | 349 | * 解密文件中必须**有且仅有**通过某些**特定的**加密器加密的 `JavaScript` 代码(允许经过简单的格式化),解密前请将无关代码(如 HTML 的`