C++ PE 注入 - 来自远程位置的 EXE 文件(例如 HTTP)
C++ PE injection - EXE file from remote location (e.g. HTTP)
我是一名新手安全研究员,正在尝试使用 droppers/stagers 了解 PE 注入,非常类似于 cryptolocker 的操作。
我们正在为处理我们的 QRadar SIEM 的蓝队设置防火练习,我们想在上面启动一些自定义恶意软件。
所以现在,我的问题:)。我了解 PE 注入的一般概念,但我发现的几乎所有教程都会注入当前 EXE(因此通常通过调用 GetModuleHandle(NULL))
我想知道您将如何从远程资源(例如 HTTP 下载)注入 EXE。
基本上我的目标是:
- STAGER 文件下载内存中的 EXE
- STAGER 文件在进程 X 中使用 PE 方法注入 EXE
我不希望在这里得到完整的答案,但如果你能指出正确的方向,那就太好了:)。
请注意,此代码不会用于恶意目的。
此致!
其实很简单。您需要做的就是将遥控器 EXE/DLL 下载到缓冲区中(即从内存中),从这一点开始您有几个选择。
您最初需要检查MZ 签名,并且它是一个有效的PE 文件。您可以使用 PIMAGE_NT_HEADERS
、检查 Optional.Signature(如果有效的 PE 文件)和 PIMAGE_DOS_HEADER
(MZ 签名)
中的 e_magic 来执行此操作
现在的问题是,如果您想注入一个 dll,从内存中加载它,搜索它的导出 table 以获取给定函数,获取代码并在远程进程中执行 i,或者从内存中执行 EXE .
假设您只想获取图像的ImageBase,正如您所说的您在网上阅读了一些教程,其中通过GetModuleHandle
讨论了它,您首先需要映射下载的缓冲区。
您可以通过
CreateFileW
(用于读取),CreateFileMapping
(从 createfile 传递句柄),MapViewOfFile
(从 createfilemapping 传递返回的句柄)。
之后您将从MapViewOfFile
获取基本映像地址。你现在可以用这个文件做很多事情,你可以从内存中注入它,或者从内存中执行它。
您需要查看 PE 修正(导出和导入地址 table 函数),以及通过直接映像目录 RVA -> base 进行的 base 重定位。
请注意,如果您在映射文件后在远程进程中执行图像,请使用 ZwQueueApcThread
注入方法,而不是像 RtlCreateUserThread/CreateRemoteThread
.
这样更沉闷的注入方法
如果您是从内存中执行代码。通过重定位修复偏移量后,确保通过 VirtualProtectEx
执行代码,可选 ZwAllocateVirtualMemory
(传递 PAGE_WRITECOPY
而不是 PAGE_EXECUTE_READWRITE
)而不是 ZwWriteVirtualMemory
- WriteProcessMemory
因为它更隐蔽!
另外,我相信你能想出一些其他的方法,这只是我的想法。
我是一名新手安全研究员,正在尝试使用 droppers/stagers 了解 PE 注入,非常类似于 cryptolocker 的操作。
我们正在为处理我们的 QRadar SIEM 的蓝队设置防火练习,我们想在上面启动一些自定义恶意软件。
所以现在,我的问题:)。我了解 PE 注入的一般概念,但我发现的几乎所有教程都会注入当前 EXE(因此通常通过调用 GetModuleHandle(NULL))
我想知道您将如何从远程资源(例如 HTTP 下载)注入 EXE。 基本上我的目标是:
- STAGER 文件下载内存中的 EXE
- STAGER 文件在进程 X 中使用 PE 方法注入 EXE
我不希望在这里得到完整的答案,但如果你能指出正确的方向,那就太好了:)。
请注意,此代码不会用于恶意目的。
此致!
其实很简单。您需要做的就是将遥控器 EXE/DLL 下载到缓冲区中(即从内存中),从这一点开始您有几个选择。
您最初需要检查MZ 签名,并且它是一个有效的PE 文件。您可以使用 PIMAGE_NT_HEADERS
、检查 Optional.Signature(如果有效的 PE 文件)和 PIMAGE_DOS_HEADER
(MZ 签名)
现在的问题是,如果您想注入一个 dll,从内存中加载它,搜索它的导出 table 以获取给定函数,获取代码并在远程进程中执行 i,或者从内存中执行 EXE .
假设您只想获取图像的ImageBase,正如您所说的您在网上阅读了一些教程,其中通过GetModuleHandle
讨论了它,您首先需要映射下载的缓冲区。
您可以通过
CreateFileW
(用于读取),CreateFileMapping
(从 createfile 传递句柄),MapViewOfFile
(从 createfilemapping 传递返回的句柄)。
之后您将从MapViewOfFile
获取基本映像地址。你现在可以用这个文件做很多事情,你可以从内存中注入它,或者从内存中执行它。
您需要查看 PE 修正(导出和导入地址 table 函数),以及通过直接映像目录 RVA -> base 进行的 base 重定位。
请注意,如果您在映射文件后在远程进程中执行图像,请使用 ZwQueueApcThread
注入方法,而不是像 RtlCreateUserThread/CreateRemoteThread
.
如果您是从内存中执行代码。通过重定位修复偏移量后,确保通过 VirtualProtectEx
执行代码,可选 ZwAllocateVirtualMemory
(传递 PAGE_WRITECOPY
而不是 PAGE_EXECUTE_READWRITE
)而不是 ZwWriteVirtualMemory
- WriteProcessMemory
因为它更隐蔽!
另外,我相信你能想出一些其他的方法,这只是我的想法。