尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

APC异步注入技术详解:GoRedOps原生APC与Early Bird早期鸟注入实战

APC异步注入技术详解:GoRedOps原生APC与Early Bird早期鸟注入实战 APC异步注入技术详解GoRedOps原生APC与Early Bird早期鸟注入实战【免费下载链接】GoRedOps | GoRedOps is a repository dedicated to gathering and sharing advanced techniques and offensive malware for Red Team, with a specific focus on the Go programming language, all is made for educational purpoeses only.项目地址: https://gitcode.com/gh_mirrors/go/GoRedOpsAPC注入Asynchronous Procedure Call异步过程调用是 Windows 红队操作中经典的免线程 Shellcode 执行技术。开源项目GoRedOps用 Go 语言提供了两套完整的教学级实现位于 injection_native_apc 目录的原生APC注入以及位于 Early_Bird_APC_Injection 目录的Early Bird 早期鸟注入。本文面向新手从原理到实战带你拆解这两种 APC 异步注入的运行流程与关键系统调用。 什么是APC注入先搞懂异步过程调用可以把 APC 理解成 Windows 内核提供的一个线程级待办消息队列调用方往目标线程的 APC 队列里塞一个回调地址当线程返回用户态并处理消息时内核会替它执行这个回调整个过程不需要新建线程代码就跑在目标线程自己的上下文里。这正是 APC 注入的精髓借用目标线程的手执行自己的代码。 关键前提什么样的线程会执行APC普通用户 APC 只在可告警Alertable线程进入内核等待时才被处理。因此红队有两种思路思路做法对应 GoRedOps 模块特殊 APC使用NtQueueApcThreadEx投递特殊用户APC无需线程处于告警等待状态原生APC注入早期注入把目标进程调试挂起在其初始化前排队 APC唤醒后立即执行Early Bird 注入 原生APC注入三步看懂 injection_native_apc/main.go该模块演示如何用原生 ntdll 系统调用Native 方式绕过 kernel32 封装层把 Shellcode 注入当前进程线程并执行。整个流程只有三步1️⃣ 内存落地分配空间并写入Shellcode调用NtAllocateVirtualMemory在进程内预留一块PAGE_READWRITE内存用一个简单的字节拷贝循环把 Shellcode 写入调用NtProtectVirtualMemory把权限切换为PAGE_EXECUTE_READ。 这是 Windows 注入的通用套路先读写写入再改可执行避免一开始就暴露 RWX 内存。2️⃣ 排队执行NtQueueApcThreadEx 的特殊之处核心调用只有 6 个参数把 Shellcode 地址作为特殊 APC 例程投递给当前线程NtQueueApcThreadEx(当前线程句柄, SPECIAL_USER_APC 标志1, baseA, 0, 0, 0)与普通 APC 不同特殊用户APC在系统调用返回用户态时就会被调度执行——目标线程无需先进入等待状态这让注入的触发时机更即时、更可控。3️⃣ 全程无新线程痕迹对比同仓库的线程注入实现injection_thread/createThread/main.go使用CreateThread、injection_thread/ntCreateThreadEx/main.go使用NtCreateThreadExAPC 注入不创建任何新线程也就不存在远程线程创建这类最容易被 EDR 捕获的行为特征。⏱️ Early Bird 注入在目标睁眼前完成注入所谓 Early Bird早期鸟指的是在目标进程尚未完成初始化时就注入代码。Early_Bird_APC_Injection/Early_Bird_APC_Injection.go 的实战流程分为四步① 用 DEBUG_PROCESS 抓住黄金窗口调用CreateProcessA创建目标进程时传入DEBUG_PROCESS标志0x00000001。内核会在新进程主线程首次执行应用代码之前就把它挂起此时目标进程尚未加载大部分模块、未运行入口点调试器也就是注入方可以从容地读写它的内存。这就是 Early Bird 名称的由来——抢在所有人之前落子。② 四件套分配、写入、改权限、排队VirtualAllocEx → 在目标进程分配可读写内存 WriteProcessMemory → 把Shellcode写进目标进程 VirtualProtectEx → 切换为 PAGE_EXECUTE_READWRITE QueueUserAPC → 把Shellcode地址排队到目标主线程③ 唤醒目标DebugActiveProcessStop 的时机艺术队列排好后调用DebugActiveProcessStop(目标PID)解除调试停止。主线程被唤醒后进入内核等待并处理消息队列APC 中的 Shellcode 随即执行——整个过程发生在目标应用自身初始化逻辑之前。⚠️ 早期注入的隐藏约束因为此时目标进程的加载器尚未完全就绪Shellcode 必须做到位置无关不依赖固定地址自包含自己从 PEB 解析所需 API示例中弹出计算器的 Shellcode 正是自行遍历 PEB Ldr 结构解析WinExec不能调用依赖完整初始化状态的 Win32 高级 API。 两种APC注入横向对比怎么选对比维度原生APC注入Early Bird 注入注入时机目标已正常运行随时投递目标启动前的调试挂起窗口目标进程状态正常运行中被创建者调试挂起核心APINtQueueApcThreadExntdll 原生QueueUserAPCDebugActiveProcessStopkernel32是否创建新线程❌ 不创建❌ 不创建适用场景对已在运行的进程投递代码需要在应用初始化逻辑之前执行代码教学看点原生系统调用、特殊APC机制调试器时序控制、跨进程内存操作 一句话总结要对活着的进程注入选原生APC要对刚出生的进程注入选 Early Bird。️ 防御视角APC注入会留下哪些检测信号学习注入技术的最佳方式是同时理解防御方如何发现它RWX 内存页VirtualProtectEx切换执行权限会产生可审计的内存保护变更APC 队列异常目标线程的 APC 队列中出现指向非模块内存未映射到任何合法 DLL/EXE 区段的用户 APC调试器附着合法进程CreateProcessA(DEBUG_PROCESS)会在系统日志与 EDR 中留下调试事件时序异常主线程在应用初始化完成前执行了来路不明的代码。GoRedOps 仓库中也配套了相应的对抗与检测模块可作为延伸学习反调试技术AntiDebugNOPACKAGE/AntiDebug.go、AntiDebugPackage/main.goETW/AMSI 绕过ETWBypass/main.go、Lifetime-AMSI-ETW-Bypass/main.go无线程注入Threadless_Injection/Threadless_Injection.go远程映射注入Remote_Mapping_Injection/Remote_Mapping_Injection.go 快速上手如何本地运行这套APC注入示例环境要求Windows 系统 Go 1.20 及以上版本。git clone https://gitcode.com/gh_mirrors/go/GoRedOps cd GoRedOps cd injection_native_apc # 或 cd Early_Bird_APC_Injection go run main.go示例 Shellcode 仅为弹出系统计算器的教学载荷运行后可直接观察注入效果无需额外依赖。⚠️免责声明GoRedOps 与本文所有技术内容仅用于安全教育与防御研究请仅在授权环境与自有测试系统中实践切勿用于任何未授权的攻击行为。小结APC 异步注入通过借用目标线程执行 Shellcode实现了免线程的进程代码执行。GoRedOps 用两段精炼的 Go 代码分别展示了特殊 APC 即时执行与调试挂起窗口早期注入两种姿势——读懂这两份源码你就掌握了 Windows 进程注入技术树上最经典的一条分支。【免费下载链接】GoRedOps | GoRedOps is a repository dedicated to gathering and sharing advanced techniques and offensive malware for Red Team, with a specific focus on the Go programming language, all is made for educational purpoeses only.项目地址: https://gitcode.com/gh_mirrors/go/GoRedOps创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表