反射DLL

https://ijustwannared.team/2018/02/13/reflective-dlls-and-you/amp/

这篇文章是关于反射动态链接库(DLL)的,并将简单介绍如何编写一个。这是由Stephen Fewer开发的一种技术,将使用他的代码来实现魔术。我意识到这是一个已经讨论过几次的话题,所以我要保持这篇文章简单而紧凑。

参考

什么是DLL?DLL是可移植代码,通常由应用程序共享。但是,对于这篇文章,DLL是执行代码的机会。为什么甚至打扰这个?如果我们的目标是执行代码,为什么不写一个exe到磁盘?暂时考虑一下脚印:写入磁盘,创建进程,然后进行处理; 它可以匆忙加起来。输入DLL以及如何将它们加载到内存中。

通常,DLL在进程启动时被加载到内存中; 但是,它们也可以注入已经运行的过程中。通过DLL注入,我们不再需要创建一个执行代码的过程(各种DLL注入技术); 然而,我们仍然需要将我们的文件写入磁盘才能注入。反射DLL注入解决了这个问题。由Stephen Fewer开发,这种技术允许我们将代码注入现有流程而无需写入磁盘。因此,使用反射DLL注入,我们从写入到磁盘并创建一个过程,将我们的代码完全注入内存...谢谢Stephen。

如何保护和检测

端点保护平台(EPP)开始标记这些技术。就个人而言,我会使用我的EPP软件探索端点上的反射DLL注入,以识别任何限制。此外,反射DLL通常会使用Windows API调用执行恶意代码,这是一个潜在的检测点。例如,createremotethread是一种在远程进程中执行shellcode的流行技术。

在观看了拉斐尔关于记忆内逃避的最新帖子后,还有其他一些工具:

 

演练

本演练将使用Visual Studio 2017完成。

  • 下载Stephen Fewer的Reflective DLL存储库
  • 创建一个新项目:C ++ - > Windows桌面 - >动态链接库
  • 删除stdafx.h,stdafx.cpp,targetver.h和*项目名* .cpp
  • 从Reflective DLL存储库中,复制并将ReflectiveDLLInjection.h,ReflectiveLoader.c和ReflectiveLoader.h添加到项目中。
  • Pic1Pic1
  • 项目 - >属性
    • 转到C / C ++ - >预编译标题 - >将预编译标题设置为“不使用预编译标题”(因为我们删除了stdafx.h)
    • C / C ++ - >预处理器 - >预处理器定义 - >将处理器定义设置为以下(对于x64 DLL,WIN64和WIN_X64而不是WIN32和WIN_X64 ......我意识到有更好的方法):
WIN32; WIN_X86; NDEBUG; _WINDOWS; _USRDLL; RDLL_EXPORTS; REFLECTIVE_DLL_EXPORTS;              REFLECTIVEDLLINJECTION_VIA_LOADREMOTELIBRARYR; REFLECTIVEDLLINJECTION_CUSTOM_DLLMAIN;

                                 Pic2.png

Pic2.png

  • dllmain.cpp应如下所示:
    • 注意,lpReserved保留用于在执行期间可以传递给我们的代码的参数(或shellcode)。我确信Metasploit可以传递参数,但我不知道如何做到这一点。Cobalt Strike绝对有效且可以在这里找到信息@bdllspawn
// dllmain.cpp : Defines the entry point for the DLL application.
#include "ReflectiveLoader.h"
#include <stdio.h>
void PartyTime()
{ 
   MessageBox(0, "PartyTime", "PartyTime", MB_OK); 
   return;
}

extern "C" HINSTANCE hAppInstance;
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{    
   switch (ul_reason_for_call)    
   { 
      case DLL_QUERY_HMODULE: 
         if (lpReserved != NULL) 
            { 
               *(HMODULE *)lpReserved = hAppInstance; 
            } 
         break; 
      case DLL_PROCESS_ATTACH: 
         hAppInstance = hModule; 
         if (!lpReserved != NULL) 
         { 
            printf("Parameter passed to Reflective DLL: %s", (char *)lpReserved); 
         } 
         else 
         { 
            printf("No parameter passed to Reflective DLL"); 
         } 
         PartyTime(); 
         fflush(stdout); 
         ExitProcess(0); 
         break;    
      case DLL_THREAD_ATTACH:    
      case DLL_THREAD_DETACH:    
      case DLL_PROCESS_DETACH:        
      break;    
   }    
   return TRUE;
}

编译

通过我们的反射DLL编译(希望如此),我们应该能够在不写入磁盘的情况下进行注入。Metasploit,Cobalt Strike和Empire(假设)都有用于注入自定义书面反射DLL的后期开发模块。

来自Metasploit

Pic6.png

 

在WIN10-DM的桌面上

Pic7.png

Pic7.png这种技术是一种古老而又善良的技术。如果您已经使用过任何流行的C2平台,那么您可能已经使用了反射DLL注入。安全解决方案在捕获这样的内存技术方面变得越来越好,但是高级威胁参与者在调整他们的技术方面也变得越来越好。在我看来,测试你的安全解决方案反对基本反射DLL注入以了解它们的表现并不是一个坏主意。像Meterpreter,Empire(假设)和Cobalt Strike这样的后期开发工具也使用反射式DLL,看看究竟是什么标记以及原因可能是个好主意。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值