C++ PE 注入(inject) - 来自远程位置的 EXE 文件(例如 HTTP)

标签 c++ code-injection

我是一名安全研究新手,正在尝试使用转换器/stager 了解 PE 注入(inject),这与密码锁的操作非常相似。

我们正在为处理我们的 QRadar SIEM 的蓝色团队设置防火演习,我们希望在其上启动一些自定义恶意软件。

那么现在,回答我的问题 :)。我了解 PE 注入(inject)的一般概念,但我发现的几乎所有教程都会注入(inject)当前 EXE(因此通常通过调用 GetModuleHandle(NULL))

我想知道您将如何从远程资源(例如 HTTP 下载)注入(inject) EXE。 基本上我的目标是:

  1. STAGER 文件下载内存中的 EXE
  2. STAGER文件在进程X中使用PE方法注入(inject)EXE

我不希望在这里得到完整的答案,但如果你能指出正确的方向,那就太好了:)。

请注意,此代码不会用于恶意目的。

最好的问候!

最佳答案

其实很简单。您需要做的就是将远程 EXE/DLL 下载到缓冲区中(即从内存中),此时您有几个选择。

您最初需要检查 MZ 签名,并且它是一个有效的 PE 文件。您可以使用 PIMAGE_NT_HEADERS 执行此操作,检查 Optional.Signature(如果有效的 PE 文件)和 PIMAGE_DOS_HEADER 中的 e_magic(MZ 签名)

现在的问题是,如果你想注入(inject)一个 dll,从内存中加载它,在它的导出表中搜索给定的函数,获取代码并在远程进程中执行 i,或者从内存中执行 EXE。

假设您只想获取图像的 ImageBase,正如您所说,您在网上阅读了一些通过 GetModuleHandle 讨论它的教程,您首先需要映射下载的缓冲区。

你可以通过

CreateFileW(用于读取),CreateFileMapping(传递来自 createfile 的句柄),MapViewOfFile(传递来自 createfilemapping 的返回句柄)。

在此之后,您将从 MapViewOfFile 获取基本图像地址。您现在可以对该文件做很多事情,您可以从内存中注入(inject)它,或者从内存中执行它。

您需要查看 PE 修复(导出和导入地址表函数),以及通过直接镜像目录 RVA -> base 进行的 base 重定位。

请注意,如果您在映射文件后在远程进程中执行图像,请使用 ZwQueueApcThread 注入(inject)方法,而不是像 RtlCreateUserThread/CreateRemoteThread 这样更乏味的注入(inject)方法。

如果您从内存中执行代码。通过重定位修复偏移量后,确保通过 VirtualProtectEx 执行代码,可选 ZwAllocateVirtualMemory(传递 PAGE_WRITECOPY 而不是 PAGE_EXECUTE_READWRITE) 而不是 ZwWriteVirtualMemory - WriteProcessMemory 因为它更隐蔽!

此外,我相信您可以想出一些其他方法,这只是我的想法。

关于C++ PE 注入(inject) - 来自远程位置的 EXE 文件(例如 HTTP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42426310/

相关文章:

c++ - 在 C++ 中对字符 vector 进行排序并将大写和小写字母视为相等的最佳方法?

C++ 结构数组的分配

c# - 通过 DllImport 在 C# 中调用 C 方法 - 尝试读取或写入 protected 内存

mysql - 是否可以将 SQL 注入(inject)到此查询中?

c - 为什么 CreateRemoteThread() 会导致 Debug Assertion Failed 错误?

c++ - pthread_cond_wait 从 pthread_cond_signal 丢失信号

c++ - 关联容器作为函数模板参数

mysql - 你能发现 SQL 注入(inject)吗?

c++ - 如何注入(inject)从文件加载的shellcode?

python - 在 Jinja 中是否有安全的 striptags 替代品?