技能共享:几种常见的JavaScript混杂和反混杂东西剖析实战
信息安全常被描述成一场军备竞赛,白帽与黑帽,浸透测验者与黑客,善与恶,本文将聚集这场永无止境决战中的一个小点。
HTML5 & JS 运用中充满着对输入进行验证/注入的问题,需求开发人员一直保持警惕。但一起还存在着另一个问题,便是运用中程序专用代码的易拜访性。为了避免盗版或许至少使盗版愈加困难,常会运用混杂东西对 JS 代码进行混杂。作为对立面,反混杂东西也能够将混杂过的 JS 代码进行复原。我从前触摸过两边的一些东西,下面是我的一些研究成果。
首要,下面这是咱们的示例代码(取自Google Closure Compiler的 Wiki 页面)。一个完好的运用程序中代码会愈加杂乱,但这儿足以用于试验了:
function displayNoteTitle(note) {
alert(note['title']);
}
var flowerNote = {};
flowerNote['title'] = "Flowers";
displayNoteTitle(flowerNote);
接下来,让咱们来罗列下要进行试验的混杂和反混杂东西,本文中会试验 4 个混杂东西和 2 个反混杂东西。
混杂东西:
YUI Compressor
Google Closure Compiler
UglifyJS
JScrambler
反混杂东西:
jsbeautifier.org
JSDetox
以上除了 JScrambler 是商业软件需求付费运用外,其他悉数为免费软件。
缩小和混杂
下面首要让咱们看看混杂东西的混杂作用怎么,随后在看看反混杂东西的体现又怎么。
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"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);
[1] [2] 黑客接单网