0x00 前言准备
实验环境:win10
分析工具:
火绒剑
IDA7.5
die
0x01 样本基本信息
md5:e10713a4a5f635767dcd54d609bed977
0x02 赎金信息
0x03逆向分析
先用die看一下基本信息
32位,无壳,可以直接拉进ida看
定位到start函数,程序逻辑非常清楚
命令行参数
参数可以传三个,分别如注释种所写,如果没有参数,默认是只本地加密。
终止服务
病毒在启动前会检索一系列服务并进行关闭
重点关注一下有注释的几个API
检索的服务是明文写在这里的。
终止进程
和服务类似,也有一个终止进程的过程
要关闭的进程服务也是明文写在这里的
关闭服务和进程的目的都是保证加密过程防止文件被占用。
删除卷影副本
首先,它调用Wow64DisableWow64FsRedirection以禁用文件系统重定向,然后再调用ShellExecuteW执行此命令
cmd.exe /c vssadmin.exe delete shadows /all /quiet
删除卷影副本后,Babuk 会检查系统是否在 64 位处理器下运行。如果是,则调用Wow64RevertWow64Fs重定向以再次启用文件系统重定向。
密钥生成
说实话,我密码学这一块真的不是很好,只能大体上看一下加密算法。
这个加密用的椭圆曲线加密算法ECDH,先是生成了四个随机缓冲区。其中两个作为chacha8键,还有两个作为chacha8随机数。
然后用刚才的随机数对密钥进行一系列加密操作
然后,它使用本地私钥和作者的硬编码公钥生成共享密钥。
此共享密钥采用 SHA256 哈希算法生成 2 个 ChaCha8 密钥,这些密钥用于稍后加密文件。
为了能够解密文件,Babuk 将本地公钥存储在APPDATA文件夹中的文件ecdh_pub_k.bin中。
由于 ECDH 的机制,勒索软件作者可以使用自己的私钥和受害者的公钥来解密文件,从而生成共享的秘密。这使得受害者无法自行解密,除非他们能够在恶意软件完成加密之前捕获恶意软件中随机生成的私人密钥。
多线程
可以看到,启动的线程数是根据驱动器的数量来决定的,其实这是有一定的问题的,在驱动器数量少于处理器数量的情况下(这很有可能),Babuk 不会生成尽可能多的线程进行加密。
由于每个线程负责整个驱动器,这迫使它使用传统的递归方法来遍历自己的文件夹,这导致由于巨大的工作负载而导致更长的加密时间。
每个线程的工作负载根据其加密的驱动器的大小而有所不同,因此平均加密时间将大约接近一个线程加密最大驱动器所需的时间。这是低效的,并且确实违背了使用多线程来加密驱动器的目的。
文件夹遍历
我们跟进到StartAddress里看一看。
Babuk使用递归方法来遍历和加密文件,使用FindFirstFileW和FindNextFileW调用,它会遍历每个目录以查找文件和子目录。
当遇到目录时,它会再次递归调用main_encrypt函数。但是,Babuk最多只加密16个目录层深,因此它可能不会加密驱动器中的每个文件夹以节省时间。
遇到文件时,它将检查文件名是否为"How To Restore Your Files.txt或者文件扩展名是否为.__NIST_K571__以避免加密赎金记录或加密文件。
杀死文件进程
Babuk通过调用RmStartSession 、RmRegisterResources和RmGetList来获取使用指定文件的进程列表重新启动管理器来终止任何使用文件的进程。如果进程不是explorer.exe或关键进程,则 Babuk 将调用TerminateProcess来终止它。
文件加密
在加密这里Babuk把文件加密分成两种情况,大文件加密和小文件加密,这是以41943040字节大小划分的。
对于小文件,文件被完全映射,并使用两次chacha8加密。
对于大文件,将整个文件分成三个相等的区域,对与每个区域只加密前10485760字节。
远程文件加密
为了加密来自受害计算机的远程驱动器,Babuk 调用WNetGetConnectionW以检索与这些驱动器关联的网络资源的名称,并将其传递给加密线程。
在对应的参数选择下,Babuk还会加密计算机 LAN 上的网络共享。
Babuk 调用WNetOpenEnumW和WNetOpenEnumW遍历网络上的远程文件夹,并使用上面提到的类似递归方法加密文件。
至此样本分析完毕。