使用 EDR 预加载绕过 EDR

通过劫持 AppVerifier 层来逃避用户模式 ​​EDR 挂钩

来源:MalwareTech

之前,我写了一篇文章,详细介绍了如何利用系统调用绕过用户模式 ​​EDR 挂钩。现在,我想介绍一种替代技术“EDR-Preloading”,该技术涉及在 EDR 的 DLL 加载到进程之前运行恶意代码,使我们能够完全阻止它运行。通过中和 EDR 模块,我们可以自由地正常调用函数,而不必担心用户模式挂钩,因此不需要依赖直接或间接的系统调用。

一篇文章

该技术利用了 EDR 加载其用户模式组件的方式中的一些假设和缺陷。EDR 需要将其 DLL 注入每个进程以挂接用户模式函数,但过早运行 DLL 会导致进程崩溃,过晚运行则进程可能已经执行了恶意代码。大多数 EDR 所采用的最佳方案是在进程初始化时尽可能晚地启动其 DLL,同时仍然能够在调用进程入口点之前完成它们需要做的一切。

理论上,我们需要做的就是找到一种在进程初始化时稍早一点加载代码的方法,然后我们就可以抢占 EDR。

Windows 进程加载器快速概览

要了解 EDR DLL 何时可以加载以及何时不能加载,我们需要了解一些有关进程初始化的知识。

每当创建新进程时,内核都会将目标可执行文件的映像与 ntdll.dll 一起映射到内存中。然后创建一个线程,该线程最终将用作入口点线程。此时,该进程只是一个空壳(PEB、TEB 和导入都未初始化)。在调用进程入口点之前,必须执行相当多的设置。

每当新线程启动时,其起始地址将设置为 ntdll!LdrInitializeThunk(),它负责调用 ntdll!LdrpInitialize()。

ntdll!LdrInitializeThunk() ntdll!LdrpInitialize()

ntdll!LdrpInitialize() 有两个用途:

ntdll!LdrpInitialize()
  • 初始化线程
  • ntdll!LdrpInitialize() .mrdata ( ) {