一个具有高级规避功能的DLL加载器 | AtomLdr
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/NUL0x4C/AtomLdr
AtomLdr:具有规避功能的 DLL 加载器
免责声明
这个加载器使用了 MalDev Academy 教授的技术。培训将在未来几周内在maldevacademy.com上推出。
特征:
- CRT 库独立。
"Atom"最终的 DLL 文件,可以通过加载 DLL(执行其入口点)或通过命令行执行导出的函数来运行有效负载。- DLL 从 \KnwonDlls\ 目录中脱钩,没有RWX部分。
- 加密的有效载荷保存在资源部分并通过自定义代码检索。
- AES256-CBC 有效载荷加密使用自定义无表/数据依赖分支使用ctaes;这是我遇到过的最好的自定义 AES 实现之一。
- Aes 密钥和 Iv 加密。
- 间接系统调用,将HellHall与ROP小工具一起使用(用于脱钩部分)。
- 使用 APC 调用的有效负载注入 - 可警告线程。
- 使用 APC 执行负载 - 可警告线程。
- Api 哈希使用
CRC32字符串哈希算法的两种不同实现。 - 总大小为 17kb + 有效载荷大小(16 的倍数)。
脱钩部分如何工作
AtomLdr 的 unhooking 方法如下所示

该程序从 \KnwonDlls\ 目录中 Unhooking 并不是一种绕过用户态挂钩的新方法。但是,此加载程序在这样做时会尝试避免分配RWX内存。例如,在KnownDllUnhook中这是必须要做的,其中需要RWX权限来替换挂钩模块的文本部分,同时允许在这些文本部分中执行函数。
这在这个加载器中被更改,它暂停正在运行的线程,以试图阻止从目标文本部分中调用任何函数,从而消除了在取消挂钩之前将它们标记为RWX部分的需要,使 RW 权限成为可能选择。
然而,这种方法产生了另一个问题;脱钩时,NtProtectVirtualMemory系统调用和其他人使用 ntdll.dll 模块内部的系统调用指令,作为间接系统调用方法。尽管如此,如上所述,未挂钩的模块将被标记为RW部分,从而无法执行间接系统调用,因为我们跳转到的系统调用指令现在无法执行,因此我们不得不跳转到另一个可执行位置,这是win32u.dll使用的地方。
win32u.dll包含一些与 GUI 相关的系统调用,使其适合跳转到而不是 ntdll.dll。win32u.dll 已加载(静态),但未包含在解除挂钩例程中,这样做是为了确保 win32u.dll 仍然可以执行我们要跳转到的系统调用指令。
之后暂停的线程将恢复。
值得一提的是,这种方法可能效率不高,而且可能不稳定,这是由于使用了线程挂起技巧。但是,它已经通过多个流程进行了测试并取得了积极的结果,同时,如果您遇到任何问题,请随时提出问题。
用法
- PayloadBuilder使用指定的 payload 进行编译和执行,它会输出一个
PayloadConfig.pc文件,其中包含加密的 payload,以及它的加密密钥和 iv。 PayloadConfig.pc然后生成的文件将在项目中替换它AtomLdr。- 将项目编译
AtomLdr为 x64 Release。 - 要启用调试模式,请在此处取消注释。
演示 (1)
- 使用 rundll32.exe执行
AtomLdr.dll,运行Havoc负载,并捕获屏幕截图

AtomLdr.dll的导入地址表

演示-调试模式(2)
- 运行
PayloadBuilder.exe,加密demon[111].bin- 一个 Havoc 负载文件

AtomLdr.dll使用 rundll32.exe运行


- Havoc 在有效载荷执行后捕获屏幕截图

基于
标签:工具分享, 免杀工具, shellcode生成工具