yyyyyyyyyyyyyyyyyyyy

博客园 首页 新随笔 联系 订阅 管理

几种常见的JavaScript混淆和反混淆工具分析实战

xiaix2016-03-05+8共1195751人围观 ,发现 5 个不明物体WEB安全

 

信息安全常被描述成一场军备竞赛,白帽与黑帽,渗透测试者与黑客,善与恶,本文将聚焦这场永无止境决斗中的一个小点。

HTML5 & JS 应用中充满着对输入进行验证/注入的问题,需要开发人员始终保持警惕。但同时还存在着另一个问题,就是应用中程序专用代码的易访问性。为了防止盗版或者至少使盗版更加困难,常会使用混淆工具对 JS 代码进行混淆。作为对立面,反混淆工具也可以将混淆过的 JS 代码进行还原。我曾经接触过双方的一些工具,下面是我的一些研究成果。

首先,下面这是我们的示例代码(取自Google Closure Compiler的 Wiki 页面)。一个完整的应用程序中代码会更加复杂,但这里足以用于实验了:

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

接下来,让我们来列举下要进行实验的混淆和反混淆工具,本文中会实验 4 个混淆工具和 2 个反混淆工具。

混淆工具:

反混淆工具:

以上除了 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<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 代码功能。

posted on 2019-01-08 10:11  xxxxxxxx1x2xxxxxxx  阅读(1021)  评论(0编辑  收藏  举报