Js 的 混淆 与反混淆
Js 混淆:
功能很多,暂举两个:
1、Identifier Names Generator : 把变量、方法的名字变成 16进制(0xabc123) 或者 无意义的字母(a,b,c等)
2、String Array:把所有的字符串,抽取到一个数组中,调用的地方,通过一个方法算出index,然后到这个数组中取出字符串。
var _0x5a62 = ['log', 'Hello\x20World!']; var _0x5340 = function(_0x3b4f00, _0x1c66d8) { _0x3b4f00 = _0x3b4f00 - 0x0; var _0x4d4bfa = _0x5a62[_0x3b4f00]; return _0x4d4bfa; }; function hi() { console[_0x5340('0x0')](_0x5340('0x1')); }
3、利用JS的语法特性打乱原有的代码
Js反混淆:
1、先用自己写的tools1将 混淆的js中抽取到String Array中的那些字符串,还原到代码中去 (执行完后若发现还存在 _0x5461 未被替换,则将处理完的代码再处理一次即可)
原理: 从加密代码中找出 StringArrays 和 算 该数组的index的方法(比如为 _0x5461方法),再通过正则 遍历加密的js的文本,
将调用的地方(包含有_0x5461(...) 的地方)截取出来,通过eval进行运算得出真正的string,再替换回去。
2、然后将上一步处理过后的结果 放到 http://jsnice.org/ 通过 人工智能 帮忙还原部分属性和方法的命名
注意:
a、该网站用了google CDN提供的jquery,需要fanqiang才能使用
b、该网站无法处理es6的js,所以先需要将代码转成es5(通过 https://es6console.com/ 先将混淆的js 从es6 转为 es5)。
3、最后将 上一步处理后的代码 通过 tools2 将 剩下的_0x开头的 转换为 a1,a2,方便阅读
原理: 将上一步处理后的代码进行遍历,寻找 _0x开头的 转换为 a1,a2
补充:
所有的动作完成后,曾今尝试过 将代码放到 https://mindedsecurity.github.io/jstillery/# 进一步处理,
发现效果不明显,而且会导致代码处理后语法出错,不建议。
参考:estools 辅助反混淆 Javascript – 0xCC
参考文章中的 https://github.com/ChiChou/etacsufbo 已废弃,不再有用了。
另一篇文章中说的 “javascript-obfuscator对应的解混淆工具crack.js” 也是无用的。https://github.com/jscck/crack.js/blob/master/crack.js