-2

如何将 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 位地址?

4

1 回答 1

-2

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

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

  1. 然而,将 .NET Programm 的 CPU Target 设置为只允许您的 MSIL 执行 x32 或 x64。请注意,通常 x64 在可用时是首选,并且在整个过程中不应再使用 x32。此外,您可能必须处理一种需要 x32 的代码和一种需要 x64 的代码。
  2. 您将具有“错误”二进制性的代码包装到辅助进程中。您的主要过程和助手通过任何IPC 方法进行交谈- 您可以在这里“挑选毒药”。这样代码就可以按设计运行,而您的进程不依赖于它的二进制性。
于 2021-08-16T13:27:27.497 回答