恶意代码分析实战12-04

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战12-04相关的知识,希望对你有一定的参考价值。

本次实验我们将会分析lab12-04.exe文件。先来看看要求解答的问题
Q1.位置0x401000的代码完成了什么功能?
Q2.代码注入了哪个进程?
Q3.使用LoadLibraryA装载了哪个DLL程序?
Q4.传递给CreateRemoteThread调用的第4个参数是什么?
Q5.二进制主程序释放出了哪个恶意代码?
Q6.释放出恶意代码的目的是什么?
首先使用Peview载入

可以看到CreateRemoteThread创建远程线程的函数以及LoadResource和FindResourceA等资源操作相关的函数。
那么可以使用resource hacker来查看资源

可以确定这是一个PE文件
将其提取出来

接下来通过process monitor和wireshark进行监控
在process monitor中添加过滤条件

双击运行Lab12-04.exe后
先看看procmon的结果

可以看到有对临时文件夹Temp的操作,在该文件夹下还看到了winup.exe
之后有对系统目录下wupdmgr.exe的windows更新二进制文件的访问
我们可以将这个文件与我们之前从resource hacker提取出来的进行md5比对

通过md5的比对,可知这两个文件是同一个文件
接着看看wireshark的结果

可以看到会试图从www.practicalmalwareanalysis.com通过get方式下载updater.exe

接着IDA载入lab12-04.exe分析
在main函数的开始位置如下就可以看到

会通过LoadLibraryA和GetProcAddress手工解析三个函数,并将三个函数指针分别保存在dword_40312c等。所以我们这里可以对其重命名,方便后续的操作,重命名后如图所示

接着分析

调用muEnumProcess枚举当前的进程,其返回值是PID值,保存在dwProcessId

之后可以看到是一个循环,作用就是循环遍历PID
会将每个进程的PID作为参数传给sub_401000,跟入该函数

先看看str2和str1是什么
str2来自dword_403010,跟入

选中后按r键可以将其转换
因为小端格式,所以反着看,这里显示的是winlogon.exe
同样可以看看str1

读出来是
接着往下看

将循环中的参数dwProcessId传递到OpenProcess,获得进程的句柄。OpenProcess返回的句柄存入到EAX,而EAX赋给了hObject

hObject传递给myEnumProcessModules函数,这个函数会返回加载到这个进程所有模块的句柄数组。
继续往下

通过myGetModuleBaseName获取到的模块PID的基本名称。返回值保存在str1,如果成功,str1将会包含传递给子例程的模块PID的基本名称的字符串,失败则是初始值,之后会比较str2和str1,也就是与winlogon.exe比较,如果相同则eax为0

会往左边走,将1赋给eax,也就是说返回时eax为1.如果不同,则函数返回值eax为0
那么我们也就知道sub_401000函数正在确定与winlogon.exe关联的PID,可以将其重命名为PIDLookup
Q1.位置0x401000的代码完成了什么功能?
A1.恶意代码查看给定PID是否为winlogon.exe 进程。

继续分析

在004014b1看到会将PIDLookup的返回值与0比较。如果返回值为0,则往左边走。其实就是再次开始循环,不过时使用新的PID来传入PIDLookup。如果返回值为1,也就是说PID与winlogon.exe相匹配,则走右边

会将dwProcessId的值作为参数传给sub_401174,跟入这个函数

跟入sub_4010fc

可以知道其功能是提升权限
回到上一个函数

看到调用LoadLibraryA,来装载sfc_os.dll这个动态链接库,并通过GetProcAddress来获取该dll中编号为2的函数的地址,将该地址保存在lpStartAddress
之后调用OpenProcess打开winLogon.exe,将其句柄保存在hProcess

接着调用CreateRemoteThread,其hProcess参数是edx,往上看可以就是winlogon.exe的句柄。004011de处的lpStartAddress是sfc_os.dll中序号为2的函数的指针,负责向winlogon.exe注入一个线程,该线程就是sfc_os.dll的序号为2的函数
Q2.代码注入了哪个进程?
A2.winlogon.exe 是被注入的进程
Q3.使用LoadLibraryA装载了哪个DLL程序?
A3. DLL sfc_ os.dll,用来禁用Windows的文件保护机制
Q4.传递给CreateRemoteThread调用的第4个参数是什么?
A4.传递给CreateRemoteThread的第4个参数是一个函数指针,指向sfc_ os.dll 中一个未命名的序号为2的函数(SfcTerminatewatcherThread)
这个函数究竟是什么还是不清楚的,没有公开,只是被称为SfcTerminateWatcherThread。我们只知道sfc_os.dll不能负责windows文件保护机制,有一系列运行在winlogon.exe中的线程。

返回上一个函数

如果正确注入进程后,则来到上图所示。
调用GetWindowsDirectoryA获取当前路径,然后与system32\\wupdmgr.exe组合后保存在Dest里。Wupdmgr.exe是被用作windows系统的更新。
0040154a出调用GetTempPathA获取当前用户临时目录,然后与winup.exe拼接后存在NewFileName

然后是调用MoveFileA,将wupdmgr.exe改名为winup.exe,并移动到了临时文件夹里
上图最后调用了sub_4011fc,跟入

调用GetWindowsDirectory获取路径与\\system32\\wuodmgr.exe拼接,保存在Dest
然后调用GetModuleHandle,在此之前有push 0,所以也就是获取当前进程的句柄

接着是一系列与资源相关的函数调用。用于从资源段中提取文件,并写入到C:\\windows\\system32\\wupdmgr.exe
我们知道通常windows文件保护机制会探测到文件的改变以及用一个新创建文件覆盖,所以恶意代码尝试创建一个新的更新程序通常会失败。但是别忘了,我们刚才的分析可以知道,恶意代码已经禁用了windows文件保护机制的功能,所以就可以实现覆盖原文件的目的。

最后就是通过WinExec来启用已经被改写过的wupdmgr.exe
0040133c可以看到push 0,作为uCmdShow参数值来启动,这样就可以隐藏程序的窗口。
Q5.二进制主程序释放出了哪个恶意代码?
A5.恶意代码从资源段中释放一个二进制文件,并且将这个二进制文件覆盖旧的Windows更新程序( wupdmgr.exe)。覆盖真实的wupdmgr.exe之前,恶意代码将它复制到%TEMP%目录,供以后使用
我们使用IDA来分析之前提取出来的文件

通过GetTempPathA获取路径,然后与\\winup.exe组合
接着使用WinExec执行该程序

之后通过GetWindowsDirectory获取目录,与字符串\\system32\\wuodmgrd.exe组合
之后通过URLDownloadToFile打开网站,网址就是上面的参数的那个字符串,和在wireshark中看到的一样,将下载来的内容保存在CmdLine,也就是之前组合成的路径里。也就是说,恶意代码会通过该网址进行更新,下载文件updater.exe,保存到wupdmgrd.exe中
之后将返回值与0进行比较

以决定是否调用WinExec执行。如果返回不为0,则会运行新创建的文件。

Q6.释放出恶意代码的目的是什么?
A6.恶意代码向winlogon.exe注入一个远程线程,并且调用sfc_ os.dll 的一个导出函数(序号为2的SfcTerminateWatcherThread),在下次启动之前禁用Windows的文件保护机制。因为这个函数一定要运行在进程winlogon.exe 中,所以CreateRemoteThread调用十分必要。恶意代码通过用这个二进制文件来更新自己的恶意代码。

以上是关于恶意代码分析实战12-04的主要内容,如果未能解决你的问题,请参考以下文章

恶意代码分析实战18-3

恶意代码分析实战21-2

恶意代码分析实战15-3

恶意代码分析实战16-03

恶意代码分析实战16-03

恶意代码分析实战9-2