免入土(六)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注入是一种进程注入技术,通过以下步骤在目标进程中执行代码

  1. 获取目标进程句柄 - 使用OpenProcess打开目标进程
  2. 在目标进程中分配内存 - 使用VirtualAllocEx分配可执行内存
  3. 写入代码到目标进程 - 使用WriteProcessMemory写入shellcode或DLL路径
  4. 创建远程线程执行 - 使用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 注入技术,主要流程如下

  1. 打开目标进程(OpenProcess)。
  2. 申请远程内存(VirtualAllocEx)。
  3. 写入 shellcode(WriteProcessMemory)。
  4. 查找目标进程的线程句柄(OpenThread)。
  5. 使用 QueueUserAPC 将 shellcode 地址排入目标线程的 APC 队列。
  6. 等待目标线程进入可警告状态(如 SleepEx、WaitForSingleObjectEx 等),APC 被执行。

4. SetThreadContext(Shellcode + Dll)

SetThreadContext 是 Windows 提供的 API,用来设置线程的上下文(寄存器、指令指针等)。
在免杀中可以通过:

  • 修改目标线程的 指令寄存器(EIP/RIP),让线程「执行」你想要的 shellcode,而不显式调用可疑 API(如 CreateRemoteThreadNtCreateThreadEx)。
  • 因为 SetThreadContext 本身是一个系统合法的调试 API,被检测规则较少,相对隐蔽。

SetThreadContext注入利用流程:

  1. 创建目标进程(挂起状态),使用 CreateProcess,带 CREATE_SUSPENDED 标志,启动目标进程但不让其立即运行。
  2. 在目标进程分配内存,用 VirtualAllocEx 在目标进程空间分配一块内存,用于存放shellcode或DLL路径。
  3. 写入payload,用 WriteProcessMemory 将shellcode或DLL路径写入上一步分配的内存。
  4. 获取目标线程上下文,用 GetThreadContext 获取主线程的上下文(寄存器等信息)。
  5. 修改线程上下文,修改上下文中的指令指针(EIP/RIP),让其指向你写入的shellcode,或指向 LoadLibraryA 并设置参数为DLL路径。
  6. 设置新的线程上下文,用 SetThreadContext 将修改后的上下文写回目标线程。
  7. 恢复线程运行,用 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 等入口点
  • 常规注入行为(如 CreateRemoteThreadNtCreateThreadEx
  • 某些导出函数的调用

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

先放几篇文章吧,这个技术貌似正盛啊

  1. https://www.freebuf.com/articles/web/422826.html
  2. https://github.com/patrickt2017/VEHNetLoader/tree/main
  3. https://github.com/Ymjie/ShellStepVEH/tree/main
  4. https://www.xiasec.com/437.html

VEH 全称:向量化异常处理(Vectored Exception Handling)

  • 是 Windows XP+ 引入的一种全局异常机制
  • 通过 AddVectoredExceptionHandler 注册
  • 系统在发生异常时,会首先调用 VEH → 然后才是 SEH

特点:

  • VEH 是进程级别,全局有效(不依赖具体线程或局部 __try/__except 块)
  • 可以更早地拦截异常
  • 注册简单,只需一次调用,不影响正常流程

9. Reflective DLL Injection

参考链接:https://l1pmoluy.github.io/2025/03/26/DLL%E5%8F%8D%E5%B0%84%E6%B3%A8%E5%85%A5blog%E7%AE%80%E6%B4%81%E7%89%88/

我们的目的是为了学习了解反射 dll,虽然说这位师傅已经说是 dll 反射注入的简洁版,但是我觉得,还是不够简洁,我再优化一下,方便各位师傅,学习 dll 反射注入的使用方法和思路;

什么是Reflective DLL Injection?

正常 DLL 注入:

  • 调用 LoadLibraryLdrLoadDll → 系统加载 DLL → 调用 DllMain
  • 系统自动完成:分配内存、解析导入表、重定位、TLS 初始化等

Reflective DLL Injection:

  • 自己在 dll 中写一个导出的 loader 函数(通常叫 ReflectiveLoader)

  • 把 DLL 自己(包括 ReflectiveLoader)整体写入目标进程内存

  • 在目标进程里,执行 ReflectiveLoader:

  • 自己做:重定位、解析导入表、调用入口点(DllMain)

  • 不调用 LoadLibrary/LdrLoadDll

10. Process Hollowing

后面的不太想写了,好累啊

11. Early Bird APC

img

12. Transacted Hollowing

参考内容:

  1. https://www.y0ng.top/2024/09/03/Process-Injection2/
  2. https://github.com/hasherezade/transacted_hollowing

Transacted Hollowing(事务性进程悬空/挂马)是一种Windows下的进程注入技术,常用于免杀和绕过安全检测。其核心原理是利用NTFS的事务特性,在未落盘的情况下将恶意代码注入到目标进程,实现代码执行且难以被查杀。

  1. 创建一个NTFS事务。
  2. 在事务中创建一个临时可执行文件(未真正写入磁盘)。
  3. 读取恶意PE。
  4. 创建挂起进程(如notepad.exe)。
  5. 用恶意PE替换挂起进程的内存映像。
  6. 恢复进程运行,实现“挂马”。

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

16. Thread Hijacking

参考链接

  1. https://idiotc4t.com/
  2. https://cloud.tencent.com/developer/article/2483719
  3. https://shut-td.github.io/CS%E8%BF%9C%E6%8E%A7%E5%85%8D%E6%9D%80%E6%80%9D%E8%B7%AF%E4%B8%8E%E5%AE%9E%E7%8E%B0/
  4. https://l1pmoluy.github.io/2025/03/26/DLL%E5%8F%8D%E5%B0%84%E6%B3%A8%E5%85%A5blog%E7%AE%80%E6%B4%81%E7%89%88/

免入土(六)BasicLoader
http://candyb0x.github.io/2025/07/19/免入土(六)BasicLoader/
作者
Candy
发布于
2025年7月19日
更新于
2025年7月19日
许可协议