勒索软件 Jaff 最早是在2017年春季开始散布的,但是它被很大程度上忽视了,因为它的爆发时间与 WannaCry 相同。在当时, Jaff 没有受到太多关注,但依然感染了大量的计算机。在这篇 FortiGuard 的分析中,我们将着重分析这款勒索软件所使用的一些技术。
传播的起点
跟许多勒索软件的变种一样, Jaff 通常是使用 PDF 附件的形式传播的。一旦受害者打开附件,就会弹出一个提示框,询问是否想要打开嵌入的 ASQMU.docm 文件(图 1)
如果受害者允许打开文件,Jaff 会首先打开一个嵌入的文档,这个文档包含了一些可以关闭你的宏保护的指令(图 2)。文档顶部的黄色标识中有一个按钮 “启用宏”,可以允许这个文档中所有的宏指令。
Jaff的下载器-privateProbe
事实上,这个文档中包含了许多宏指令(图 3),主要的宏指令都在下面列了出来,其中还有一个是用来下载 Jaff 的二进制文件的:
· autoopen()
· Document_Open()
· setAsMainTarget()
· Challenge(sender As String, e As Integer)
· Subfunc(MethodParam2() As Byte, MethodParam As String)
· Lipochanko(a, b)
· Synomati(Comps)
· Vgux(strComputer As Integer)
· enumMembers(objDomain)
· Assimptota4(FullPath As String, NumHoja As Integer)
· Assimptota6(FullPath As String, NumHoja As Integer)
· WidthA(Dbbb As String, bbbJ As String, Optional system_ofADown_Sexote As String)
· Function system_ofADown_ProjectSpeed()
· privateProbe()
· SaveDataCSVToolStripMenuItem_Click(e As Integer)
· RepackOK(sheetToMove As String, sheetAnchor As String, Assimptota6OrAfter As String)
· CheckRectsAd()
其中,privateProbe 宏主要包含下载 Jaff 二进制文件的指令(图 4)。
同样,在图 4中我们可以看到下载链接,而这个下载链接还远远不是真正的下载链接。
在这个下载链接中,我们首先将字符串 RRDD 替换成 om ,然后将字符串在每次 Nbiyure3 出现的地方进行分割 (图 5)。
译者注:最后得到了真正的三个下载链接
解密,重定向与垃圾代码
通过得到的三个下载链接,我们下载了二进制的恶意代码文件, Jaff 会对下载的恶意代码进行解密,得到最终运行的代码。为对抗代码分析,它使用了一个简单的代码重定向的技巧,以增加分析真正的恶意代码所需要的时间。在代码执行期间,它还运行了一些无关的垃圾代码,来混淆代码的用途。
图 6 标出了解密例程的运行流程,Jaff 会随机的选择不同的代码块来执行。每次经过这组代码时,都会解密一个 DWORD 值,直到将所有的恶意代码都被成功解密。
在移除不相关的垃圾代码后,我们可以看到只有三个代码块是用来执行解密的(图 7),而且使用的解密算法只是一个简单的XOR。
解析 API
在解密恶意代码之后,大多数使用的API名称仍然是隐藏的。一般来说,隐藏API的名称是一种恶意代码的特征,它们利用这个方法来躲避防病毒程序的检测,因为防病毒软件会根据程序使用的API组合,来识别恶意代码。为了隐藏API的名称,有些恶意代码使用加密,有些使用hash。而Jaff使用的就是hash。
一开始,它会解析 PEB (Process Environment Block),并查找字符串 kernel32.dll, 它会对PEB中找到的所有模块的名称进行hash, 并与 kernel32.dll 的hash进行比较。一旦匹配了 kernel32.dll 的hash, 它会获取 kernel32.dll 的地址,并且用这个方法解析剩余的API。
进程替换(Process Hollowing)
进程替换也一个恶意代码的特征,它能够将目标进程的合法代码给unmap掉,然后将自己的恶意代码写入这片内存。在获取到所有需要的 API 后, Jaff 会使用进程替换。它使用 UnmapViewOfFile 清除当前进程的内存块,然后使用 VirtualAlloc 重新分配相同的内存块,并通过调用 VirtualProtect 将其保护模式更改为PAGE_EXECUTE_READWRITE,最后,通过一系列 REPE MOVSB 指令将恶意代码的内容复制到新分配的内存块中。
代码封装
在此之前我们看到的所有步骤(解密,重定向与垃圾代码/解析 API/进程替换),都是代码封装的一部分,是Jaff为了隐藏它真正执行的指令而采用的技巧。在执行之前所有的步骤后,Jaff已经可以运行它真实的代码了。有趣的是,使用代码封装基本上可以在不更新可执行文件的情况下来升级代码。通过这种方式,你可以快速部署新版本的恶意软件,从而避免以前使用的检测参数。
资源段
接下来让我们分析二进制文件的资源段。Jaff 的资源部分主要包含了三个,密钥块,加密的扩展名列表、下载URL链接以及赎金说明(图 8)。
密钥块
密钥块是在其中一个资源中找到的260字节的密钥。它用于解密资源段中不同资源的内容。
图9 是获取密钥块代码的部分截图。
扩展名列表
其中一个资源包含了扩展名列表。图10 显示了解密前和解密后的扩展名列表,Jaff会根据这个列表中的扩展名,对文件系统中的文件进行搜索并加密。
赎金说明
Jaff的赎金说明以三种不同的格式存储:html、普通文本和图片(bmp)。
文本和html版本可以在resource部分找到。
图 12 显示了解密前和解密后的 html 赎金说明。
Jaff使用以下 API 来生成图片形式的赎金说明。
· CreateStreamOnHGlobal
· CreateDCW(DISPLAY)
· GetDeviceCaps
· SetRect
· CreateSolidBrush
· FillRect
· OleDraw
图13 显示了图片形式的赎金说明,Decrypt ID是动态生成的,并将其添加到图片中。
在当前这个Jaff变体中,该图像在感染后被设置为桌面的墙纸。
文件加密
在复杂的代码封装和初始化之后,Jaff 最主要的功能,文件加密,是一个很简单的例程。
Jaff会在特定的目录下检索具有指定扩展名(图 11)的文件.
接下来,它会将检索到的文件重命名,添加一个 .jaff 扩展名。
然后会调用 CryptEncrypt 函数来对该文件进行加密(图 14)。
在加密完所有可能的文件后,Jaff 会在相关的目录中添加 ReadMe.bmp, ReadMe.html,和 ReadMe.txt 三个文件,分别对应三个版本的赎金说明。
总结
影响勒索软件传播能力的一个关键因素是它的发布时间。
Jaff最早是在与 WannaCry 相同的时间进行散播的,因此没有被媒体特别的报道。
当然,或许它就是故意在那时释放,以方便它能够隐蔽地感染更多用户。
无论如何,我们应该定时升级反病毒软件,随时准备抵御恶意软件或赎金软件的攻击。
样本信息
Sha256: 387812ee2820cbf49812b1b229b7d8721ee37296f7b6018332a56e30a99e1092
Detection: W32/Jaff.ED11!tr.ransom