# 近期js敲诈者的反查杀技巧分析

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2016-04-01T12:15:00Z
Canonical: https://wepostx.com/topics/170

> 乌云历史资料归档
>
> **原始作者：** 360安全卫士
> **原始编号：** superkieran-wooyundrops:1125
> **原始发布时间：** 2016-04-01 20:15
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

# 0x00 前言

最近不少网友反映电脑中了敲诈者病毒（又名“Locky勒索软件”），电脑中的文档，图片等重要资料被病毒加密。此类病毒载体为js脚本，由js脚本下载远程服务器的pe文件，并使此pe文件在本地运行，从而完成对受害电脑数据的加密。
根据360安全中心监测，js敲诈者病毒主要通过网页挂马和钓鱼邮件两种途径进行传播，本文将对此类病毒的传播方法及反查杀技巧进行分析。

# 0x01 网页挂马传播

黑客会利用部分网站的漏洞，将js敲诈者病毒植入到网页中，当用户访问带有恶意代码的网页时，电脑就会自动下载并执行此病毒。

![原文图片](/media/2016/06/d93782323b5c9f9bdb86b7356930255d)
 图 1：样本1
如图1所示的样本，它利用十六进制对代码进行简单的加密，因此对它进行解密相对来说比较简单，解密后的代码如图2所示：

![原文图片](/media/2016/06/0b6eea5aa64ffef0c73a56097bf7e420)
 图 2：解密后的样本1
通过分析解密后的代码可以看出，它利用IE的ActiveX控件来获取远程的PE文件，执行过程包括下载文件，保存文件和运行文件三个步骤。它首先创建MSXML2.XMLHTTP对象来与远程服务器进行通信，获取服务器中的数据，然后使用创建的ADODB.Stream对象将获取的数据保存到用户的TEMP目录下，最后利用创建的WScript.Shell对象直接运行此文件。
样本1由于加密方式比较简单，所以很容易被杀毒软件查杀，为了进行反查杀，它的变种进行更加复杂的加密，如图3所示的样本就是目前比较流行的加密方式。

![原文图片](/media/2016/06/50248060e6d9db858e8b8803c89ee1a5)
 图 3：样本2
首先它为字符串定义一个daughters函数，通过此函数来完成对字符串的截取。

![原文图片](/media/2016/06/cecb43be7f46301b1e750b4bee15febf)
 图 4：字符截取操作
然后在代码中插入一些无意义的变量进行混淆，如图5所示的变量abeUtGplX、ojfdmCwgalh、yHoFUfYVm和GapGRiqoRoK就是起到混淆代码的作用。

![原文图片](/media/2016/06/517684587e130bab579712dc5e126532)
 图 5：代码混淆
最后为了进一步达到免查杀目的，它将代码中将要使用的关键字定义到了一个数组nUvahxKnc中，它或者将关键字与和一些无意义的字符进行组合，或者将一个关键字拆分成几个不同的字符，在使用的时候再对字符进行拆分或者拼接操作。它还会在数组中插入一些无意义的字符进行代码混淆，而在脚本执行中动态地修改数组的长度从而去除那些无意义的字符，具体代码如图6所示。

![原文图片](/media/2016/06/a55f8d919eb5ff18df0df182ed12ad72)
 图 6：使用数组进行代码混淆
样本最终的解密结果如图7所示：

![原文图片](/media/2016/06/f76d47c5ebfb6dcd1ff6570f30cce788)
 图 7：解密后的样本2

# 0x02 邮件传播

黑客通过社会工程学，利用人们的好奇心，精心构造一封钓鱼邮件，将js敲诈者脚本放入到邮件附件中，当用户双击运行js文件时便会中招，常见的邮件形式如下图所示。

![原文图片](/media/2016/06/93f8c907b10a32632421f7d81ebac1ec)
 图 8：钓鱼邮件1

![原文图片](/media/2016/06/3a5c906915f1bc6a0fc5f3ba1fafd91b)
 图 9：钓鱼邮件2
为了达到反查杀的目的，钓鱼邮件1中的js文件首先用到了字符拆分和拼接的方法，这些方法由于前面已经提到，不再进行分析。
其次它将主要的恶意代码放到一个if条件表达式中，通过调用Date.getMilliseconds和WScript.Sleep函数来获取几个不同的毫秒数，然后通过判断这几个变量值是否相等来决定是否执行if条件中的内容，如图10。

![原文图片](/media/2016/06/571527a42f5691e2ae3086c2c54b7f7d)
 图 10：if表达式
钓鱼邮件1中的样本解密后如图11所示。

![原文图片](/media/2016/06/4f43ab08b183c3b915d21a522bfe251c)
 图 11：解密后的样本
通过分析加密后的代码，可以看出通过钓鱼邮件方式传播的js敲诈者和挂马传播方式不同的，它没有利用ActiveX控件来进行运行，而是选择使用WScript对象。由于windows操作系统中wscript.exe会为js脚本文件提供一个宿主环境，因此当邮件保持到本地后，双击js文件便会直接运行。
钓鱼邮件2中的样本是钓鱼邮件1的变种，为了达到进一步的反查杀效果，它在如下几个方面发生了变化。
首先它的if条件表达式发生了变化，它使用了[email protected]_on @*/条件编译，首先将Kcm赋值为false，然后在条件编译中将Kcm的值赋值为true，如果杀毒软件对此没有特殊处理的话，就很难检测到下面的内容，具体代码见图12。

![原文图片](/media/2016/06/e9dae84836e16fd77287ffcef4e9d432)
 图 12：变化后的if条件表达式
其次在计算毫秒时，它使用的不再是Date.getMilliseconds函数，而换成了Date.getUTCMilliseconds函数来进行计算，具体见图12。
钓鱼邮件2的样本解密后如图13所示。

![原文图片](/media/2016/06/8af74d8a65dd3e219a1a5c11ab26ecc8)
 图 13：解密后的样本
还有一种类型的js样本，样本中经过加密的关键字需要使用特定的函数进行解密。如图14，样本中加密的值要调用adjurepe6函数才能进行解密，而它为了提高复杂性，在adjurepe6函数中需要再次调用btoa函数，只有经过这两个函数的解密才能得到最终的结果。

![原文图片](/media/2016/06/b2a523066906db671d097d35d6ea69ee)
 图 14：使用函数加密
js代码使用escape函数进行加密而躲避查杀的情况也比较常见，此函数会同eval函数一起使用。使用时首先通过unescape函数对字符串进行解码，然后通过eval函数将字符串转化为js代码。此种手法在以前的js敲诈者样本中也经常碰到，但是以前是对整个js脚本进行加密，而现在它们只对部分代码进行加密，而未加密的部分又要使用加密部分定义的函数和变量，如图15和16所示。

![原文图片](/media/2016/06/6bb1c9d3a4e884f1bd4f0aa5bde36689)
 图 15：加密的代码

![原文图片](/media/2016/06/b47e42c0d79ef629b1e146fd0c75296d)
 图 16：未加密的代码
可以看到detectDuplicates、matchesSelector、fragment和string函数中所使用的addHandle在未加密代码中是无法找到的，而加密代码解密后，可以看到addHandle值为eval。代码经过解密后，主要的代码如图17所示。

![原文图片](/media/2016/06/78c819f36386ea257a37221fead5b321)
 图 17：解密后的脚本
通过上面的分析可以看到为了达到反查杀的目的，js敲诈者使用了各种代码混淆和加密的方法，甚至使用了类似于[email protected]_on @*/条件编译的用法。由于这种病毒有经济上的利益，因此它们的更新速度特别快，360安全中心会密切关注这类病毒的最新动向，第一时间为用户提供有效的防护方案。

## Replies
