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

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

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 代码功能。

*原文:damilarefagbemi,FB小编xiaix编译,转自须注明来自FreeBuf黑客与极客(FreeBuf.COM)

  • 8
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JS混淆压缩工具是一种用于还原经过混淆压缩处理的JavaScript代码工具JavaScript代码经过混淆压缩处理后,变量名、函数名和代码结构都被改变,使得代码变得难以阅读和理解。 混淆是指通过逆向工程的方法,还原被混淆处理的代码。这样可以使开发人员更容易理解代码逻辑和修改代码,也有助于安全研究人员分析代码漏洞。 压缩是指将经过压缩处理的代码还原为可读性更好的形式。在代码压缩过程中,会删除空格、缩进、注释等,同时对代码进行重写以减少文件大小。压缩工具可以还原代码结构,使之恢复为可读性更好的形式。 JS混淆压缩工具一般通过解析和重构混淆压缩后的代码来实现。它们可以自动还原变量名、函数名,修复语法错误,还原代码结构,保留注释等。常见混淆压缩工具有UglifyJS、Terser、Babel等。 但是需要注意的是,即使使用了混淆压缩工具,完全还原出原始代码可能是不太可能的。因为混淆压缩过程中可能还进行了其他特殊处理,如删除无用代码代码优化等。此外,混淆压缩工具只适用于用于学习和分析代码,不应用于非法用途,以保护代码作者的合法权益。 ### 回答2: JS混淆压缩工具是一种用于还原经过混淆和压缩处理的JavaScript代码工具。由于混淆和压缩会使代码变得难以阅读和理解,而且容易隐藏恶意代码,因此混淆压缩工具对于安全性和代码维护性非常重要。 JS混淆工具的主要功能是将经过混淆处理的代码还原为易读的形式。它可以根据一些特定的识别规则,识别和还原变量名、函数名等混淆后的标识符。通过混淆,我们可以更容易地理解代码的逻辑和结构,提高代码的可维护性和可读性。 JS压缩工具的主要功能是将经过压缩处理的代码还原为格式化的形式。它可以自动添加换行、缩进和空格等,使得代码更易于阅读和编辑。压缩可以帮助开发人员更方便地调试和修改代码,提高开发效率。 目前,有许多JS混淆压缩工具可供使用。一些流行的工具包括:UglifyJS、Terser、JSNice等。这些工具具有各自的特点和功能,可以根据具体需求选择合适的工具使用。 总之,JS混淆压缩工具对于提高代码安全性、可读性和可维护性具有重要作用。通过使用这些工具,开发人员可以更方便地理解、调试和修改代码,从而提高开发效率和代码质量。 ### 回答3: JS混淆压缩是用于还原经过混淆和压缩的Javascript代码工具混淆和压缩是为了减小代码体积和加强代码防护而进行的操作,但也给代码的阅读和理解带来了困难。 JS混淆工具主要通过对混淆后的变量、函数名、属性名进行逆向推算,还原出其原有的可读性较高的标识符。这种工具一般基于静态分析和语义分析技术,通过模式匹配、代码分析和控制流分析等方法,逆推原始代码的标识符,从而提高代码的可读性。 JS压缩工具主要是针对通过压缩工具代码进行了无损压缩的情况,还原出原始的格式和布局。这种工具通过识别特定的压缩技术(如代码变量替换、代码优化、多行合并等),并对其进行向操作,还原出原始的代码结构和格式。 总之,JS混淆压缩工具的目的是为了提高代码的可读性和可维护性,方便开发人员阅读和理解代码,同时也有助于代码审计和漏洞发现。但需要注意的是,使用这些工具应遵守相关法律法规,不用于非法用途,以保护代码的合法性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值