打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
前两天有 V 友问一个加密的 JS 怎么解密,于是今天脱壳?解密的脚本出来了。

当时追了下代码挺感兴趣,正好还有时间,就开搞了。

主要是看作者写的 “最牛加密” 挺不爽的...

用了一下午的时间分析和写脚本,测试能解开普通默认的加密了

没有去适配所谓的强加密什么的...

当然,整体思路缕下来还是很简单的,

就是先把一个数组(最开始的 base64)切开前后对换。

然后代码部分可能用字符串处理的都用一个方法通过 rc4 解密返回调用。

大致就是下面这样的了...

// 此数组的值应该是 base64 为了方便看就明文了var arr = ['hello', 'alert', 'test', 'debug', 'world'];arr = [].concat(arr.splice(1, 3), arr);window[rc4(0, '密钥 1')](rc4(1, '密钥 2'));

我认为互联网本应开源,而且前端没有真正意义的加密,能执行就一定能解密。

当然,作者说 “绝对不可逆 / 耶稣也无法 100%还原” 是真的,

因为 YUI compressor 压缩也是不可逆的...

变量名都被改掉了,显然无可能还原了...

解密代码:

(function (js_body) {    // 脱壳    let js_arr = js_body.split("\n").pop().split(';'),        fun_name = /var\s+(_0x[a-z0-9]+)=/.exec(js_arr[6])[1],        reg_str = fun_name + '\\(' + "'([^']+)',\s*'([^']+)'" + '\\)',        js_str = js_arr.slice(54, js_arr.length - 4).join(';'),        code_shell = js_arr.slice(0, 54).join(';'),        shell_obj = eval("(function(){" + code_shell + ";return " + fun_name + "})()");    js_str = js_str.replace(new RegExp(reg_str, 'g'), function (str, id, key) {        return '"' + shell_obj(id, key) + '"';    }).replace(/([a-z0-9\-_A-Z)\]]+)\s?\[["']([^"']+)["']\]/g, '$1.$2').replace(/(?<!_)(0x[0-9a-f]+)/g, function (hex) {        return parseInt(hex).toString();    });    // 还原混淆    let obj = null, name = '';    js_str = js_str.replace(/{(var\s+(_0x[0-9a-z]+)=(\{(.*)\}));/g, function (str, code_str, _name, obj_str) {        obj = eval("(function () {return " + obj_str + "})()");        name = _name;        return '{';    });    if (obj) {        let i = 5;        while (js_str.indexOf(name) && --i > 0) {            for (const key in obj) {                if (!obj.hasOwnProperty(key)) continue;                if (typeof obj[key] == 'function') {                    let fun_info = /function\s*_0x[0-9a-z]+\(([^)]*)\){return\s*([^;]+);}/.exec(obj[key].toString());                    js_str = js_str.replace(new RegExp(name + '\\.' + key + '\\(([^())]*)\\)', 'g'), function (string, args_str) {                        let args = args_str.split(','),                            fun_args = fun_info[1].split(','),                            fun_body = fun_info[2];                        fun_args.forEach(function (item, index) {                            fun_body = fun_body.replace(item, args[index]);                        });                        return fun_body;                    });                } else if (typeof obj[key] == 'string') {                    js_str = js_str.replace(name + '.' + key, '"' + obj[key] + '"');                } else {                    js_str = js_str.replace(name + '.' + key, obj[key].toString());                }            }        }    }    return js_str;})($('#resultSource').val() || $('#jsdata').val());

我的小站:https://www.qs5.org/Post/673.html

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
json在php与js中的应用
js的对象
Javascript[0x06] -- 基于Javascript范畴代码风格和规范的总结
javascript笔记
Linux下shell脚本加密
常用作帖、发帖代码集萃
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服