Как я могу внедрить 32-битный CodeCave в 64-битное приложение?
Как я могу внедрить 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-битный адрес?
1 ответ
.NET MSIL не зависит от разрядности. Тот же MSIL может работать как x32 или x64. Или даже x128 или x16, если мы когда-нибудь получим среду выполнения для этих двоичных разностей.
Не .NET / native обычно предназначен для очень конкретной двоичной системы. У вас есть два способа справиться с неизбежными конфликтами:
- Тем не менее, установите целевой ЦП программы .NEt, чтобы разрешить выполнение только x32 или x64 для вашего MSIL. Обратите внимание, что обычно x64 предпочтительнее, когда он доступен, и x32 больше не следует использовать для всего процесса. Также вам, возможно, придется иметь дело с одним кодом, которому требуется x32, и другим, которому требуется x64.
- Вы оборачиваете код, имеющий «неправильную» бинарность, во вспомогательный процесс. Ваш основной процесс и помощник общаются через любой из подходов IPC - здесь вы можете «выбрать свой яд». Таким образом, код может работать так, как он разработан, в то время как ваш процесс не привязан к его бинарности.