一、什麼是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(c35?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. 可能存在誤判:一些代碼可能是其本身的混淆形式,但經過反混淆後被誤判成為混淆語句。這種情況發生的概率很小,但需要進行一些額外的校驗。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/283495.html