Что-то не могу понять как менять атрибуты доступа для выделенной памяти из 32-битного процесса для 64-битного. Нужна функция аналогичная NtProtectVirtualMemory. Но вот беда - в Wow64 ntdll.dll её нет. Как быть?
Интригует функция NtWow64CallFunction64. По названию, хочется верить, что с помощью неё можно вызвать 64-битную функцию в контексте целевого процесса. Если так, то как организуется передача аргументов для этой функции? Через стек? В каком формате?
Нашел тут кое-что. http://help.madshi.net/madCodeHook3.htm Вроде у него реализована работа с 64-битными процессами через Wow64. Но смущает использование драйвера: И в итоге нихуя не понятно как реализована работа с памятью 64-битных процессов. Через его драйвер или через Wow64. Кто-нибудь покупал madCodeHook 3? Можете глянуть как там что. А то сорцы этого гуано стоят 2k EUR. // Отписал пока автору. Жду ответа
Так. Я не понял. А вообще существуют в природе hook-движки чтобы можно было хукать функции из 32-битного процесса в 64-битном? Я решил почитать про MS Detours 3.0 Professional: http://research.microsoft.com/en-us/projects/detours/, но там об это ни слова.
О. Появилась такая мысль: Похукать какую-нибудь функцию в ntdll.dll удалённого процесса. И спровоцировать её вызов из 32-битного приложения используя одну из Wow64-функций. Но в этом случае - встаёт вопрос - какую функцию хукать или какую функцию вызывать для провокации ? Вообще, возможно ли такое, чтобы ядерный сервис передавал управление в usermode код, при межпроцессовом взаимодействием ?
Ответил автор madshi: То есть для правильного инжектинга либе надо 64-битный исполняемый файл, а чтобы инжектить код из родительского процесса в дочерний нужен драйвер. Какой кошмар. =/
Xml Немного не понял. Что именно портировать? o0 ... Код отвечающий за инфектинг новых и дочерних процессов? Если рассматривать сложность задачи, то в случае только с 32-битным кодом, тут с два варианта (инжект из 32-битного приложения в 32-битное). В случае с поддержкой x64, объём кода увеличивается в 4 раза: x86 -> x86 * x86 -> x64 * x64 -> x86 * x64 -> x64 С учётом того, что ни в одной hook-engine либе такое не реализовано, то да, видимо, задача не особо тривиальна.
Marazm Да, действительно. Оно работает. Достаточно просто написать x64 шеллкод с вызовом функции NtProtectVirtualMemory из 64-битной версии ntdll.dll (причём она уже загружена в адресное пространство 32-битного процесса, функционирующем в окружении Wow64). Ну и вызвать его в 32-битном процессе с использованием Heaven's Gate. Таким образом можно изменять атрибуты страниц виртуальной памяти, находящейся за пределами 4 ГБ в удалённом процессе.