incaseformat样本详细分析

incaseformat病毒近日爆发,影响了不少主机。这么一个古老的病毒能够造成这么大的影响,令人感到意外。我从微步在线上下载了样本进行分析。需要注意的是,incaseformat有两个在野版本,详见https://www.52pojie.cn/thread-1351233-1-1.html。我分析的应该是原始版本,但是两个版本除了Sysutils::DateTimeToTimeStamp库函数所使用的全局变量IMSecsPerDay不同,其他没有什么区别。在文章的最后有样本相关资源的链接。

基本信息

名称
样本类型PE32 executable (GUI) Intel 80386, for MS Windows
MD5915178156c8caa25b548484c97dd19c1
SHA1f1ca17a3f0b51952de959212b71f3d38d13b0b50
SHA25675ee468476e300c5fddda280a2c0570b1c11a0f7c44acad2b257428cf404e5da

详细分析

首先使用PEiD查壳,可以看到并没有加壳,并且样本使用Delphi编写。

分析Delphi程序与分析VC程序不同,常见的VC样本往往是过程式的,找到WinMain函数接着向下分析即可;而Delphi程序的功能代码往往和UI组件关联,直接从入口分析面临的是一堆固定的初始化代码。因此,可以首先使用DeDe查看Delphi样本中的功能函数。

该样本中有一个Form,包括一个FormCreate和4个被定时器触发的函数,下面开始对它们的分析。

  1. 在分析中很多函数调用的参数我直接通过动态分析获得,本文中不详细提及,重点展示静态分析的过程。
  2. 使用ida分析Delphi程序有很多库函数无法识别,但是DeDe能够很好的识别。因此,可以从DeDe导出map文件,然后使用ida的loadmap插件导入。
  3. 一般来说,样本分析首先要进行动态分析,通过沙箱或监控工具查看样本行为,进行初步分析,此处不再详述。
  4. 直接使用当前样本进行动态调试可能有一些断点运行不到,这是因为程序中有一些行为只有tsay.exe和ttry.exe会执行。因此,可以使用样本复制产生的C:\windows\tsay.exe和C:\windows\ttry.exe试一试。

分析FormCreate

FormCreate函数的第一部分,如下图,包括第一个ShellExecuteA调用之前的代码。这部分是在判断文件所在文件夹是否存在,如果不存在,则构造文件夹路径,并调用ShellExecuteA(0, 0, "/path/to/dir")。这一部分对样本分析影响不大。

该函数的第二部分,如下图。

首先,判断文件C:\windows\tsay.exe是否存在,如果不存在,则复制当前正在运行的文件至C:\windows\tsay.exe(通过图中的CopyFileA调用)。复制结束后,再对注册表进行修改。

在图中的SetRootKey调用之前,将 80000002h作为参数传入了edx。SetRootKey作用是设置进行注册表操作的根键,值与根键的对应关系如下:

根键
80000000hHKEY_CLASSES_ROOT
80000001hHKEY_CURRENT_USER
80000002hHKEY_LOCAL_MACHINE
80000003hHKEY_USERS
80000004hHKEY_PERFORMANCE_DATA
80000005hHKEY_CURRENT_CONFIG
80000006hHKEY_DYN_DATA

此处的注册表操作是将msfsa = C:\windows\tsay.exe写入注册表HKEY_LOCAL_MACHINE/SOFTWARE\Microsoft\Win-dows\CurrentVersion\RunOnce,以实现下一次的开机自启。

然后,该函数对当前正在运行的程序进行判断,如果是C:\windows\tsay.exe跳转至loc_44F28E,如果是C:\windows\ttry.exe跳转至loc_44F2F4。下图黄色高亮是进行比较的函数调用。

在loc_44F28E处,即当前程序为tsay.exe时,复制到C:\windows\ttry.exe,然后启动ttry.exe。在loc_44F2F4处,FormCreate函数基本就结束了。

可见,FormCreate函数主要完成了将初次运行的样本复制到C:\windows\tsay.exe,并修改注册表使tsay.exe在下次重启时自启动。如果运行的是tsay.exe,则将tsay.exe复制到C:\windows\ttry.exe,并启动ttry.exe。

分析Timer1Timer

Timer1Timer作为定时器定时触发的函数,有很多固定的无用代码影响我们分析;我们着重分析0044EBEB的函数调用。0044EC14处也是一个自定义函数的调用,但我并没有发现什么和样本功能有关的调用,不再分析。

0044EBEB处的函数(我在ida命名为hpw_disk_type了)调用在其它定时器触发函数中也用到了,此函数如下图。

首先,在0044E5ED处的hpw_getdisksize也是自定义函数,它的功能是调用Sysutils@DiskSize返回值判断通过eax传入的磁盘是否存在;若存在返回1,否则返回0。这个函数很简单,不再单独分析。

再回到hpw_disk_type中来,可以看到,从‘C’开始,函数调用hpw_getdisksize判断磁盘是否存在;若不存在,跳到loop_or_exit处;若存在,调用GetDriveTypeA判断磁盘类别,如果是DRIVE_REMOVABLE或者DRIVE_FIXED,就调用TStringList@AddObject存起来。

再看loop_or_exit处,首先对ebx加1,即获得下一个盘符,然后判断ebx值是否为5Bh(Z的后一个ascii码),如果是就结束循环,否则继续跳回loc_44E5EB进行磁盘判断。

分析Timer2Timer

同样地,Timer2Timer作为定时器定时触发的函数,我们忽略掉其中和定时器有关的部分,关注功能代码,如下图。hpw_disk_type函数已经分析过了,它用来判断并保存可用的磁盘。

然后,0044EEF0处的函数调用将年、月、日分别赋值给三个变量,我已将它们重命名为day、month、year。从loc_44EF07处开始,对时间进行判断。当年份大于2009(0044EEF5处)、月份大于3(0044EF07处)、日为1或10或21或29时(loc_44EF15处),跳转到loc_44EF31,否则跳转至loc_44EF5E(函数基本结束)。

从loc_44EF31处开始,循环对已保存的磁盘调用hpw_delete函数。经过动态分析,由于0044EF3B处和0044EF5B处的dec ebx操作,若保存了n个盘符,实际对n-1个盘进行hpw_delete,额外的那个是C盘,不进行hpw_delete操作。

然后,我们对hpw_delete函数进行分析,其代码如下图。

这个函数简单直接,首先拼接形成 [路径]:\*.*,对其执行FindFirst(0044ED08处),若执行失败说明该目录下无子内容,直接跳转至loc_44EDCD删除该目录。若含有子内容,跳过其中的.(代表当前目录)和..(代表上级目录)防止死循环,然后对其他内容进行递归删除。

所以,Timer2Timer函数的功能是在指定日期对C盘以外的盘执行删除操作。

分析Timer3Timer

Timer3Timer函数执行了一系列的注册表修改。分析API调用后可以得知有如下修改:

  1. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 下 HidenFileExt = 1
  2. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 下 Hidden = 2
  3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folde\Hidden\SHOWALL 下 checkedvalue = 0
  4. 删除HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Fold-e\HideFileExt里的checkedvalue

Timer3Timer通过修改注册表来隐藏文件后缀和文件夹选项中的一些选项,注册表每项的意义很容易搜索出来,此处不再赘述。

分析Timer4Timer

当主机受到该病毒影响时,在被删除文件的磁盘根目录下会留有incaseformat.log文件,就是这个Timer4Timer函数的功劳。该函数很简单,通过hpw_disk_type获取可用盘符后与incaseformat.log字符串拼接,然后调用TFileStream函数向拼接好的路径进行写操作创建文件。

关键函数总结

函数功能
FormCreate复制样本到C:\windows\tsay.exe并修改注册表实现自启动、复制C:\windows\tsay.exe到C:\windows\ttry.exe
Timer2Timer在指定日期对C盘以外的盘执行删除操作
Timer3Timer修改注册表来隐藏文件后缀和文件夹选项中的一些选项
Timer4Timer在被删除盘根目录创建incaseformat.log文件

相关资源

Delphi API 查询:http://docwiki.embarcadero.com/Libraries/Sydney/en/Main_Page

DeDe:http://ftp.twaren.net/cpatch/patchutil/dede/

ida loadmap插件:https://github.com/mefistotelis/ida-pro-loadmap

样本下载:https://s.threatbook.cn/report/file/75ee468476e300c5fddda280a2c0570b1c11a0f7c44acad2b257428cf404e5da/?env=win7_sp1_enx86_office2013

TIME: 2021/01/16 返回首页