源码反编译软件-技术分享:几种常见的JavaScript混淆与反混淆工具实战分析

信息安全常常被形容为一场军备竞赛源码反编译软件,白帽与黑帽、渗透测试员与黑客、善与恶,本文将重点关注这场永无休止的对决中的一个小点。

HTML5&JS应用程序充满了输入验证/注入的问题,这需要开发人员始终保持警惕。 但还有另一个问题,即特定于应用程序的代码的可访问性。 为了避免盗版或者至少增加盗版的难度,通常会使用混淆工具来混淆 JS 代码。 相反,反混淆工具也可以恢复混淆后的JS代码。 我之前接触过双方的一些工具,下面是我的一些研究成果。

首先,下面是我们的示例代码(取自 GoogleClosureCompiler Wiki 页面)。 在完整的应用程序中,代码会更复杂,但对于实验来说已经足够了:

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

接下来我们列出要测试的混淆和反混淆工具。 本文将测试 4 个混淆工具和 2 个反混淆工具。

混淆工具:

反混淆工具:

JScrambler不仅是需要付费的商业软件,其余的都是免费软件。

源码反编译软件-技术分享:几种常见的JavaScript混淆与反混淆工具实战分析

缩小和混淆

我们先看看混淆工具的混淆效果,然后再看看反混淆工具的性能。

YUI压缩器

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

GoogleClosure编译器

该工具有两种类型:优化和混淆:

简单优化:

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

源码反编译软件-技术分享:几种常见的JavaScript混淆与反混淆工具实战分析

深度优化:

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

源码反编译软件-技术分享:几种常见的JavaScript混淆与反混淆工具实战分析

JS扰频器

/* 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);

那么,里面的代码是什么意思呢? 显然,YUICompressor、Google闭包编译器的简单优化模式和UglifyJS的默认模式都使用相同的方法来压缩和混淆JS代码。 缩小意味着压缩代码、减小应用程序的大小或增加浏览器的加载时间。 总而言之,将变量名改为无意义的字符后,代码就会变得不可读。

UglifyJS的中间模式进一步混淆了函数名称和全局变量名称。 Googleclosurecompiler的深度优化模式也会主动删除无用代码,追求简洁。

JScrambler 是另一种形式。 它专注于混淆代码。 除了不收缩代码之外,它还通过减少代码数量来使代码变得不可读。

美化和反混淆 jsbeautifier.org

顾名思义,这个在线工具试图使缩小的代码更具可读性,但它不会进一步对代码进行反混淆。

YUICompressor->jsbeautified

源码反编译软件-技术分享:几种常见的JavaScript混淆与反混淆工具实战分析

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

UglifyJSToplevel->jsbeautified:

function t(t) {
    alert(t.title)
}
var e = {};
e.title = "Flowers", t(e);

JS排毒

使用 JSDetox 进行 UglifyJS 中间模式代码实际上并不比 jsbeautifier.org 好多少,这是可以理解的,尽管转换变量/函数名称是一个不可逆的过程。

中级反混淆和恶意代码检查

普通代码混淆常用于知识产权保护,而中间代码混淆常用于隐藏WEB应用中的恶意代码。 混淆恶意代码的目的是避免被防病毒软件检测到。 该代码经过混淆和扩展后不会被识别为恶意软件。 Metasploit的Javascript混淆器经常被用来开发恶意代码,因此我们使用Metasploit的混淆器来混淆我们的代码()。 JSDetox 声称它具有对 JS 代码进行反混淆的能力,因此我们尝试对 Metasploit 和 JScrambler 混淆代码进行中间反混淆。

MetasploitJavascript 混淆器

源码反编译软件-技术分享:几种常见的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->JS 解毒

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)

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 源码反编译软件-技术分享:几种常见的JavaScript混淆与反混淆工具实战分析 https://www.wkzy.net/game/186262.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务