【问题标题】:How can I inject 32-bit CodeCave into a 64-bit application?如何将 32 位 CodeCave 注入 64 位应用程序?
【发布时间】:2021-08-16 21:35:13
【问题描述】:

如何将 32 位 CodeCave 注入 64 位应用程序?

我见过一些这样的实现:

App.exe+CA5F6 - 4C 89 15 D37D5B01     - mov [App.exe+16823D0],r10
App.exe+CA5FD - E9 FE59CA82           - jmp 7FF748DA0000
App.exe+CA602 - 90                    - nop 
App.exe+CA603 - 90                    - nop 
App.exe+CA604 - 4C 03 C1              - add r8,rcx

然后我按照这个地址看到这个:

7FF748D9FFFF -                       - ?? 
7FF748DA0000 - FF25 00000000 00001A0500000000 - jmp 051A0000
7FF748DA000E - 00 00                 - add [rax],al

我关注这个地址:

051A0000 - 50                    - push rax
051A0001 - 53                    - push rbx
051A0002 - 52                    - push rdx
051A0003 - 4D 63 82 94000000     - movsxd  r8,dword ptr [r10+00000094]

他是怎么做到的?我应该如何在 C# 中实现它?

我可以注入 CodeCave,但如果应用程序是 64 位的,那么它将始终引用 64 位地址,我如何注入 CodeCave 使其引用 32 位地址?

【问题讨论】:

  • 您不能在 64 位进程中使用 32 位地址,反之亦然。地址宽度本质上定义了两种进程类型之间的差异。
  • 我明白,但请告诉我那个人是怎么做到的?他创建了 CodeCave,然后从这个 CodeCave 中创建了一个指向 32 位地址的链接
  • @500-InternalServerError: 这不仅仅是地址宽度,还有其他编码差异,例如 0x4? 是 REX 前缀而不是 1 字节 inc/dec,以及 push 的默认操作数大小/pop 为 8 个字节。此外,[disp32] 寻址模式的较短编码在 64 位模式下被解释为[RIP + rel32]。 (虽然与位置无关的 32 位代码一开始不会使用那种寻址模式,而是使用像 call/pop 这样效率较低的东西来获取 EIP。)
  • 不过,我不明白为什么要注入位数较少的机器代码。由于目标是 64 位可执行文件,因此您不需要为任何东西使用过时的 32 位。 IDK 如果可以进行远跳转或调用 32 位模式,但您只能访问低 4GiB 虚拟地址空间中的内存。与一开始只编写 64 位 asm 相比,这听起来像是不必要的复杂性。
  • @hexX:CodeCave 在这种情况下到底是什么?

标签: c# assembly code-injection codecave


【解决方案1】:

.NET MSIL 与位数无关。相同的 MSIL 可以作为 x32 或 x64 运行。甚至是 x128 或 x16,如果我们能获得这些二进制文件的运行时。

非 .NET/native 通常是为非常特定的二进制而设计的。你有两种方法来处理不可避免的冲突:

  1. 但将 .NET 程序的 CPU 目标设置为只允许 MSIL 执行 x32 或 x64。请注意,通常 x64 在可用时是首选,并且在整个过程中不应再使用 x32。此外,您可能需要处理一个需要 x32 的代码和一个需要 x64 的代码。
  2. 您将具有“错误”二进制性的代码包装到辅助进程中。您的主要流程和助手通过任何IPC approaches 交谈 - 您可以在这里“挑选毒药”。这样,代码就可以按设计运行,而您的流程则不受其二进制性的约束。

【讨论】:

  • 我明白了,但是如何在 64 位进程中找到 32 位 CodeCave?或者如何创建?
  • @hexX 在 .NET 中,如果我们可以避免的话,我们不会使用代码洞穴、非托管资源、裸指针等。 |目标是制作一个单独的辅助进程。可以是本机代码所需的任何二进制。然后使用 IPC 让主进程与该辅助进程对话。代码洞穴 - 我不知道它们是如何跨二进制工作的,或者它们是否可以在这里工作。
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2013-07-24
  • 2012-07-11
  • 2012-04-04
相关资源
最近更新 更多