一个具有高级规避功能的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 加密。
  • 间接系统调用,将HellHallROP小工具一起使用(用于脱钩部分)。
  • 使用 APC 调用的有效负载注入 - 可警告线程。
  • 使用 APC 执行负载 - 可警告线程。
  • Api 哈希使用CRC32字符串哈希算法的两种不同实现。
  • 总大小为 17kb + 有效载荷大小(16 的倍数)。

 

脱钩部分如何工作

AtomLdr 的 unhooking 方法如下所示

 

ad1a1b7183140143

该程序从 \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负载,并捕获屏幕截图

 

ad1a1b7183140156

 

  • AtomLdr.dll的导入地址表

 

ad1a1b7183140205

 

演示-调试模式(2)

  • 运行PayloadBuilder.exe,加密demon[111].bin- 一个 Havoc 负载文件

 

ad1a1b7183140216

 

  • AtomLdr.dll使用 rundll32.exe运行

 

ad1a1b7183140226

 

ad1a1b7183140250

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

 

ad1a1b7183140305

基于

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