Re: HOWTO: Вызов функции в другом процессе
От: Andrew.Kroupa  
Дата: 03.03.05 20:40
Оценка:
Здравствуйте, Сергей Холодилов...
Ваш способ запуска функции из собственной DLL в другом процессе оригинален, но можно предложить и другой, который, возможно, покажется проще...
Основной смысл заключается в изменении порядка действий на следующий:
1. Получаем дескриптор процесса-жертвы.
2. Получаем при помощи EnumProcessModules дескрипторы всех загруденных в нём DLL.
3. При помощи GetModuleBaseName перебираем все эти дескрипторы и находим принадлежащий модулю с именем "Kernel32.dll"
Теперь мы имеем HMODULE Kernel32.dll в другом! процессе.

4. Это единственная сомнительная операция во всей идее, но на проверку она работает... возможно потому что далее указанные функции не могут линковаться динамически...
При помощи GetProcAddress и известного HMODULE получаем адрес функций LoadLibraryA и GetProcAddress в целевом процессе процессе.
5. Теперь дело за малым... Выделить в целевом процессе память, записать в неё код, который вызовет сначала LoadLibraryA для внедряемой DLL затем GetProcAddress для нужной функции из этой DLL и передаст на неё управление.
6. Запустить этот код при помощи CreateRemoteThread
7. Для особой красоты можно передать в качестве параметра целевой функции из нашей ДЛЛ адрес и размер участка памяти, который был выделен другим процессом для её запуска, чтобы она освободила эту память.
В этом случае функция, завершив своё выполнение не имеет права исполнить команду ret так так адрес возврата указывает на освобождённую память, поэтому для выхода из этой функции надо использовать прямой вызов ExitThread, если мы хотим после завершения оставить загруженной нашу ДЛЛ или FreeLibraryAndExitThread если не хотим.
Во втором случае, наш код, отработав в другом процессе не оставляет никаких следов...

Итог... несмотря на кажущуюся сложность шага номер 5 реализация всего кода занимает 200 строчек. Из которых на пятый шаг приходится порядка сорока строк ассемблерного кода, который просто копирует нужную часть самого себя в указанное место памяти...
Способ гарантированно работает, имеется его реализация, проверена и работает на 2000 XP... Получается его использовать на всех процессах, для которых достаточно прав...
Что вы думаете по поводу такой идеи?
С уважением,
Андрей, студент программист.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.