Hue-Jhan/Ntdll-Apc-Injection-Trojans
GitHub: Hue-Jhan/Ntdll-Apc-Injection-Trojans
基于Windows原生API和异步过程调用技术的远程shellcode加载器集合,用于红队场景下的隐蔽进程注入与DLL加载。
Stars: 2 | Forks: 0
# 原生 API Apc 注入木马
使用异步过程调用、Windows 原生 API、底层工具和隐蔽技术的一系列远程 shellcode 加载器。
此代码仅用于教育目的,请勿将其用于任何恶意或未授权的活动。
# 🖥️ 代码
此仓库是[该仓库](https://github.com/Hue-Jhan/Apc-Process-Injection-and-DLL-injection)的进阶版本,包含 3 个具有相同基础结构并共享大部分代码的项目,分别是:Nt APC 注入、DLL 版本以及 DLL 注入器(使用 APC 的 LoadLibrary),其 shellcode 用于弹出一个 Windows 消息框。在所有 3 个示例中,都有 2 种选择线程以排队 shellcode/dll 的版本:
- 我们要么找到第一个线程并向其排队;
- 要么我们枚举进程的每一个线程,并向所有这些线程排队。
另外,我忘记从与原生 api 相关的部分中移除一些无用的函数了,比如 `NtCreateThreadEx` 或 `NtGetThreadContext`,因为我从 `injection.h`(我之前仓库的一部分)中提取了大部分的 `apc.h`,所以你应该移除它们,以减少从 ntdll 解析的函数数量,从而提高隐蔽性。正如你所见,我在每段代码旁边都标明了其原始可执行文件在 VirusTotal 上的检出率。
### Native Api 解析
我们不使用简单的 ```Windows.h``` API 函数,而是使用 ntdll 函数,它们有时在用户态下不太容易被 EDR 挂钩。这些是暴露给用户模式的最低级别的 Win API 调用,也是最接近 Windows 内核的接口,在它们之下只有系统调用(将来我会制作一个 Syscall 版本)。一旦我们获得了 ntdll 的句柄,我们就会在运行时动态解析其函数,并且使用它们的方式与使用经典 Windows API 函数的方式类似:
- 为了使用 Ntdll,我们为每个函数创建了自定义的 typedef 结构体,并定义了它们所需的所有内部结构和对象,有时结构体可能是嵌套的,甚至需要更多的内部对象;
- 然后我们使用 ```GetNtFunctionAddress``` 函数,通过 ```GetProcAddress``` 从 ntdll 动态检索 NT 函数的地址。
- 一旦我们在 `InitNtFunctions()` 中检索到它们,就可以直接调用这些原生 NT 函数并将它们用于注入。
### 1) APC 简单进程注入
1. 首先 shellcode 会被解密,为了更好地了解加密机制,请在[此处](https://github.com/Hue-Jhan/Simple-shellcode-crypter)查看;
2. 接着,我们通过枚举系统进程的快照来查找目标进程并获取其句柄,为此我们使用 `NtQuerySystemInformation()`,一旦找到与名称匹配的进程,我们就会保存其 pid,并使用具有正确权限的 `NtOpenProcess()` 获取句柄;
3. 然后我们在远程进程中使用对应的原生函数执行经典的 分配 -> 写入/复制 -> 保护为 RWX 的操作;
4. 接着,我们要么将 shellcode 排队到我们找到的第一个线程,要么使用函数 `ShotgunApc()` 将其排队到该进程的所有线程。具体做法是:遍历系统的所有线程,定位到属于我们之前目标进程的第一个线程(或所有线程),保存其 Tid 并使用 `NtOpenThread()` 获取句柄。
### 2) DLL 版本
该 DLL 版本在被注入的进程中执行完全相同的操作,在 loader lock 之外的新线程对于避免死锁至关重要。你可能还需要禁用预编译头文件以移除 pch 文件以及避免 Visual Studio 报错。
如果该 DLL 正在被 Early Bird 注入器注入,它可能无法正常工作(我将来会上传该注入器)。
### 3) DLL 注入
在远程进程中加载恶意的 Dll,并向其排队 LoadLibraryA(是的,这种方法确实有点垃圾),在构建 exe 之前,请将 Dll 放置在其他文件旁边。以下是执行流程:
1. 首先,dll(被视为资源)从 exe 中提取并写入磁盘,然后计算其路径/大小/名称长度以及其他信息;
2. 其次,我们通过枚举系统进程的快照来查找目标进程并获取其句柄;
3. 然后,我们在目标进程内分配与 dll 路径大小相同的内存,将路径写入进程,并将其设置为 RWX;
4. 接着,我们获取 kernel32 dll 的基地址,以获取用于加载恶意库的函数指针;
5. 最后,我们使用 LoadLibrary 将 Dll 的基地址排队到进程中,可以排队到其第一个线程,也可以排队到所有线程。
这种 dll 注入方法根本不具备隐蔽性,但它是最快的,此外,默认情况下 DLL 比可执行文件更具隐蔽性。
# 🛡️ AV 检测
会被 BitDefender Advanced Thread Defense 拦截,但通常能绕过 Windows Defender。以下是具有混淆元数据的可执行文件的检出情况,第一个是 dll 注入器的检出,第二个是经典注入器和 dll 版本的检出。使用 Windows 默认应用程序的元数据可以将检出率降至 0,如这里使用 Mshta.exe 所示
使用异步过程调用、Windows 原生 API、底层工具和隐蔽技术的一系列远程 shellcode 加载器。
此代码仅用于教育目的,请勿将其用于任何恶意或未授权的活动。
# 🖥️ 代码
此仓库是[该仓库](https://github.com/Hue-Jhan/Apc-Process-Injection-and-DLL-injection)的进阶版本,包含 3 个具有相同基础结构并共享大部分代码的项目,分别是:Nt APC 注入、DLL 版本以及 DLL 注入器(使用 APC 的 LoadLibrary),其 shellcode 用于弹出一个 Windows 消息框。在所有 3 个示例中,都有 2 种选择线程以排队 shellcode/dll 的版本:
- 我们要么找到第一个线程并向其排队;
- 要么我们枚举进程的每一个线程,并向所有这些线程排队。
另外,我忘记从与原生 api 相关的部分中移除一些无用的函数了,比如 `NtCreateThreadEx` 或 `NtGetThreadContext`,因为我从 `injection.h`(我之前仓库的一部分)中提取了大部分的 `apc.h`,所以你应该移除它们,以减少从 ntdll 解析的函数数量,从而提高隐蔽性。正如你所见,我在每段代码旁边都标明了其原始可执行文件在 VirusTotal 上的检出率。
### Native Api 解析
我们不使用简单的 ```Windows.h``` API 函数,而是使用 ntdll 函数,它们有时在用户态下不太容易被 EDR 挂钩。这些是暴露给用户模式的最低级别的 Win API 调用,也是最接近 Windows 内核的接口,在它们之下只有系统调用(将来我会制作一个 Syscall 版本)。一旦我们获得了 ntdll 的句柄,我们就会在运行时动态解析其函数,并且使用它们的方式与使用经典 Windows API 函数的方式类似:
- 为了使用 Ntdll,我们为每个函数创建了自定义的 typedef 结构体,并定义了它们所需的所有内部结构和对象,有时结构体可能是嵌套的,甚至需要更多的内部对象;
- 然后我们使用 ```GetNtFunctionAddress``` 函数,通过 ```GetProcAddress``` 从 ntdll 动态检索 NT 函数的地址。
- 一旦我们在 `InitNtFunctions()` 中检索到它们,就可以直接调用这些原生 NT 函数并将它们用于注入。
### 1) APC 简单进程注入
1. 首先 shellcode 会被解密,为了更好地了解加密机制,请在[此处](https://github.com/Hue-Jhan/Simple-shellcode-crypter)查看;
2. 接着,我们通过枚举系统进程的快照来查找目标进程并获取其句柄,为此我们使用 `NtQuerySystemInformation()`,一旦找到与名称匹配的进程,我们就会保存其 pid,并使用具有正确权限的 `NtOpenProcess()` 获取句柄;
3. 然后我们在远程进程中使用对应的原生函数执行经典的 分配 -> 写入/复制 -> 保护为 RWX 的操作;
4. 接着,我们要么将 shellcode 排队到我们找到的第一个线程,要么使用函数 `ShotgunApc()` 将其排队到该进程的所有线程。具体做法是:遍历系统的所有线程,定位到属于我们之前目标进程的第一个线程(或所有线程),保存其 Tid 并使用 `NtOpenThread()` 获取句柄。
### 2) DLL 版本
该 DLL 版本在被注入的进程中执行完全相同的操作,在 loader lock 之外的新线程对于避免死锁至关重要。你可能还需要禁用预编译头文件以移除 pch 文件以及避免 Visual Studio 报错。
如果该 DLL 正在被 Early Bird 注入器注入,它可能无法正常工作(我将来会上传该注入器)。
### 3) DLL 注入
在远程进程中加载恶意的 Dll,并向其排队 LoadLibraryA(是的,这种方法确实有点垃圾),在构建 exe 之前,请将 Dll 放置在其他文件旁边。以下是执行流程:
1. 首先,dll(被视为资源)从 exe 中提取并写入磁盘,然后计算其路径/大小/名称长度以及其他信息;
2. 其次,我们通过枚举系统进程的快照来查找目标进程并获取其句柄;
3. 然后,我们在目标进程内分配与 dll 路径大小相同的内存,将路径写入进程,并将其设置为 RWX;
4. 接着,我们获取 kernel32 dll 的基地址,以获取用于加载恶意库的函数指针;
5. 最后,我们使用 LoadLibrary 将 Dll 的基地址排队到进程中,可以排队到其第一个线程,也可以排队到所有线程。
这种 dll 注入方法根本不具备隐蔽性,但它是最快的,此外,默认情况下 DLL 比可执行文件更具隐蔽性。
# 🛡️ AV 检测
会被 BitDefender Advanced Thread Defense 拦截,但通常能绕过 Windows Defender。以下是具有混淆元数据的可执行文件的检出情况,第一个是 dll 注入器的检出,第二个是经典注入器和 dll 版本的检出。使用 Windows 默认应用程序的元数据可以将检出率降至 0,如这里使用 Mshta.exe 所示
标签:APC注入, Awesome列表, C/C++, DLL注入, DNS 反向解析, DNS 解析, EDR绕过, Monitoring, ntdll, UML, Windows Native API, 事务性I/O, 动态解析, 后门开发, 安全测试, 客户端加密, 异步过程调用, 恶意代码, 攻击性安全, 数据展示, 流量审计, 系统编程, 红队, 网络安全, 隐私保护, 隐蔽技术, 高交互蜜罐