恶意代码分析实战 第十二章课后实验

静态分析:

使用ida打开Lab12-01.exe,打开imports,如下:

这里看到了CreateRemoteThread、WriteProcessMemory和VirtualAllocEx,看到这几个函数就有理由怀疑这是一个进程的注入行为。

看一下字符串,打开strings窗口:

这里看到了几个可以的dll文件,explorer.exe、Lab12-01.dll和psapi.dll,可能会和注入有关。

问题1:

运行程序,使用Process Monitor和Process Explorer都没有发现什么。但是运行之后会弹出一个对话框。同时还发现每隔一分钟弹出一次。

问题2:

首先分析main函数的位置:

 

在这里可以看到程序在解析"psapi.dll"中用于进程枚举的函数。并且连续使用了三组LoadLibraryGetProcAddress函数组合来解析"EnumProcessModules","GetModuleBaseNameA"和"EnumProcesses"这三个函数。然后将获取到的地址分别保存到dword_408714, dword_40870C, dword_408710中。为了后面在看到这些函数方便,这里进行一下重命名的操作,这里使用快捷键n,改完之后如下:

继续向下看:

这里调用了EnumProcesses函数,这个函数的目的就是获取系统中每一个进程的PID值。继续向下看,发现了一个循环操作,也就是循环对获取的PID值进行分析。下面看到调用了函数sub_401000,双击进去看一下:

其实这个函数的目的就是查找进程中是否有"explorer.exe"这个进程,如果有,sub_401000函数的返回值就是1。

返回继续分析

在这里会判定返回值是不是1,是1 的话就是调用函数OpenProcess打开一个指向explorer.exe的句柄。如果能够成功获得这个句柄的话,就会执行下面的程序:

这里首先调用了函数VirtualAllocEx,这个函数可以在explorer.exe这个进程里面可以分配空间,那么一个指向被分配内存的指针将被移入lpParameter中,然后利用函数WriteProcessMemory来向explorer.exe中写入数据。写入的内容就是这个buffer,这个buffer里到底是什么呢?向上回找一下这个buffer,可以看到:

程序先是获取一个路径,然后与"Lab12-01.dll"组合成一个新的路径,然后将这个组合好的路径保存到buffer里面。那么我们也就知道了恶意程序就是将"Lab12-01.dll"的路径写入到了explorer.exe里面。

继续向下看:

在这里看到了程序调用函数GetModuleHandleGetProcAddress,目的就是获取kernel32.dll中的LoadLibraryA函数的地址。然后将这个地址保存到了lpStartAddress里面,下面lpStartAddress又成为了CreateRemoteThread函数的参数。这样explorer.exe就一定会调用LoadLibraryA这个函数。而LoadLibraryA的参数是lpParameter,也就是字符串Lab12-01.dll

 

分析到这里也就很清楚了,这段代码的作用就是在一个远程进程也就是在explorer.exe里面创建一个线程,这个线程的功能就是调用LoadLibraryA这个函数,而这个函数的参数是Lab12-01.dll。那么现在我们就可以断定,这个恶意程序执行了DLL注入的操作,将Lab12-01.dll注入到了explorer.exe进程里面。

问题3:

重新启动一下电脑这个DLL注入也就失效了。

问题4 :

使用ida打开Lab12-01.dll。

可以看到这里调用了函数createthread,用来创建一个线程。查看一下函数10001030。

双击进来发现这是一个无限循环,休眠时间是60秒,这里也是调用了函数createthread,双击startaddress就可以看到:

这里调用了函数messagebox,这个函数的内容就是会显示"Press OK to reboot",也就是那个对话框。

打开ida,吧Lab12-02.exe在如ida,查看一下imports窗口:

在这里看到了函数ReadProcessMemory和WriteProcessMemory这两个函数可以让我们知道这个恶意程序对进程的内存空间进行了读写的操作,看到函数 SetThreadContext ,CreateProccessA,和GetThreadContext可以知道,这个程序会创建新的进程,并且修改进程中的线程上下文,看到LockResource和SizeofResource这两个函数让我们知道有可能会对资源节做一定的操作,有可能在资源里保存了一些比较重要的数据。

这里重点分析一下这个CreateProccessA函数,双击:

双击一下上箭头就来到了CreateProccessA函数的位置

这是函数sub_4010EA开头的部分,这里看到了函数再检查MZ与PE,这也就说明了目标文件是一个PE文件。

 

在这里看到了参数dwCreationFlags的值为4,表示的是CREATE_SUSPENDED允许进程被创建,但是先不启动。只有当主进程调用ResumeThread函数时,它才会被启动。继续向下看:

可以看到GetThreadContext这个函数,这个恶意程序正在访问一个线程的上下文。它的hThread参数与CreateProcessA函数的lpProcessInformation参数的位置是一样的。说明这个程序正在访问挂起的进程的上下文。继续像下看:

在这里又调用了函数ReadProcessMemory,为了后面更好的分析,添加一个CONTEXT的结构体。添加之后返回,在地址004011C3处的0A4h处右键发现这个偏移量就是通过[eax+CONTEXT._Ebx]来引用这个进程的EBX寄存器的:

程序在0x004011C9的位置处,结构体以8字节递增,并将这个值压栈,作为要读取内存的起始地址。

程序调用了GetProcAdderss函数,用于获取NtUnmapViewOfSection函数的地址。继续向下可以看到,将buffer作为了NtUnmapViewOfSection函数的一个参数入栈。这样的话NtUnmapViewOfSection就会将新创建的进程的内存空间释放掉,然后就可以开始填充恶意代码了。

程序调用了VirtualAllocEx这个函数,通过它的hProcess参数我们可以知道,这个程序在被挂起的进程的地址空间中分配内存。

在0040121A处,程序会将指向PE字符的指针位置加上34h,其实也就是指向了映像基址的位置,并将这个位置作为了lpAddress的参数,也就是VirtualAllocEx函数将要分配的空间的位置。而在00401213处,会将指向PE字符的指针位置加上50h,这里指的是内存中映像的总尺寸,这个尺寸就是接下来所要分配的内存大小。然后在00401209处的flProtect这个参数的值为40h,表示的是PAGE_EXECUTE_READWRITE,也就是该区域可以执行代码,应用程序可以读写该区域。

内存被分配之后,就会执行下面的指令:

这里调用了函数WriteProcessMemory,用于往内存中写入数据。在程序开始的地方就将指向PE的指针加上54h,也就是SizeOfHeaders程序会将这个地方的数据写入到被挂起的进程所分配的内存中。我们也就知道了这个程序正在移动一个PE文件到另一个进程的地址空间。

继续向下看发现一个循环结构:

这段程序的目的就是将每一个节表复制到被挂起的进程中。到这里就可以知道这个恶意程序已经执行完了加载一个可执行文件到另一个进程的地址空间的步骤。继续向下:

这里调用了函数SetThreadContext,用于设置eax寄存器,这个就是被加载到挂起的进程内存空间中的可执行文件的入口点。一旦这个程序执行了ResumeThread这个函数,它就会成功地将之前CreateProcessA所创建的进程替换为另一个进程。

分析到这里就很明白了,进程的替换已经在发生,那么就要搞清楚哪一个进程正在被替换,哪一个进程被加上伪装在偷偷地执行。这里就要搞清楚CreateProcessA函数的参数lpApplicationName的来源。

将光标移动到4010EA也就是程序开始的地方,查看交叉引用:

来到main函数的位置:

可以看到[ebp+ApplicationName]保存的就是进程的名称。向上查看:

通过分析可以知道函数sub_40149D的目的就是组合成系统目录中svchost.exe的路径。也就是在创建一个svchost进程。

下面我们要知道是哪个程序替换了svchost.exe。

这里需要分析一下lpBuffer这个参数,

可以发现lpBuffer它就是sub_40132C函数的返回值,分析sub_40132C函数发现这个函数就是从当前可执行文件的资源段中复制数据到内存中。使用Resource Hacker来查看一下Lab12-02.exe文件的资源段,应该是被加密了,提出资源文件为独立的文件。回到ida继续分析发现函数sub_401000执行了异或的操作

异或的数值是41h。使用WinHex,将刚刚提取出来的资源文件载入WinHex,选择菜单栏中的编辑”下面的修改数据”,在“XOR”后面填入“41”就ok了。这样就得到了一个PE文件,这个PE文件就是恶意程序来替换svchost这个进程的文件。

好了,分析到这里也就结束了。

问题1:

目的就是创建另一个恶意程序。

问题2:

使用了替换技术。

问题3:

真实功能的代码被保存在了这个程序的资源节中。

问题4:

通过异或加密运算被保护的。

问题5:

一样,也是通过异或加密被保护的。

使用ida打开实验文件Lab12-03.exe,

发现调用了函数SetWindowsHookExA,这个函数允许应用程序挂钩或监控Windows的API函数。参数idhook的值为Odh表示WH_KEYBOARD_LL,作用是监控键盘消息。参数lpfn表示Hook函数的地址,这里为fn,fn函数启用了键盘事件监控。

继续向下看:

这里发现了一个无限循环,调用了函数GetMessageA,目的就是将消息发送到程序进程的钩子函数中。

下面分析一下fn,可以看到如下代码:

 

这两个比较是在判断按键的类型,然后将虚拟按键吗传递给了函数sub_4010C7,双击进去查看一下:

函数一开始利用CreateFile函数打开或创建了一个名为practicalmalwareanalysis.log的文件。继续向下看:

可以看到调用了GetForegroundWindow和GetWindowTextA函数来获取按键的来源

如果程序将窗口标题写入了日志文件就会执行下面的代码:

键盘输入为0x10也就是十进制的16,减8之后还是8。来到地址401220的位置,在byte_40148D中查找:

这里的数据是以0开始的,所以查找的结果是3。

然后3乘以4等于12。也就是0xC作为了off_401441的偏移量。这样就会跳到loc_401249的位置,

到这里就很清楚了,这里就是将字符串[SHIFT]写入到了日志文件中。

问题1:

键盘记录器。

问题2:

使用了SetWindowsHookEx 函数来进行挂钩注入,目的是获取键盘记录。

问题3:

创建了一个名为practicalmalwareanalysis.log的日志文件,目的是来保存键盘记录。

首先进行基础的静态分析,使用Dependency Walker来查看一下实验文件的导入表:

看到了函数CreateRemoteThread,这个函数是用于创建远程线程的。还发现了FindResource和LoadResource这两个关于资源操作的函数,所以使用Resource Hacker来查看一下:

在bin的资源下,发现了MZ和PE,可以确定这是一个PE文件。可以将其提取出来,使用peid可以发现这是个exe程序。

下面进行一下基础的动态分析:

打开Process Monitor,设置好筛选器,然后打开WireShark进行监控,运行程序直接就可以看到恶意程序想要打开一个网址,然后我们看一看Process Monitor的监控:

可以看到恶意程序创建了一个名为wupdmgr.exe的文件在系统目录中,我们将这个与前面提取出来的exe文件进行一下MD5值的比较:

可以发现这两个的MD5值是一样的,也就是说明这两个是同一个文件。

下面看一下WireShark的监控结果

可以看到恶意程序试图从www.practicalmalwareanalysis.com中下载updater.exe

下面使用ida打开实验文件Lab12-04.exe:

在main函数开始的部分可以看到程序在解析"psapi.dll"中用于进程枚举的函数。并且连续使用了三组LoadLibraryGetProcAddress函数组合来解析"EnumProcessModules","GetModuleBaseNameA"和"EnumProcesses"这三个函数。然后将获取到的地址分别保存到dword_40312C,dword_403128,dword_403124中。可以将dword_40312C,dword_403128,dword_403124重命名为"EnumProcessModules","GetModuleBaseNameA"和"EnumProcesses"以便后面的分析。使用快捷键N就可以了,转换之后如下:

下面程序会检查这几个指针的值,下面执行了下图代码:

 

这里程序会枚举当前的进程,返回进程的PID值,并且保存在dwProcessId中。

接着程序会进入一个循环,并且将每个进程的PID值经过运算后,作为参数传递到sub_401000中。双击sub_401000查看一下:

在这里看到了Str2和Str1,这也就是两个字符串,解析出来分别是winlogon.exe和<notreal>。通过后面的分析可以知道将获取到的进程名赋值给Str1然后与Str2比较,也就是和winlogon.exe进行比较。如果比较成功的话把1赋给eax,然后就返回了。

那么这样我们就可以知道,sub_401000的作用就是检查所给的PID值是否为winlogon.exe进程。

这也就解决了第一个问题,上述分析就是sub_401000代码的功能。

问题2:

在这里,程序会将eax也就是sub_401000的返回值与0进行比较,如果相等,就会跳到左边执行,也就是会继续查找PID值。如果不相等,程序就会执行右边。

将dwProcessId作为参数,传递给sub_401174。双击进去查看一下:

一开始函数调用了4010FC,双击进去发现它的功能就是提升权限。返回之后继续向下看:

在这里可以看到调用了函数LoadLibraryA,这个函数的目的就是装载sfc_os.dll这个动态链接库,并且利用函数GetProcAddress来获取sfc_os.dll这个动态链接库中编号为2的地址。并将这个地址保存到lpStartAddress里面。下面程序会调用OpenProcess函数,它会打开winlogon.exe这个进程,并将它的句柄保存在hProcess里面。继续向下分析:

可以看到程序调用了CreateRemoteThread函数。它的一个参数是hProcess参数是,其实也就是winlogon.exe的句柄。而它的lpStartAddress参数则是我们刚才获取的sfc_os.dll中序号为2的函数的地址,它负责向winlogon.exe中进行远程注入。也就是说sfc_os.dll会被系统自动载入到winlogon.exe里面,所以在新创建的线程中不需要加载这个DLL,也就不需使用WriteProcessMemory函数了。

在这里还可以使用Process Explorer查找一下:

说明winlogon.exe包含有sfc_os.dll,说明确实注入成功了。

问题3:

LoadLibraryA装载的就是sfc_os.dll。

问题4:

第四个参数是lpStartAddress。

问题5::

返回到main函数继续向下分析:

在这里可以看到调用了函数GetWindowsDirectoryA,获取Windows目录的路径,然后将其与\system32\wupdmgr.exe进行组合。程序又创建了一个字符串,调用GetTempPathA来获取临时目录的路径,并且与“\winup.exe”进行组合,存储在了NewFileName里面。利用MoveFileA,把wupdmgr.exe改名并且复制到了临时文件夹中。然后程序调用了函数sub_4011FC,双击进去看一下:

调用了函数GetWindowsDirectoryA获取Windows的路径,然后与system32\\wupdmgr.exe进行组合。这个恶意程序正在提取它自身的资源节到硬盘上。然后程序会将提取出来的文件写入到wupdmgr.exe文件。

问题6:

这个恶意程序自己会进行更新,把下载的updater.exe程序保存到window下的system32目录中,并且重命名为wupdmgrd.exe

猜你喜欢

转载自blog.csdn.net/Stronger_99/article/details/89388787