勒索软件 Jaff 最早是在2017年春季开始散布的,但是它被很大程度上忽视了,因为它的爆发时间与 WannaCry 相同。在当时, Jaff 没有受到太多关注,但依然感染了大量的计算机。在这篇 FortiGuard 的分析中,我们将着重分析这款勒索软件所使用的一些技术。
跟许多勒索软件的变种一样, Jaff 通常是使用 PDF 附件的形式传播的。一旦受害者打开附件,就会弹出一个提示框,询问是否想要打开嵌入的 ASQMU.docm 文件(图 1)
如果受害者允许打开文件,Jaff 会首先打开一个嵌入的文档,这个文档包含了一些可以关闭你的宏保护的指令(图 2)。文档顶部的黄色标识中有一个按钮 “启用宏”,可以允许这个文档中所有的宏指令。
事实上,这个文档中包含了许多宏指令(图 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的名称,有些恶意代码使用加密,有些使用hash。而Jaff使用的就是hash。
一开始,它会解析 PEB (Process Environment Block),并查找字符串 kernel32.dll, 它会对PEB中找到的所有模块的名称进行hash, 并与 kernel32.dll 的hash进行比较。一旦匹配了 kernel32.dll 的hash, 它会获取 kernel32.dll 的地址,并且用这个方法解析剩余的API。
进程替换也一个恶意代码的特征,它能够将目标进程的合法代码给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