一、什么是JS反混淆工具
JS混淆是一种保护JavaScript代码的有效方式,它通过删除格式、变量名修改、代码分割、布尔运算替换等操作,使得代码难以阅读和理解,进而增强代码安全性。但对于开发人员及一些需要分析JavaScript的用户来说,混淆的代码给他们带来了极大的不便。JS反混淆工具旨在恢复被混淆的代码,使得代码更加易读、易懂,方便开发人员快速理解混淆后的代码。
二、JS反混淆的原理
实现JS反混淆的关键在于还原混淆前的代码结构和变量名,具体实现主要包括以下两种方式:
1. 基于AST的反混淆:通过解析JavaScript抽象语法树(AST),对分析出的代码块进行还原,包括还原函数名、变量名、还原代码结构等。
function a(){return b(3);}var b=function(x){return function(y){return x*y;};}
// 混淆后
function a(){return f(e)(3);}var b=function(c){return function(a){return c*a;};},f=b(2),e=3;
// 反混淆后
function a(){return b(3);}var b=function(x){return function(y){return x*y;};}
2. 字符串反混淆:通过识别字符编码等规律,还原混淆的字符串变量和函数名,再对还原后的代码进行格式化优化。
eval("var a=\"hello\"+\"world\";\nalert(a);");
// 混淆后
var _0xb79c=["\x68\x65\x6C\x6C\x6F","\x77\x6F\x72\x6C\x64"];;eval(function(p,a,c,k,e,d){e=function(c){return(c
35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p;}(_0xb79c[0]+_0xb79c[1]+";",2,2,"a|alert".split("|"),0,{}));
// 反混淆后
var a="helloworld";alert(a);
三、JS反混淆工具的使用
JS反混淆工具的使用一般分为两种方式:
1. 通过在线工具反混淆:在浏览器中访问JS反混淆工具网站,将混淆的代码粘贴到工具中,点击工具的解混淆按钮即可得到还原后的代码。
<html>
<head>
<title>JS反混淆工具</title>
<script src="https://cdn.jsdelivr.net/npm/javascript-obfuscator@1.0.3/dist/index.js"></script>
</head>
<body>
<textarea id="obfuscateCode"></textarea>
<button onclick="decrypt()">解混淆</button>
<br>
<textarea id="resultCode"></textarea>
<script>
function decrypt() {
var obfuscateCode = document.getElementById("obfuscateCode").value;
var beautifyResult = window.JavascriptObfuscator.beautify(obfuscateCode, {compact: true, controlFlowFlattening: true});
document.getElementById("resultCode").value = beautifyResult;
}
</script>
</body>
</html>
2. 通过npm模块实现本地反混淆:开发人员可以在本地安装js反混淆工具npm模块,在命令行工具中运行指定命令即可实现代码的反混淆。
npm i javascript-obfuscator -g
// 反混淆index.js文件
javascript-obfuscator index.js -o index.decrypt.js
四、JS反混淆工具的注意事项
JS反混淆工具能够一定程度上恢复混淆前的代码,但也有以下几个需要注意的问题:
1. 特殊字符还原不完全:混淆一些特殊字符串时,很可能会用十六进制或Unicode编码替换字符,这时需要使用特殊功能解码器进行解码,但是到万无一失的还原是不可能的,一些字符可能没有还原回来,需要开发者手动修改。
2. 动态混淆难以处理:一些混淆代码动态生成的,在反混淆时如果用的是静态分析方式就无法处理。
3. 可能存在误判:一些代码可能是其本身的混淆形式,但经过反混淆后被误判成为混淆语句。这种情况发生的概率很小,但需要进行一些额外的校验。