当 DLLMain 是唯一途径时
LdrLockLiberator 是一系列技术集合,用于在执行代码时逃出或以其他方式避开 Loader Lock——无论是从 DllMain 中,还是在任何其他可能存在该锁的地方。它与《完美 DLL 劫持》文章一同发布。我们为你提供解锁库加载器的 钥匙,让你可以在自己的计算机上随心所欲地处理你的加载器!
这些技术尽可能做到通用、干净且 100% 安全。它们的设计目标是在不修改内存保护或指针的情况下工作。这对于与现代漏洞缓解机制保持兼容至关重要。唯一官方支持的架构是 x86-64(32 位已基本绝迹)。
想了解为什么 DllMain 在 Windows 上如此令人头疼,而类 Unix 操作系统却不会有此困扰的架构原因吗?请随意!。
它的功能正如其名字所示。解锁 Loader Lock,设置加载器事件,并翻转 LdrpWorkInProgress。建议保持 RUN_PAYLOAD_DIRECTLY_FROM_DLLMAIN 未定义,以获得最佳稳定性。
切勿在生产代码中使用此技术。 这是出于我纯粹的好奇心以及不留死角的意愿而创造的副产品。你对此代码所做的任何事情,后果自负。
我们在 DLL 代码中使用了通常由 EXE 使用的 CRT atexit,在程序退出时逃出 Loader Lock。对于动态加载(使用 LoadLibrary),通过使用 LdrAddRefDll 将我们的库固定(LDR_ADDREF_DLL_PIN),使其达到 100% 安全,这样之后的 FreeLibrary 就不会将我们的 DLL 从内存中移除。
敬请期待!
提供的示例劫持了来自 C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe 的 MpClient.dll。源代码注释中提供了相关说明,方便你将其轻松调整为任何其他 DLL 与程序组合(主要只需为静态加载更新导出表)!
作为概念验证,我们默认以 ShellExecute 作为载荷运行。不过,你可以让它做任何你想做的事情!
此项目根目录下的 LdrLockLiberator.c 已在 Visual Studio 2022 上测试编译通过。
通过在“解决方案资源管理器”窗口中选择当前的 Visual Studio 项目,然后转到菜单栏中的 Project > Properties 来链接到 NTDLL。在顶部的 Configuration 下拉菜单中,选择 All Configurations 和 All Platforms。然后,转到 Linker > Input,在 Additional Dependencies 末尾追加:ntdll.lib。
C:\Windows\System32\msvcrt.dll)的公共 WDK5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.execd)导航到本仓库中的 LdrLockLiberatorWDKbuild完成!你的 DLL 已构建完毕,可以使用了!
作为 WDK 的替代方案,使用 MinGW 编译可能也能成功。
MIT 许可证 - 版权所有(C)2023-2024 Elliot Killick [email protected]