几种常见的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 代码功能。

相关文章
相关标签/搜索