1. 启动器(Launcher)
启动器,也叫加载器。主要用来加载恶意代码,其主要目的就是安装恶意程序。
比较常见的手法是在其资源节中加载可执行文件或DLL。其加载时通常会加载以下的API函数:
FindResource
LoadResource
SizeofResource
.....
其运行时通常需要管理员或以上权限运行;普通的用户进程无法执行加载器的功能;同时加载器通常会包含提权的操作。
2. 进程注入
隐藏启动最主流的技术是进程注入。其主要是把恶意代码注入到正在运行的进程中。
其注入时通常会调用以下的Windows API函数:
VirtualAllocEx:在进程中分配内存空间
WriteProcessMemory:向VirtualAllocEx分配的内存空间与数据
LoadLibrary
CreateRemoteThread
.....
2.1 DLL注入
最主流也是最常用的注入技术,其注入的逻辑如下所示:
将恶意代码注入到一个远程进程
远程调用Loadlibrary,从而强制远程进程加载一个DLL程序到它的上下文
一旦被注入了恶意的DLL,OS自动调用DllMain函数,其拥有与被注入的进程相同的系统权限
如下图所示:在恶意DLL注入到IE浏览器以前其不能访问到互联网,但是其被注入到IE浏览器以后,其就与IE浏览器有相同的权限,这样的话其就可以访问互联网了。
在注入的时候有以下关键的操作点:
2.1.1 获取句柄(hProcess)
使用windows API函数CreateToolhelp32Snapshot、Process32First和Process32Next来查找进程列表中的目标进程
一旦发现目标进程,启动器会提取目标进程的PID
使用OpenProcess提取PID,以获取目标的句柄(hProcess)
2.1.2 创建远程线程(CreateRemoteThread)
DLL注入使用CreateRemoteThread函数来创建一个新的线程,其中有三个重要的参数:
使用OpenProcess函数获得进程句柄(hProcess)
注入线程的注入点(lpStartAddress),可能被设置为LoadLibrary函数的地址,并且恶意DLL名字作为它的参数
线程的参数(hpParameter)
2.1.3 创建内存空间(VirtualAllocEx)
如果提供远程进程的句柄,VirtualAllocEx函数将在远程进程中分配内存空间。
2.1.4 写入内存空间(WriteProcessMemory)
将恶意DLL程序的名字字符串写入到VitualAllocEx分配的内存空间中。
2.1.5 DLL注入案例
2.2 直接注入
同DLL注入一样都使用了相同的Windows API函数,不同的是,其并不需要单独编写DLL并且强制远程进程加载它,而是直接将恶意代码注入到远程进程中。
其有以下特征:
灵活
如果想要注入成功,需要大量的代码定制
其主要场景为用来注入shellcode
一般情况下,直接注入的话一般会调用以下函数:
VirtualAllocEx
WriteProcessMemory
CreateRemoteThread
直接注入的话技术难度比较大,一般仅仅是注入相对简单的shellcode。
3. 进程替换
将一个可执行文件重写到一个运行进程的内存空间,可将恶意代码伪装成一个合法进程,并且不会产生DLL注入让进程崩溃的危险。
替换的进程与被替换的进程拥有相同的特权级
4. 钩子(Hook)注入
详细案例可参考个人文章:
https://www.yuque.com/feiniao112/fknpgi/bipabi
5. Detours
详细案例可参考个人文章:
https://www.yuque.com/feiniao112/fknpgi/bipabi
6. APC注入
详细可参考个人语雀的实践:
https://www.yuque.com/feiniao112/fknpgi/sz9waa