免入土(六)BasicLoader
1. 概述
本文主要内容是本人收集到的公开的且还算有价值的 Loader ,这些 Loader 并不是能够直接使用的 Loader,要将其相互结合或者,结合其他的方式去使用的。
主要是我目前发现现在的知识学习似乎都存在了门槛,大家都喜欢把一个东西描述得非常高大上,让我这种普通人不敢靠近,我的目的呢,就是把这些高大上的东西普通化,让大家都能看得懂(看不懂也没关系,可以根据以下内容在进行学习,因为以下内容简化得比较严重,建议结合代码一块看,代码肯定是简化的,主要是为了让大家理解这个过程),能够知道这个东西的原理。
本文的主要目的只是将目前已有的一些方法收集起来,并编写一份 demo 示例供大家学习参考。(越写越觉得这门技术深奥,就不想写了,后面就几个没写而已,大家将就着看吧)
代码放在 github 仓库:https://github.com/candyb0x/BasicLoader(反正没啥用,大家随便看看得了)
难度 | 技术名称 | 简介 |
---|---|---|
⭐ 简单 | CreateRemoteThread | 最常用远程线程注入 |
QueueUserAPC | 把 Shellcode 加到 APC 队列 | |
SetThreadContext | 修改线程上下文指向恶意代码 | |
Manual Mapping (基础) | 不用 LoadLibrary 手动加载 | |
TLS Callback 执行 | 在 TLS 回调中执行 Loader | |
SEH Loader | 异常处理向量中执行恶意代码 | |
VEH Loader | Vectored Exception Handler 注入 |
难度 | 技术名称 | 简介 |
---|---|---|
进阶 | Reflective DLL Injection | 反射式 DLL 注入 |
Process Hollowing | 替换进程映像 | |
Early Bird APC | 提前投递 APC 注入 | |
Transacted Hollowing | 使用事务注入进程 | |
Process Doppelganging | NTFS 特性实现注入 | |
Herpaderping | 修改映像后再执行 | |
AtomBombing | 全局原子表注入 | |
Thread Hijacking | 劫持已有线程执行 |
2. CreateRemoteThread(Shellcode + Dll)
CreateRemoteThread注入是一种进程注入技术,通过以下步骤在目标进程中执行代码:
- 获取目标进程句柄 - 使用
OpenProcess
打开目标进程 - 在目标进程中分配内存 - 使用
VirtualAllocEx
分配可执行内存 - 写入代码到目标进程 - 使用
WriteProcessMemory
写入shellcode或DLL路径 - 创建远程线程执行 - 使用
CreateRemoteThread
在目标进程中创建线程执行代码
3. ApcInjection(Shellcode + Dll)
Asynchronous Procedure Call(异步过程调用,APC) 是 Windows 内核里的一种线程异步回调机制。
Windows 的多线程需要线程在「合适时机」去执行额外的回调任务(比如:I/O 完成通知、延迟执行某个回调)。为了不打断线程当前正在做的事,而是等到线程进入「安全点」或「空闲点」时再执行。
- 内核模式 I/O:I/O 完成后要回调用户态函数。
- 用户态:允许程序自己用
QueueUserAPC
给线程排任务。
每个线程内部有一个APC 队列:
- 用户模式 APC 队列(User-Mode APC Queue)
- 内核模式 APC 队列(Kernel-Mode APC Queue)
线程在运行时,如果:
- 调用了可警告型等待函数:如
SleepEx
,WaitForSingleObjectEx
,并且bAlertable=TRUE
; - 在新线程刚刚启动时(Early Bird 场景);
- 被
NtAlertResumeThread
恢复时(会触发 alert);
就会检查 APC 队列是否有任务,如果有,就调用队列里排队的 APC 回调函数;
APC 注入是一种常见的 Windows 注入技术,主要流程如下:
- 打开目标进程(OpenProcess)。
- 申请远程内存(VirtualAllocEx)。
- 写入 shellcode(WriteProcessMemory)。
- 查找目标进程的线程句柄(OpenThread)。
- 使用 QueueUserAPC 将 shellcode 地址排入目标线程的 APC 队列。
- 等待目标线程进入可警告状态(如 SleepEx、WaitForSingleObjectEx 等),APC 被执行。
4. SetThreadContext(Shellcode + Dll)
SetThreadContext
是 Windows 提供的 API,用来设置线程的上下文(寄存器、指令指针等)。
在免杀中可以通过:
- 修改目标线程的 指令寄存器(EIP/RIP),让线程「执行」你想要的 shellcode,而不显式调用可疑 API(如
CreateRemoteThread
或NtCreateThreadEx
)。 - 因为 SetThreadContext 本身是一个系统合法的调试 API,被检测规则较少,相对隐蔽。
SetThreadContext注入利用流程:
- 创建目标进程(挂起状态),使用 CreateProcess,带 CREATE_SUSPENDED 标志,启动目标进程但不让其立即运行。
- 在目标进程分配内存,用 VirtualAllocEx 在目标进程空间分配一块内存,用于存放shellcode或DLL路径。
- 写入payload,用 WriteProcessMemory 将shellcode或DLL路径写入上一步分配的内存。
- 获取目标线程上下文,用 GetThreadContext 获取主线程的上下文(寄存器等信息)。
- 修改线程上下文,修改上下文中的指令指针(EIP/RIP),让其指向你写入的shellcode,或指向 LoadLibraryA 并设置参数为DLL路径。
- 设置新的线程上下文,用 SetThreadContext 将修改后的上下文写回目标线程。
- 恢复线程运行,用 ResumeThread 恢复线程,目标进程会从你指定的位置(shellcode或LoadLibraryA)开始执行。
5. Manual Mapping(Dll)
Windows 加载 DLL 时,正常流程是:
- 调用
LoadLibrary
(或者LdrLoadDll
) → 加载 DLL → 调用入口点(DllMain) - 系统内部做了:分配内存、解析导入表(IAT)、重定位(relocation)、初始化 TLS、调用入口点等
Manual Mapping 的核心思路:
- 自己(手动)完成
LoadLibrary
做的事:分配内存、把 PE 文件内容写过去、修复重定位、修复导入表、初始化 TLS、手动调用入口点(DllMain)
而不调用 LoadLibrary / LdrLoadDll 这些容易被检测或 Hook 的系统 API。
6. TLSCallback(Shellcode + Dll)
TLS(Thread Local Storage)是 Windows 提供的一种机制,用来为每个线程分配线程局部变量。
PE 文件(EXE/DLL)中可以定义 TLS 回调函数(TLS Callback):
- 在进程或线程创建/终止时,由系统自动调用这些回调函数。
- 调用时机:在调用
DllMain
之前,甚至在入口点之前。
也就是说,如果一个 DLL 或 EXE 定义了 TLS Callback:
- 加载时(
LoadLibrary
/LdrLoadDll
/启动进程时) - 系统会隐式先执行这些回调
正常的安全检测通常只关注:
DllMain
/main
/WinMain
/wWinMain
等入口点- 常规注入行为(如
CreateRemoteThread
、NtCreateThreadEx
) - 某些导出函数的调用
TLS Callback 是隐藏在 PE 文件结构里的,属于系统自动调用:
很多杀软/EDR 并不解析或执行 TLS Callback,只是检查
DllMain
。手动在 TLS Callback 里放恶意逻辑:
shellcode 加载
行为注入
反射加载自身
系统会自动执行这些逻辑,但安全产品可能忽略了。
不知道为啥,这个实验在 x64 死活弄不出来,也没 debug 到原因,x86 是成功了;
7. SEHLoader(Shellcode + Dll)
SEH(Structured Exception Handling)是 Windows 的结构化异常处理机制,用来捕获并处理运行时异常(比如访问冲突、除零错误等)。
SEH Loader 是一种利用 SEH 来「隐藏」恶意代码加载的技术:
- 在执行时故意制造异常(比如非法内存访问)
- 注册一个自定义的 SEH 异常处理函数
- 异常发生后,控制流就会自动转到异常处理函数 → 在处理函数里执行恶意 payload(比如 shellcode)
8. VEH Loader
先放几篇文章吧,这个技术貌似正盛啊
- https://www.freebuf.com/articles/web/422826.html
- https://github.com/patrickt2017/VEHNetLoader/tree/main
- https://github.com/Ymjie/ShellStepVEH/tree/main
- https://www.xiasec.com/437.html
VEH 全称:向量化异常处理(Vectored Exception Handling)
- 是 Windows XP+ 引入的一种全局异常机制
- 通过
AddVectoredExceptionHandler
注册 - 系统在发生异常时,会首先调用 VEH → 然后才是 SEH
特点:
- VEH 是进程级别,全局有效(不依赖具体线程或局部
__try/__except
块) - 可以更早地拦截异常
- 注册简单,只需一次调用,不影响正常流程
9. Reflective DLL Injection
我们的目的是为了学习了解反射 dll,虽然说这位师傅已经说是 dll 反射注入的简洁版,但是我觉得,还是不够简洁,我再优化一下,方便各位师傅,学习 dll 反射注入的使用方法和思路;
什么是Reflective DLL Injection?
正常 DLL 注入:
- 调用
LoadLibrary
或LdrLoadDll
→ 系统加载 DLL → 调用 DllMain - 系统自动完成:分配内存、解析导入表、重定位、TLS 初始化等
Reflective DLL Injection:
自己在 dll 中写一个导出的 loader 函数(通常叫 ReflectiveLoader)
把 DLL 自己(包括 ReflectiveLoader)整体写入目标进程内存
在目标进程里,执行 ReflectiveLoader:
自己做:重定位、解析导入表、调用入口点(DllMain)
不调用
LoadLibrary
/LdrLoadDll
10. Process Hollowing
后面的不太想写了,好累啊
11. Early Bird APC
12. Transacted Hollowing
参考内容:
- https://www.y0ng.top/2024/09/03/Process-Injection2/
- https://github.com/hasherezade/transacted_hollowing
Transacted Hollowing(事务性进程悬空/挂马)是一种Windows下的进程注入技术,常用于免杀和绕过安全检测。其核心原理是利用NTFS的事务特性,在未落盘的情况下将恶意代码注入到目标进程,实现代码执行且难以被查杀。
- 创建一个NTFS事务。
- 在事务中创建一个临时可执行文件(未真正写入磁盘)。
- 读取恶意PE。
- 创建挂起进程(如notepad.exe)。
- 用恶意PE替换挂起进程的内存映像。
- 恢复进程运行,实现“挂马”。
13. Process Doppelganging
https://github.com/hasherezade/process_doppelganging
14. Herpaderping
https://github.com/jxy-s/herpaderping
15. AtomBombing
https://github.com/BreakingMalwareResearch/atom-bombing