【发布时间】: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