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

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

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

functiondisplayNoteTitle(note) {

alert(note['title']);

}

var flowerNote = {};

flowerNote['title'] = "Flowers";

displayNoteTitle(flowerNote);

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

混淆工具:

反混淆工具:

以上除了 JScrambler 是商业软件需要付费使用外,其余全部为免费软件。

缩小和混淆

下面首先让我们看看混淆工具的混淆效果如何,随后在看看反混淆工具的表现又如何。

YUI Compressor

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

Google Closure Compiler

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

简单优化:

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

深度优化:

alert("Flowers");

UglifyJS

同前一个工具一样,UglifyJS 也有两种层次的混淆:

默认:

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

高级:

functiont(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;Ry;})(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

functiondisplayNoteTitle(e) {

alert(e.title)

}

var flowerNote = {};

flowerNote.title = "Flowers", displayNoteTitle(flowerNote);

UglifyJS Toplevel -> jsbeautified:

functiont(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 混淆器

functionL(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"

};

functiondisplayNoteTitle(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

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

js混淆还原工具_技术分享:几种常见的JavaScript混淆和反混淆工具分析实战【转】...相关推荐

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

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

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

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

  3. 对称加密算法_技术分享丨这是一篇简单的小科普——什么是对称加密算法?(下)...

    大家好~我是贾正经,又到了干货满满的技术分享趴啦~ 上期我们讲解了对称加密算法的小知识,并介绍了国密算法中SM4算法的原理.(上集回顾) 本期带大家了解一下分组密码的五个模式. 分组密码的模式 首先了 ...

  4. dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入

    欢迎各位添加微信号:qinchang_198231   加入安全+ 交流群 和大佬们一起交流安全技术 01 技术概要 这是一种允许攻击者从内存而非磁盘向指定进程注入DLL的技术,该技术比常规的DLL注 ...

  5. java生成sm4算法的对称密钥_技术分享丨这是一篇简单的小科普——什么是对称加密算法?(下)...

    原标题:技术分享丨这是一篇简单的小科普--什么是对称加密算法?(下) 大家好~我是贾正经,又到了干货满满的技术分享趴啦~ 上期我们讲解了对称加密算法的小知识,并介绍了国密算法中SM4算法的原理. 本期 ...

  6. hive中字段长度函数_技术分享:hive常用内部函数

    原标题:技术分享:hive常用内部函数 hive常用内部函数 hive是一种典型的数据仓库分析工具,常用语编写hql语句进行指标分析.在编写hql的过程中无疑会用到很多的函数,哪本章来编写一些常见的函 ...

  7. python个人博客搭建说明书_技术分享|利用Python Django一步步搭建个人博客(二)...

    原标题:技术分享|利用Python Django一步步搭建个人博客(二) Hello,欢迎来到我们的"利用Python Django一步步搭建个人博客"系列的第二部分.在第一部分中 ...

  8. 关键词热度分析工具_干货分享丨关键词热度分析工具

    不论我们是做竞价还是做自然优化,都需要对关键词的热度进行一番细致的分析.选择了不合适的关键词,可能就会浪费大量的时间和金钱,关键词的重要性不言而喻. 好啦,大家肯定会悄悄吐槽:谁不知道选择合适的关键词 ...

  9. mysql优化说出九条_技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢?

    原标题:技术分享 | MySQL 优化:为什么 SQL 走索引还那么慢? 背景 2019-01-11 9:00-10:00 一个 MySQL 数据库把 CPU 打满了. 硬件配置:256G 内存,48 ...

  10. 干涉测量技术的应用_技术分享 | 石化行业测量仪表应用在线答疑

    众所周知,在化工和石化这类流程行业当中,稳定性和持续性是至关重要的生产"命脉",对于生产过程中使用的测量仪表有着极其严格的要求. 不仅所有测量仪表都必须满足严苛的国际标准,如PED ...

最新文章

  1. javascript的call()方法与apply()方法的理解
  2. linux下给php安装pdo_mysql和zlib以及测试模式的选择(禅道安装过程中遇到的问题)...
  3. [MATLAB学习笔记]peaks函数1013(2)
  4. Salesforce 数据备份和恢复小知识
  5. 动态规划算法-04最长递增子序列问题
  6. Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
  7. 怎样在Swift中使用NSError
  8. Item-Based Collaborative Recommender System
  9. 2016-08-12
  10. c++ string字符串翻转
  11. iOS 项目改名~~~~~
  12. 123f是什么c语言,123RF博客
  13. 2021-2027全球及中国数控钻机行业研究及十四五规划分析报告
  14. BZOJ 3162 / Luogu P4895: 独钓寒江雪 树hash+DP
  15. css文字不透明度怎么设置?
  16. 转载_BlueTooth: 蓝牙基带
  17. C#Aspose操作Word Excel简版(后会研究补充更多功能)
  18. python-列表处理log日志、字典处理log日志学习总结
  19. 悠漓带你浅谈C语言2(数据类型)
  20. An unusual vacation

热门文章

  1. 深度报告 | 4G应用启示录与5G应用展望
  2. sqlyog 注册码
  3. Win7安装 Rational Rose软件
  4. JAVA实现网页版斗地主_Java实现斗地主简化版
  5. java web缓存技术
  6. Java实现二维码生成及图片合成
  7. 《终极算法》读书笔记(一)机器学习革命
  8. 唐宇迪学习笔记2:Python数据分析处理库——pandas
  9. vivado入门教程
  10. openssl、gmssl的简单介绍