幾種常見的JavaScript混淆和反混淆工具分析實戰

幾種常見的JavaScript混淆和反混淆工具分析實戰

xiaix2016-03-05+8共1195751人圍觀 ,發現 5 個不明物體WEB安全

 

信息安全常被描述成一場軍備競賽,白帽與黑帽,滲透測試者與黑客,善與惡,本文將聚焦這場永無止境決鬥中的一個小點。javascript

HTML5 & JS 應用中充滿着對輸入進行驗證/注入的問題,須要開發人員始終保持警戒。但同時還存在着另外一個問題,就是應用中程序專用代碼的易訪問性。爲了防止盜版或者至少使盜版更加困難,常會使用混淆工具對 JS 代碼進行混淆。做爲對立面,反混淆工具也能夠將混淆過的 JS 代碼進行還原。我曾經接觸過雙方的一些工具,下面是個人一些研究成果。html

首先,下面這是咱們的示例代碼(取自Google Closure Compiler的 Wiki 頁面)。一個完整的應用程序中代碼會更加複雜,但這裏足以用於實驗了:html5

function displayNoteTitle(note) { alert(note['title']); } var flowerNote = {}; flowerNote['title'] = "Flowers"; displayNoteTitle(flowerNote); 

接下來,讓咱們來列舉下要進行實驗的混淆和反混淆工具,本文中會實驗 4 個混淆工具和 2 個反混淆工具。java

混淆工具:git

反混淆工具:github

以上除了 JScrambler 是商業軟件須要付費使用外,其他所有爲免費軟件。web

縮小和混淆

下面首先讓咱們看看混淆工具的混淆效果如何,隨後在看看反混淆工具的表現又如何。api

YUI Compressor

function displayNoteTitle(a){alert(a.title)}var flowerNote={};flowerNote.title="Flowers";displayNoteTitle(flowerNote); 

Google Closure Compiler

這個工具備優化和混淆兩種類型:瀏覽器

簡單優化:

function displayNoteTitle(a){alert(a.title)}var flowerNote={title:"Flowers"};displayNoteTitle(flowerNote); 

深度優化:

alert("Flowers"); 

UglifyJS

同前一個工具同樣,UglifyJS 也有兩種層次的混淆:安全

默認:

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;R<m["length"];R++){var O=p(m,R);c=R===0?O:c^O;}return c?U:!U;});})((function(h,n,a,M){var y=28;return h(E,y)-M(n,a)>y;})(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 的簡單優化模式和 UglifyJS 的默認模式都使用了相同的方法對 JS 代碼進行縮小和混淆。縮小意味着壓縮代碼、減少應用程序的體積或者下降瀏覽器的加載時間。全部的這一切,在將變量名改成一個無心義的字符後,代碼會變得難以閱讀。

UglifyJS 的高級模式會進一步混淆函數名和全局變量的名稱。Google closure compiler 的深度優化模式同時還會積極的刪除無用代碼,它追求最簡。

而 JScrambler 則是另外一種方式,它專一於對代碼進行混淆,不只不對代碼進行縮小,反而經過增長代碼數量使代碼變的難以閱讀。

美化和反混淆

jsbeautifier.org

正如其名字同樣,這個在線工具試圖將縮小後的代碼變的更加具備可讀性,但彷佛它不會對代碼進行進一步的反混淆。

YUI Compressor -> jsbeautified

function 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 好多少,這點能夠理解的,畢竟對變量/函數名進行轉換這是不可逆的過程。

高級的反混淆和惡意代碼檢測

通常的代碼混淆經常使用於知識產權保護,而高級的代碼混淆則常會被用於隱藏 WEB 應用中的惡意代碼。對惡意代碼進行混淆是爲了躲避殺毒軟件的檢測,這些代碼在被混淆擴充後會難以被識別爲惡意軟件。Metasploit 的 Javascript 混淆器常被用於開發惡意代碼,因此咱們下面使用 Metasploit 的混淆器對咱們的代碼進行混淆(參考文檔)。JSDetox 聲稱其具備進行反混淆 JS 代碼的能力,因此下面讓咱們來嘗試下對 Metasploit 和 JScrambler 混淆後的代碼進行高級的反混淆。

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 進行反混淆

JScrambler -> JSDetoxed

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; 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 -> JSDetoxed

function L(t){ window["alert"](t["title"]); } var C = { }; C["title"] = "Flowers"; L(C); 

儘管通過 Metasploit 混淆後的 JS 代碼依舊能夠躲避殺毒軟件,但看起來也會輕易被 JSDetox 進行反混淆。有趣的是,看起來 JSDetox 沒法反混淆 JScrambled 的代碼。我不肯定爲何 JSDetox 能夠反混淆出 metasploit 的代碼卻不能反混淆出 JScrambler 的,不過我猜想是 JSDetox 專門針對 metasploit 的混淆方法作過專門的支持。另外一方面,JScrambler 徹底是一個黑盒,但這並不意味着 JScrambled 混淆後的 Javascript 代碼不能被反混淆,也許有另外一個工具專門用於或包含反混淆 JScrambled 代碼功能。

相關文章
相關標籤/搜索