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

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

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

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

    信息安全常被描述成一场军备竞赛,白帽与黑帽,渗透测试者与黑客,善与恶,本文将聚焦这场永无止境决斗中的一个小点. HTML5 & JS 应用中充满着对输入进行验证/注入的问题,需要开发人员始终保 ...

  2. 给大家推荐一个.Net的混淆防反编译工具ConfuserEx

    给大家推荐一个.Net的混淆防反编译工具ConfuserEx. 由于项目中要用到.Net的混淆防反编译工具. 在网上找了很多.Net混淆或混淆防反编译工具,如.NET Reactor.Dotfusca ...

  3. C#,网络爬虫的原型图、博客模板图以及代码混淆与反混淆斗争的故事

    标题党而已,谨慎阅读. 图1 清华大学出版社盗图留念 精通并部署大型爬虫的时候,估计绝大多数国人都没听说过什么是爬虫. 国内的大网站都曾经被俺的爬虫搞惨,好在俺不为名不为利,劝客户及时收手,以免坏了人 ...

  4. php 服务器方案,分享几种常见WEB服务器配置方案

    在众多专用服务器中,WEB服务器应该是我们最为熟知和常用到的了,根据不同的建站及WEB需求,WEB服务器有着好几种常见的环境配置方案,这里就总结分享一下: 当前比较流行的配置就是跑php一般就是,ph ...

  5. 12.混淆——数字音频采样,混淆,反混淆,脉冲序列_2

    目录 数字音频采样 混淆 反混淆 脉冲序列 数字音频采样 继续考虑数字音频,我们可以考虑一些音乐或任何其他处理音频的方式. 当我们录制声音时,我们有麦克风和麦克风产生连续电压(如图). 顺便问一下,你 ...

  6. [PHP]浅谈php混淆与反混淆

    PHP编译 PHP是解析型高级语言,事实上从Zend内核的角度来看PHP就是一个普通的C程序,它有main函数,我们写的PHP代码是这个程序的输入,然后经过内核的处理输出结果,内核将PHP代码&quo ...

  7. Js 的 混淆 与反混淆

    Js 混淆: https://obfuscator.io/ 功能很多,暂举两个: 1.Identifier Names Generator : 把变量.方法的名字变成 16进制(0xabc123) 或 ...

  8. Java后端知识之代码混淆-避免反编译工具获取原码

    java, 代码混淆, 编译, 反编译 本文是向大家介绍java后端小知识,它能够实现编译后的class代码加密,能够避免使用反编译工具获取源码. 本文介绍java代码编译成class后,怎么避免用反 ...

  9. 免费的.NET混淆和反编译工具

    免费的.NET代码混淆工具: Eazfuscator.NET  http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.as ...

最新文章

  1. python 词云_利用Python生成词云
  2. pwa要离线html么,正确使用PWA
  3. 设置为true有什么区别_海绵与珍珠棉有什么区别?天南包装小编为您分析
  4. leetcode-121-买卖股票的最佳时机
  5. when is view bound to its corresponding controller instance
  6. Java企业面试算法新得体会之4递归和动态规划问题17问
  7. python Pipe
  8. 【zoj2314】Reactor Cooling 有上下界可行流
  9. EXTJS4自学手册——EXT基本方法、属性(mixins多继承、statics、require)
  10. 34个省域统计年鉴合集(32省更新至2020年)
  11. RDPWrap帮助Win10家庭版开启远程桌面功能
  12. python批量打印mathcad_全能批量打印工具-兼容所有打印机
  13. 北京国际车展直击:上汽集团近百款新车彰显雄厚实力
  14. 阿里平头哥发布首个产品玄铁910 但这并不是CPU
  15. 修改战网昵称服务器错误,暴雪又改了游戏平台名字 暴雪战网回来了
  16. 窗——开了又关,关了又开(改编)
  17. 智能硬件---智能硬件产品经理需要具备的知识
  18. 免费的天气预报API--谷歌,雅虎,中央气象台
  19. excel逼死强迫症
  20. C#用两种方式破解号称世界上最难的问题!爱因斯坦在20世纪初出的谜语

热门文章

  1. 先序遍历的顺序建立二叉链表
  2. C#与虚拟器 测试测量行业重磅推荐 SeeSharp Tools 介绍 - 1
  3. 奈奎斯特定律和香农定理
  4. i2c对24c32进行读写
  5. Kettle 使用资源库功能把ktr元数据统一存储到数据库中
  6. 【Cadence16.6—Day3】用Cadence16.6绘制STM32H743最小系统原理图
  7. 啊哈算法dfs-bfs
  8. 长时长视频java存储及vue播放解决方法
  9. android中根据城市选择学校,如何根据城市发展来选择学校?
  10. 电脑中出现共享打印机连接错误问题(错误0x0000000a)--解决方法