PE注入图像重定位

时间:2017-03-02 22:44:11

标签: c++ code-injection rebase portable-executable relocation

所有

我一直试图解决这个问题几天,我需要一些帮助。

对于工作的研究项目,我写了一些自定义恶意软件,恶意软件本身不是问题,我不会分享任何代码,但我确实需要一些实际的注入器帮助。

我在尝试完全了解如何以及何时需要执行手动重定位时遇到了一些问题。我现在不是在重新安置并使用来自virtualallocex的随机地址,一切正常。我的恶意软件exe运行,我没有问题,除非加载远程进程PE的内存位置与我的恶意软件PE首选基地址重叠。

我没有使用NtUnmapViewOfSection,因为它被AntiVirus检测到,基本上只是一个随机不起作用的垃圾函数,所以我的计划是只使用VirtualAllocEx提供的随机地址并在需要时重新定位(我不明白,请看下面的问题。

这是我目前的工作方法(除非目标流程与preferredbase重叠):

  1. 下载恶意软件exe并放入缓冲区
  2. CreateProcess启动受害者进程
  3. 之后暂停线程(我没有使用CREATE_SUSPENDED标志,因为这在win10中不起作用)
  4. 从缓冲区(PIMAGE_DOS_HEADER,PIMAGE_NT_HEADERS)获取必要的标题信息,也从远程进程PEB获取ImageBase地址
  5. 在目标进程(VirtualAllocEx)中分配内存,对lpAddress使用NULL,以便virtualAllocEx可以选择位置
  6. 将PE标头和部分写入内存位置
  7. 保护记忆
  8. 将EAX更改为新入口点
  9. 将PEB更改为新的baseAddress
  10. ResumeThread
  11. 利润
  12. 所以请帮助我理解以下内容:

    1. 为什么没有进行任何手动重新定位都能正常工作,即使我正在进行注射,背景中是否还有一些神奇的PE加载器?

    2. 当目标进程与首选基地址重叠时,为什么它不起作用。 PE图像本身被复制到一个非重叠的内存位置,所以当目标进程没有重叠时,与我的工作解决方案有什么不同。它应该从我的第一个问题中做出神奇的重新定位。

    3. 为什么我会看到这么多人在将图像写入内存之前更改图像中的preferredBaseAddress?据我所知,该字段仅用于将PE映射到其首选的地址,如果他们不能这样做,则PE加载程序执行重定位。看作注入代码通常执行自己的手动重定位,我不知道为什么他们会改变它。

    4. 希望有人可以帮助我理解,因为这让我疯狂:)。

      祝你好运!

1 个答案:

答案 0 :(得分:1)

1:这是因为汇编代码的工作方式。大多数jmp是相对于当前地址的,因此无论代码位于何处都可以工作。一旦你想从IAT查找变量/解析dll导入地址,就会出现问题。这是因为这些操作需要MOV指令,并且通常编译器会将地址硬核作为这些函数的源操作数。那么问题是它将指向一些随机位置,因此将导致访问冲突/未定义的行为。

我认为您的情况是,主机进程和有效负载都具有相同的首选基址。这意味着它不会因访问冲突而失败,因为只有发生才能成为该位置的一些随机数据。

如果您始终将有效负载加载到其首选的基址,则您不需要进行手动重定位。

2:不确定你的意思

3:对于普通的简单应用程序,您不必更改首选基址。当您的有效负载需要访问它的重定位表时(例如,部署rootkit或w / e时),问题就出现了。这取决于病毒的构建方式。如果将首选基址与实际基址进行比较,则不应该出现任何问题。

你的CREATE_SUSPENDED问题:几个星期前我遇到了同样的问题。看来,只要你恢复使用CREATE_SUSPENDED创建的线程,它就会覆盖它的寄存器或w / e。我无法弄清楚为什么会出现这个问题。你可以做些什么来克服这个问题,永远不会恢复主线程。相反,只需使用CreateRemoteThreadEx创建一个新线程。

编辑:在阅读了其他一个问题后,你实际上已经为我解决了这个问题。我正在改变EIP而不是EAX。我不知道PE加载器叫做eax而不是只是在指令指针处恢复代码。

如果您需要任何帮助,HMU。我已经完成了大量关于恶意软件开发的研究,并且喜欢分享知识。