前几天逛论坛,有人寻一段被加密的 JS 代码的解密方法。
加密很典型,开头有一个 ;var encode_version = 'sojson.v5'
之前见过很多次,但是并没有太在意这个,这次既然又看到了,兴趣大增。
于是,我决定看一下怎么解密出来。
而且,我认为前段 JS 这边,就不可能有真正的加密,最多是混淆。
而加密与混淆,不太符合互联网开源精神,我倒要看看你藏着的是什么宝贝代码。
经过一下午的折腾,最终这个脚本还是被我搞出来了。
实现脱壳、解密、去混淆,但是被打乱的变量名之类的是不太可能恢复了,只能自己阅读代码还原了。
作者说的是对的,绝对不可逆是真的,毕竟一开始就把很多信息丢失了。
而且,我认为一边做着最牛加密,一边承接付费加密、解密是很没底线的事。
(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());
小白求教!这个脚本咋用呀,大哥
不带服务的
为什么我控制台,输入会出错
仅demo 不保证可用
加密的js复杂点,貌似就没用了
只是个 demo
怎么用啊。。我看了半天愣是没看懂,可以跟我讲一下怎么输入数据以及输入怎样的数据吗
最末尾行可以注入需要解密的代码