javascript
js混淆还原工具_技术分享:几种常见的JavaScript混淆和反混淆工具分析实战
信息安全常被描述成一場軍備競賽,白帽與黑帽,滲透測試者與黑客,善與惡,本文將聚焦這場永無止境決斗中的一個(gè)小點(diǎn)。
HTML5 & JS 應(yīng)用中充滿著對輸入進(jìn)行驗(yàn)證/注入的問題,需要開發(fā)人員始終保持警惕。但同時(shí)還存在著另一個(gè)問題,就是應(yīng)用中程序?qū)S么a的易訪問性。為了防止盜版或者至少使盜版更加困難,常會(huì)使用混淆工具對 JS 代碼進(jìn)行混淆。作為對立面,反混淆工具也可以將混淆過的 JS 代碼進(jìn)行還原。我曾經(jīng)接觸過雙方的一些工具,下面是我的一些研究成果。
首先,下面這是我們的示例代碼(取自Google Closure Compiler的 Wiki 頁面)。一個(gè)完整的應(yīng)用程序中代碼會(huì)更加復(fù)雜,但這里足以用于實(shí)驗(yàn)了:function displayNoteTitle(note) {
alert(note['title']);
}
var flowerNote = {};
flowerNote['title'] = "Flowers";
displayNoteTitle(flowerNote);
接下來,讓我們來列舉下要進(jìn)行實(shí)驗(yàn)的混淆和反混淆工具,本文中會(huì)實(shí)驗(yàn) 4 個(gè)混淆工具和 2 個(gè)反混淆工具。
混淆工具:
反混淆工具:
以上除了 JScrambler 是商業(yè)軟件需要付費(fèi)使用外,其余全部為免費(fèi)軟件。
縮小和混淆
下面首先讓我們看看混淆工具的混淆效果如何,隨后在看看反混淆工具的表現(xiàn)又如何。
YUI Compressorfunction displayNoteTitle(a){alert(a.title)}var flowerNote={};flowerNote.title="Flowers";displayNoteTitle(flowerNote);
Google Closure Compiler
這個(gè)工具有優(yōu)化和混淆兩種類型:
簡單優(yōu)化:function displayNoteTitle(a){alert(a.title)}var flowerNote={title:"Flowers"};displayNoteTitle(flowerNote);
深度優(yōu)化:alert("Flowers");
UglifyJS
同前一個(gè)工具一樣,UglifyJS 也有兩種層次的混淆:
默認(rèn):function displayNoteTitle(e){alert(e.title)}var flowerNote={};flowerNote.title="Flowers",displayNoteTitle(flowerNote);
高級:function t(t){alert(t.title)}var e={};e.title="Flowers",t(e);
JScrambler/* Obfuscate your JavaScript at https://jscrambler.com */var g5b={'S':"A",'A':function(b){flowerNote['title']=b;},'X':"V",'o':(function(E){return (function(s,p){return (function(G){return {K:G};})(function(m){var c,R=0;for(var U=s;Ry;})(parseInt,Date,(function(n){return (''+n)["substring"](1,(n+'')["length"]-1);})('_getTime2'),function(n,a){return new n()[a]();}),function(m,R){var d=parseInt(m["charAt"](R),16)["toString"](2);return d["charAt"](d["length"]-1);});})('3lrno3f7c'),'e':'title','V':function(b){x=b;},'Q':"Flowers",};function displayNoteTitle(b){alert(b[g5b.e]);}var flowerNote=g5b.o.K("3d3")?{}:"Flowers";g5b[g5b.S](g5b.Q);displayNoteTitle(flowerNote);g5b[g5b.X](g5b.D);
那么,上面的代碼是什么意思呢?顯而易見,YUI Compressor,Google closure compiler 的簡單優(yōu)化模式和 UglifyJS 的默認(rèn)模式都使用了相同的方法對 JS 代碼進(jìn)行縮小和混淆。縮小意味著壓縮代碼、減小應(yīng)用程序的體積或者降低瀏覽器的加載時(shí)間。所有的這一切,在將變量名改為一個(gè)無意義的字符后,代碼會(huì)變得難以閱讀。
UglifyJS 的高級模式會(huì)進(jìn)一步混淆函數(shù)名和全局變量的名稱。Google closure compiler 的深度優(yōu)化模式同時(shí)還會(huì)積極的刪除無用代碼,它追求最簡。
而 JScrambler 則是另一種方式,它專注于對代碼進(jìn)行混淆,不僅不對代碼進(jìn)行縮小,反而通過增加代碼數(shù)量使代碼變的難以閱讀。
美化和反混淆
jsbeautifier.org
正如其名字一樣,這個(gè)在線工具試圖將縮小后的代碼變的更加具有可讀性,但似乎它不會(huì)對代碼進(jìn)行進(jìn)一步的反混淆。
YUI Compressor -> jsbeautifiedfunction displayNoteTitle(e) {
alert(e.title)
}
var flowerNote = {};
flowerNote.title = "Flowers", displayNoteTitle(flowerNote);
UglifyJS Toplevel -> jsbeautified:function t(t) {
alert(t.title)
}
var e = {};
e.title = "Flowers", t(e);
JSDetox
對 UglifyJS 高級模式的代碼使用 JSDetox 似乎并不比 jsbeautifier.org 好多少,這點(diǎn)可以理解的,畢竟對變量/函數(shù)名進(jìn)行轉(zhuǎn)換這是不可逆的過程。
高級的反混淆和惡意代碼檢測
一般的代碼混淆常用于知識(shí)產(chǎn)權(quán)保護(hù),而高級的代碼混淆則常會(huì)被用于隱藏 WEB 應(yīng)用中的惡意代碼。對惡意代碼進(jìn)行混淆是為了躲避殺毒軟件的檢測,這些代碼在被混淆擴(kuò)充后會(huì)難以被識(shí)別為惡意軟件。Metasploit 的 Javascript 混淆器常被用于開發(fā)惡意代碼,所以我們下面使用 Metasploit 的混淆器對我們的代碼進(jìn)行混淆(參考文檔)。JSDetox 聲稱其具有進(jìn)行反混淆 JS 代碼的能力,所以下面讓我們來嘗試下對 Metasploit 和 JScrambler 混淆后的代碼進(jìn)行高級的反混淆。
Metasploit Javascript 混淆器function L(t){window[String.fromCharCode(0141,0x6c,101,0162,0164)](t[String.fromCharCode(0164,105,0164,108,0145)]);}var C={};C[(function () { var K='le',Z='tit'; return Z+K })()]=(function () { var m="s",D="r",J="F",e="lowe"; return J+e+D+m })();L(C);
使用 JSDetox 進(jìn)行反混淆
JScrambler -> JSDetoxedvar g5b = {
'S': "A",
'A': function(b) {
flowerNote['title'] = b;
},
'X': "V",
'o': (function(E) {
return (function(s, p) {
return (function(G) {
return {
K: G
};
})(function(m) {
var c, R = 0;
for(var U = s; R < m["length"]; R++) {
var O = p(m, R);
c = R === 0 ? O : c ^ O;
}
return c ? U : !U;
});
})((function(h, n, a, M) {
return h(E, 28) - M(n, a) > 28;
})(parseInt, Date, (function(n) {
return ('' + n)["substring"](1, (n + '')["length"] - 1);
})('_getTime2'), function(n, a) {
return new n()[a]();
}), function(m, R) {
var d = parseInt(m["charAt"](R), 16)["toString"](2);
return d["charAt"](d["length"] - 1);
});
})('3lrno3f7c'),
'e': 'title',
'V': function(b) {
x = b;
},
'Q': "Flowers"
};
function displayNoteTitle(b){
alert(b[g5b.e]);
}
var flowerNote = g5b.o.K("3d3") ? { } : "Flowers";
g5b[g5b.S](g5b.Q);
displayNoteTitle(flowerNote);
g5b[g5b.X](g5b.D);
Metasploit -> JSDetoxedfunction L(t){
window["alert"](t["title"]);
}
var C = { };
C["title"] = "Flowers";
L(C);
盡管經(jīng)過 Metasploit 混淆后的 JS 代碼依舊可以躲避殺毒軟件,但看起來也會(huì)輕易被 JSDetox 進(jìn)行反混淆。有趣的是,看起來 JSDetox 無法反混淆 JScrambled 的代碼。我不確定為什么 JSDetox 可以反混淆出 metasploit 的代碼卻不能反混淆出 JScrambler 的,不過我猜測是 JSDetox 專門針對 metasploit 的混淆方法做過專門的支持。另一方面,JScrambler 完全是一個(gè)黑盒,但這并不意味著 JScrambled 混淆后的 Javascript 代碼不能被反混淆,也許有另一個(gè)工具專門用于或包含反混淆 JScrambled 代碼功能。
*原文:damilarefagbemi,FB小編xiaix編譯,轉(zhuǎn)自須注明來自FreeBuf黑客與極客(FreeBuf.COM)
總結(jié)
以上是生活随笔為你收集整理的js混淆还原工具_技术分享:几种常见的JavaScript混淆和反混淆工具分析实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LAMP(7限定某个目录禁止解析php、
- 下一篇: IDEA将项目上传至码云/GitHub托