EvanMcBroom/perfect-loader

GitHub: EvanMcBroom/perfect-loader

通过重定向 Windows 原生加载器而非重新实现 LoadLibrary,实现从内存完美加载动态库的参考方案。

Stars: 289 | Forks: 50

# Perfect Loader [![MIT 许可证](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE.txt) 一个针对 Windows 的完美内存动态库加载器的参考实现。 该实现之所以被认为是完美的,是因为它没有重新实现 `LoadLibrary`,那种方法本质上是不完整的。 相反,该实现将 `LoadLibrary` 重定向以使用内存数据,从而创建了一个始终与 Windows 原生加载器功能对等的解决方案。 本项目实现了两种重定向 `LoadLibrary` 的解决方案。 第一种方案基于 [A-Normal-User](https://github.com/A-Normal-User) 的[出色工作](https://github.com/A-Normal-User/MemoryDll-DllRedirect),通过在 `NtOpenFile` 和 `NtMapViewOfSection` 上放置钩子来重定向 `LoadLibrary`。 在大多数 Windows 版本中,本项目仅需要在 `NtMapViewOfSection` 上放置一个钩子,但确实需要额外的钩子来处理 [Windows 11 24H2 中所做的更改](https://github.com/EvanMcBroom/perfect-loader/issues/1#issuecomment-2578384262)。 [Alex Short](https://twitter.com/alexsho71327477) [采用了一种类似的方法](https://github.com/rbmm/ARL/tree/main/Load),同样只需要在 `NtMapViewOfSection` 上设置一个钩子。 Alex 的方法确实需要你找到一个不支持 CFG 且大于你打算加载的内存库的动态库,但他提供了[用于查找此类动态库的代码](https://github.com/rbmm/ARL/blob/fab3ee614702f81ce63f97c3f915c7ecf06e3ed8/Load/loadmem.cpp#L99),并且[在本项目的示例文件中](https://github.com/EvanMcBroom/perfect-loader/blob/27ec386e9dc12456e4a5cb8a9878699028b00efc/source/run.cpp#L40)也提供了类似的代码。 第二种解决方案使用了一种类似于 [Process Doppelgänging](https://www.blackhat.com/docs/eu-17/materials/eu-17-Liberman-Lost-In-Transaction-Process-Doppelganging.pdf) 的方法,即在事务中更新已打开的文件并使用它来创建节对象。 该解决方案与 [Tal Liberman](https://twitter.com/Tal_Liberman) 和 [Eugene Kogan](https://twitter.com/eukogan) 的工作不同之处在于,它将 `LoadLibrary` 重定向为使用该节,而不是使用该节来创建新的进程或线程。 据我所知,这是一种使用事务的新颖方法,我个人将其称为 Module Doppelgänging,以肯定 Tal 和 Eugene 的先前工作。 ## 功能特性 - 支持 x86 和 x64 架构 - 使用手动映射或 Module Doppelgänging 反射注入模块 - 使用补丁或硬件断点进行 Hook - 禁用模块加载通知 - 从加载器列表中取消链接模块 - 移除或覆盖模块头 - 禁用模块的线程回调 ## 构建说明 Perfect loader 使用 [CMake](https://cmake.org/) 为您的平台生成并运行构建系统文件。 ``` git clone https://github.com/EvanMcBroom/perfect-loader.git cd perfect-loader/builds cmake .. -A {Win32 | x64} cmake --build . ``` 默认情况下 CMake 将构建以下内容: | 产物 | 描述 | | --- | --- | | `perfect-loader.lib` | 项目的主静态库 | | `pl.dll` | 将项目功能作为单一导出 C API 公开的 DLL | | `run.exe` | 一个使用该库从内存加载 DLL 的示例工具 | | `testdll.dll` | 可与 `run.exe` 工具配合使用的示例 DLL | 其他 CMake 项目可以通过从上层项目的 `CMakeLists.txt` 文件中对此目录调用 `include` 来使用 perfect loader。 这样做会将带有 C API 的静态库和共享库作为 CMake 目标添加到上层项目中,但不会添加 `run` 工具或 `testdll` 库。
标签:API Hook, API接口, API重定向, Bash脚本, C++, DLL注入, DNS 反向解析, Linux, NTFS事务, NtMapViewOfSection, NtOpenFile, Offensive Security, PE加载器, Process Doppelgänging, Raspberry Pi, SSH蜜罐, TxF事务, UML, Windows API, Windows底层安全, 中高交互蜜罐, 代码执行, 内存加载, 内存执行, 动态链接库注入, 开源安全工具, 恶意软件开发, 数据展示, 数据擦除, 流量审计, 白样本制作, 红队, 绕过防御, 网络安全, 进程欺骗, 进程注入, 逆向工程平台, 隐私保护