0%

DLL注入样本分析

前言

最近在抓紧看《恶意代码分析实战》这本书,希望今年能够看完,基本上做毕设的一些基础知识打牢,毕竟自己在Windows编程这方面还是个婴儿。最近也没有更新博客,主要还是没能专心去学习,不知道在干嘛,时间就过去了,自己还是要专心,专心,专心!(这篇文章一拖再拖,隔了一个礼拜终于开始写)

正文

DLL注入

​ DLL注入是进程注入的一种形式,它强迫一个远程进程加载恶意的DLL代码,使得恶意代码以远程进程的线程存在。DLL注入将代码注入到一个远程进程,让远程远程调用LoadLibrary,从而强制远程进程加载一个DLL程序到它的进程上下文中。一旦被感染的进程加载了恶意的DLL程序,OS会自动调用DllMain函数,DllMain函数由这个DLL程序的作者编写。同时这个DllMain函数中的恶意代码拥有被感染进程相同的权限。

DLL注入的一般步骤:

  1. 使用WindowsAPI函数CreateToolhelp32Snapshot,Process32First和Process32Next来查找进程列表中的进程,一旦查找到进程,启动器就会提取该进程的PID,通过调用OpenProcess,来获取进程的句柄。
  2. 使用函数VirtualAllocEx,为恶意DLL的名字字符串创建内存空间,然后调用WriteProcessMemory,将恶意DLL程序的名字写入到目标进程的内存空间中。
  3. 使用CreateRemoteThread函数,这个函数可以让启动器在远程进程中创建一个新线程。其需要传入三个重要参数,OpenProcess函数获得的句柄hProcess,注入线程的入口点lpStartAddress以及线程参数hpParameter。这里线程入口点可以被设置为LoadLibrary函数的地址,并且恶意DLL名字作为它的参数,这样会让受害进程以恶意DLL名称调用LoadLibrary函数,因此恶意的DLL就被加载到目标进程中。

样本分析

这次样本为:

Lab12-01.exe DAFBEA2A91F86BF5E52EFA3BAC3F1B16

Lab12-01.dll A6FB0D8FDEA1C15AFBA7A5DDB3D2867B

Lab12-01.exe

通过基础的静态动态分析检查出Lab12-01.exe的导入函数就是上面说的DLL注入启动器需要的函数,还找到了字符串;

explorer.exe

Lab12-01.dll

psapi.dll

并且动态运行可以看到:

DNAE8O.png

procmon和process Explorer也没有显示更多信息。

接下来先将Lab12-01.exe导入到ida查看一下:

main函数一进来首先导入EnumProcessModules,GetModuleBaseNameA和EnumProcesses三个API函数到dword_408714,dword_40870C和dword_408710中,为了分析方便按N键重命名数据

Dt5yi8.png

然后将同目录下的Lab12-01.dll绝对路径导入到堆栈上的buffer上:

Dt5HWF.png

然后调用EnumProcesses获取进程列表,将进程信息保存在堆栈中,如果返回值不为0,则跳到loc_4011D0上:

DtIgk6.png

跳到loc_4011D0可以看到var_1120保存实际进程数量通过指令shr eax, 2转换字节序,结果保存在var_117C中,然后对var_112C传递0,这里是以进程数量迭代做了一个循环

DtOyFA.png

可以看到这里将进程的PID以参数传入子函数sub_401000中

DtX2N9.png

子函数功能很简单,就是通过PID和OpenProcess函数获取进程句柄,然后使用EnumProcessModules和GetModuleBaseNameA获取进程名称和explorer.exe进行比较

Dtj881.png

如果找到explorer.exe进程,则跳出循环,调用VirtualAllocEx和WriteProcessMemory将刚才buffer中的DLL绝对路径写入到explorer.exe进程中:

Dtvpxx.png

最后,调用GetModuleHandleA和GetProcAddress来获取LoadLibraryA的在本进程中地址,因为启动器和explorer.exe都加载了kernel32.dll,所以LoadLibraryA的地址是相同的

Dtv2S1.png

然后调用了CreateRemoteThread在目标进程中创建线程,注意这里那三个重要参数,可以用ida找到参数来源。

Lab12-01.dll

这个DLL程序比较简单,进入DllMain函数查看,其会调用CreateThread函数创建线程子函数sub_10001030:

DNFdyj.png

进入sub_10001030查看,可以看到这里是一个死循环,同时格式化字符串传入StartAddress为参数lpStartAddress的CreateThread函数,然后调用sleep函数,睡眠0xEA60h(也就是60000,一分钟)

DNk3jJ.png

StartAddress所指的代码给MessageBoxA函数传参,弹出窗口

DNkBge.png

by the way

使用OD附加到explorer.exe进程中,查看内存映射结构:

DNAdZn.png

可以看出explorer.exe进程已经加载Lab12-01.dll,要想清除也很简单,正常重启explorer.exe进程,就不会加载Lab12-01.dll