[样本分析初体验] Parite家族感染型病毒

样本信息

MD5:b4964c8ac85b1e428c9eefe572237b21
类型:exe32
分析工具:DIE、OD、x32dbg、IDA

样本行为

该样本是感染性极强的病毒,属于Parite家族,其运行后会先解密并运行一段ShellCode,ShellCode会解密文件末尾的病毒DLL并通过SetWindowsHookExA将其注入explorer进程,创建新线程来感染本地磁盘和网络资源中的exe文件和scr文件。

详细分析

病毒主体

拿到病毒样本之后,先拖到DIE中看一下,发现它是32位的exe文件,C++写的,无壳。
在这里插入图片描述

解密ShellCode

拖到IDA里,发现没解析出个啥,再拖到OD里,入口是:
在这里插入图片描述
可以发现,一上来是个循环,这其实是个解密:
在这里插入图片描述
我们在数据窗口看一下解密前的数据:
在这里插入图片描述
再看一下解密后的:
在这里插入图片描述

ShellCode主体

然后 call 进入0066519C,这其实是一段ShellCode。主要有四个行为
在这里插入图片描述

  1. 上来的第一个函数,获得了Kernel32.dll中一系列函数的地址。先LoadLibraryA,然后GetProcAddress
  2. 查询注册表键值,HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ExplorerPINF的值,如果查询失败则继续第三步。
    在这里插入图片描述
    在这里插入图片描述
  3. 在Temp目录中释放一个.tmp文件,文件名是随机字符串。经查验,该tmp文件实质上是个DLL,具体释放过程如下
  • 首先GetModuleFileNameA获得当前进程完整路径,然后CreateFileA获得文件句柄(0x94)。
    在这里插入图片描述
  • 然后生成一个随机文件名,并创建文件,句柄为0x98。
    在这里插入图片描述
  • SetFilePointer设置进程文件的文件指针,位置为0x243AFC;然后ReadFile循环从进程文件中读数据,每次读的大小为0x2800。数据窗口中显示的是读出来的数据。
    在这里插入图片描述
  • 随后调用的一个解密函数,解密后的数据一看就很明显了,是PE文件。然后将解密后的数据写入tmp文件。
    在这里插入图片描述
  • 重复读写,直到完成,总大小为2B000
  1. 加载该DLL文件,并运行其导出函数Initiate
    在这里插入图片描述
    Initiate函数的行为
    检测互斥体Residented是否存在,不存在的话,通过SetWindowsHookExA设置消息钩子,消息类型为WH_CALLWNDPROC,钩子子程为DLL的导出函数AttachHook
    这样,当有进程产生WH_CALLWNDPROC消息时,DLL就会被注入到该进程中。
    在这里插入图片描述
    病毒主体的分析到这里就差不多结束了,接下来看一下释放的病毒DLL的行为。

病毒DLL

拖到DIE中看了下,发现有UPX壳。
在这里插入图片描述

脱壳

用UPX直接脱壳,但是失败了。
在这里插入图片描述
那就手动脱一下壳吧,这里用的是ESP定律。先拖到OD里看看:
在这里插入图片描述
运行完pushad这一句时,ESP变红,右键空白处,点击HW break[ESP]
在这里插入图片描述
然后F9继续运行,断点断到这里:
在这里插入图片描述
F8走一步就找到OEP了。
在这里插入图片描述
最后显示:
在这里插入图片描述
也不知道为什么?后面同事给指了条明路,改用x32dbg。进来之后首先进入的是系统函数:
在这里插入图片描述
继续运行,找到pushad后,然后还是用ESP定律,最终找到OEP:
在这里插入图片描述
点击最上方插件->Scylla,弹出窗口,先点击Pick DLL选择目标LL,然后在下面的编辑框输入真正的OEP地址,然后依次点击IAT AutosearchGet ImportsDumpFix Dump按钮。
在这里插入图片描述
将脱壳后的文件拖入DIE,发现脱壳成功。脱壳成功后就可以通过IDA看源代码了,有源码再结合OD动态调试会更方便一点。
在这里插入图片描述

DllEntryPoint

病毒Dll在入口处会先判断当前进程是不是explorer进程,它只对explorer进程进行操作。
在这里插入图片描述
主要功能是在sub_2F1B5C中实现,其行为有:
在这里插入图片描述

  1. 创建互斥体Residented
  2. 加载自身DLL;
  3. 删除temp目录下的.tmp文件,被占用的除外;
  4. 将自身路径写入注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer中的PINF
  5. SetWindowsHookExA挂钩当前线程,钩子类型还是WH_CALLWNDPROC
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  6. 创建感染线程,线程回调函数为sub_2F5778()。
    在这里插入图片描述
    线程回调函数中,主要就是遍历磁盘和网络资源,感染.exe文件和.scr文件。但是不会感染C:\Windows\system32\dllcache\下的文件以及readbook.exerundll32.exe
  • 遍历磁盘:
    在这里插入图片描述
  • 遍历网络资源:
    在这里插入图片描述

感染过程

真正对文件进行感染的函数是sub_2F2C7C(),这块分析需要对PE文件结构很熟悉,下面直接放IDA中的代码分析。
在这里插入图片描述
接下来挨个看一下其中的各个子功能:

  • 判断目标文件是否有PE头。
    在这里插入图片描述
  • 读取目标文件的节表以及后面0x28字节的内容,为后续新增节做准备。
    在这里插入图片描述
  • 判断目标文件是否已经被感染,即看最后一个节表头中节区名称是否符合条件。
    在这里插入图片描述
  • 随机生成新增节的名称,生成算法如下,上面判断的算法也是由此而来。
    在这里插入图片描述
  • 修正新增节表头中的数据成员。
    在这里插入图片描述
  • 构造解密代码,后续会将其写入新增节的开头,作为目标文件新的EP。
  • 判断目标文件是否具备感染条件,即看其导入表中有没有kernel32.dll,如果有则Hook其IAT和INT。
    在这里插入图片描述
    在这里插入图片描述
  • 将新的头部信息和节表信息写入目标文件(新增节后需要修改部分头部信息)。
    在这里插入图片描述
  • 将解密函数写到新增节的开头,即新的EP。
    在这里插入图片描述
  • 将原文件的各种信息(0x84字节)、ShellCode(0x540字节)以及ShellCode要用到的字符串信息(0xFE字节),进行加密后写入目标文件。
    在这里插入图片描述
  • 随后写入关键函数的名称,LoadLibraryA()GetProcAddress()
    在这里插入图片描述
    在这里插入图片描述
  • 最后将病毒DLL加密后写入目标文件末尾。
    在这里插入图片描述

总结分析

最后发现,我们分析的样本其实就是一个被感染的exe文件,感染的过程其实就是在原文件的基础上新增一个节,并将EP改成新增节的开头,依次写入解密代码、加密后的文件信息、加密后的ShellCode及其用到的字符串、加密后的病毒DLL。
这样在运行被感染后的文件时,会先运行解密代码,然后运行解密出的ShellCode,ShellCode会解密文件末尾的病毒DLL,把它释放到temp目录,然后加载它并运行其导出函数Initiate,Initiate中通过SetWindowsHookExA设置消息钩子,当有进程产生WH_CALLWNDPROC消息时,DLL会被强制注入到该进程中,但它自身会做检查,只对explorer进程有效。在explorer进程中它会创建新线程来感染本地磁盘或网络资源中的exe文件和scr文件,如此反复,感染性极强。