所有,

我已经尝试了几天了,我需要一些帮助。

对于一个工作研究项目,我编写了一些自定义恶意软件,该恶意软件本身不是这里的问题,我不会共享任何代码,但是我确实需要有关实际注入(inject)器的帮助。

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

我没有使用NtUnmapViewOfSection,因为它已被AntiVirus检测到,并且基本上只是一个随机无效的废话功能,所以我的计划是仅使用VirtualAllocEx提供的随机地址,并在需要时进行重新定位(我不理解) ,请参阅下面的问题)。

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

  • 下载恶意软件exe并放置在缓冲区
  • CreateProcess启动受害进程
  • 之后挂起线程(我不使用CREATE_SUSPENDED标志,因为这在win10中不起作用)
  • 从缓冲区(PIMAGE_DOS_HEADER,PIMAGE_NT_HEADERS)获取必要的 header 信息,还从远程进程PEB
  • 获取ImageBase地址
  • 在目标进程(VirtualAllocEx)中分配内存,对lpAddress使用NULL,以便virtualAllocEx可以选择位置
  • 将PE header 和节写入内存位置
  • 保护内存
  • 将EAX更改为新的入口点
  • 将PEB更改为新的baseAddress
  • ResumeThread
  • 利润

  • 因此,请帮助我了解以下内容:
  • 为什么在不进行任何手动重定位的情况下仍能正常工作,即使我正在注入(inject),后台中仍有一些魔术PE加载器可以执行此操作?
  • 当目标进程与首选基址重叠时,为什么不起作用。 PE镜像本身被复制到一个不重叠的内存位置,所以当目标进程不重叠时,这与我的工作解决方案有什么不同。它应该只是从我的第一个问题开始魔术般的重定位。
  • 为什么我看到这么多人在将其写入内存之前更改了图像中的preferredBaseAddress?据我所知,该字段仅用于将PE映射到其首选的基地址,如果他们不能这样做,则表明PE加载程序执行了重定位。看到注入(inject)代码通常会执行自己的手动重定位,所以我不知道为什么他们会改变它。

  • 希望有人可以帮助我理解,因为这让我发疯了:)。

    最好的祝福!

    最佳答案

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

    我认为对您而言,主机进程和有效负载都具有相同的首选基址。这意味着它不会因访问冲突而失败,因为该位置恰好有一些随机数据。

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

    2:不确定你的意思

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

    对于您的CREATE_SUSPENDED问题:几周前,我也遇到了同样的问题。似乎一旦恢复使用CREATE_SUSPENDED创建的线程,它就会覆盖其寄存器或w / e。我不知道为什么这个问题到来。但是,您可以做些什么来克服这个问题,根本不要恢复主线程。相反,只需使用CreateRemoteThreadEx创建一个新线程。

    编辑:在阅读了您的其他问题之一之后,您实际上为我解决了这个问题。我正在更改EIP而不是EAX。我不知道PE加载程序称为eax,而不仅仅是在指令指针处恢复代码。

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

    关于c++ - PE注入(inject)图像重定位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42567410/

    10-12 01:23