欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

从javascript脚本混淆说起

来源:本站整理 作者:渔村安全 时间:2017-07-17 TAG: 我要投稿

脚本病毒是一个一直以来就存在,且长期活跃着的一种与PE病毒完全不同的一类病毒类型,其制作的门槛低、混淆加密方式的千变万化,容易传播、容易躲避检测,不为广大网民熟知等诸多特性,都深深吸引着各色各样的恶意软件制作者 …
小到一个不起眼的lnk快捷方式,大到一个word文档,都是脚本的载体。本文主要以 js脚本为例(特指JScript,下同 ),具体结合实际样本,讲述混淆方式及其混淆类型检测相关知识,文章受限于样本个数及其种类,存在一定的局限性,但大致情况应当不会相差太大。本系列首先会对jscript及其脚本进行简单介绍,之后对采用不同混淆操作的样本进行分析以及总结,后续系列会引入脚本动态鉴定技术即 虚拟执行行为检测技术的介绍与实现。
前言
jscript是由微软公司开发的脚本语言,是对ECMAScript语法规范的实现,最初是随着 IE 3.0于1996年8月发布,和其所开发的其他脚本语言一样,后来被 Windows ScriptHost(WSH)和Active Server Pages所支持,其典型的扩展名称为.js 。Windows上的.js文件运行是这样的( 实际后缀还有可能是.jse,.wsf, .wsh),在你双击这类文件时,通常的操作是由代理程序传给宿主进程作为参数运行,这个宿主进程也通常为 wscript.exe或者cscript.exe(实际根据注册表中 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.js\OpenWithList中给定的值)。 wscript与cscript的区别就在于前者是在窗口中运行,后者是在命令行中运行。那么是不是所有js 的脚本必须要有后缀?当然不是,你可以使用wscript //e:jscript 文件名称的形式执行。是不是还要问 jscript和javascript是不是同一个?当然不是! 但他们确实属于同一类语言,因为都是对ECMAScript语法规范的不同实现版本,大体语法都一样,但各自的实现却也存在着很多差异,具体差异可在网上查阅资料进行了解。
正文
jscript不知是什么时候被微软开始边缘化的技术产品(或许是javascript 太强了),随着老一批的微软开发者的淡出,jscript也离开了人们的视线。但也可能正是如此,它获得了恶意软件编写者的青睐。
什么是混淆
混淆:指迷惑,将一样东西误认为另一样东西(本解释来自百度百科 )。由于脚本语言绝大多数是基于解释器的运行方式,所以其在进入解释器之前多为源代码形式存在,通过源代码可以清楚知道脚本的意图,所以为了对抗分析,采用了各种方式将源代码进行 混淆操作(当然也可能是正常功能的脚本不想被轻易看穿的不得已之为)。通过金山毒霸安全实验室对全球非 PE样本的监控数据来看,目前对jscript脚本的混淆方式变化如下:

下面通过不同混淆操作的特点,结合实际样本案例进行分析总结,最后给出针对不同混淆方式的检测思路。
脚本混淆
脚本混淆的方式比较繁多,常采用编码、加密、 变形,切分等操作进行
编码: 将信息从一种形式或格式转换为另一种形式的过程
加密: 通过某种特殊算法,改变信息的原有结构
变形: 改变原来形态的过程
切分: 通常为拆分操作
上述操作是常见混淆的采用的技术操作,但实际上,对这些操作运用的载体,通常是变量 ,字符串,函数(或方法,统称函数)、数组、对象, eval等。下文针对这些不同的载体,具体结合样本进行分析讨论。
1. 变量的混淆
变量混淆,通常针对变量的名称、个数进行操作,目的是去掉变量名称的词义。这种操作的极端情况有个数极少、个数极多、名称长度普遍较短(41) 、随机名称等特性。通常,单一的针对变量的混淆都是配合其他形式同时出现的,例如:

这个脚本的特点很明显,就是变量名称都是e构成的,而且超级多,其后续执行的代码如下:

具体含义就是根据变量名称中e的长度从低到高的顺序,通过this 访问当前环境变量,之后拼接完整代码块,使用eval进行动态执行。通过这个规律可轻易写出代码还原工具(但可能适用的范围很小 )。针对变量的混淆检测,主要从变量的个数 、名称长度分布及名称字符串特征这三个维度去检测。上述例子中,很明显的发现,这里对代码进行了 变形,代码块切分技术。
2. 字符串操作的混淆
字符串,很大程度上能够帮助代码阅读人员快速定位关键代码段,从而加快分析。当然,恶意脚本也会更加注意对字符串的保护 。对字符串的常见混淆操作有加密、编码、替换等操作。常见的针对字符串的操作函数有substr、substring、 unescape、fromcharcode、replace 、split以及正则表达式等操作。如下代码片段就是使用了字符串解密函数 exq在运行时对字符串进行了解密。

当然,也有如下这种通过字符串常用操作进行字符串解密的
实际运行后b的值是

还有比较常见的编码方式的

通过收集到的样本来看,其中使用正则表达式的样本也是比较多的,限于篇幅长度,这里就不一一列举了。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载