Существует платная реализация
CreateRemoteThread для Windows 9x, смотрите сайт http://www.apihooks.com
раздел «PrcHelp».
Прототип вызываемой функции должен соответствовать
прототипу функции потока.
Кроме того, нужно иметь солидные права доступа к
процессу-жертве:
PROCESS_CREATE_THREAD
для запуска потока.
PROCESS_VM_READ для определения адреса.
PROCESS_VM_OPERATION + PROCESS_VM_WRITE (разрешение на
выделение памяти и запись в адресное пространство процесса) может пригодиться, если вы хотите передать вызываемой функции что-нибудь посущественнее, чем
четыре байта.
ПРИМЕЧАНИЕ
Проще всего получить все эти права, создав процесс, но, являясь достаточно привилегированным пользователем, можно
получить необходимый доступ и к существующему процессу.
Получение адреса загрузки DLL
В общем случае, при помощи функций EnumProcessModules
и GetModuleFileNameEx можно перебрать все загруженные в процесс-жертву модули, найти среди них нужный и получить адрес его загрузки.
ПРИМЕЧАНИЕ
Эти функции являются частью Process
Status API (PSAPI), поэтому будут работать только в линейке Windows
NT/2000/XP. Но поскольку мы уже и так используем CreateRemoteThread, терять
нам нечего.
Но если DLL внедрялась с помощью создания в
процессе-жертве потока, поточной функцией которого является LoadLibrary, можно
поступить проще. В этом случае код завершения потока является возвращаемым
значением LoadLibrary, то есть как раз адресом загрузки DLL в процессе-жертве.
ПРЕДУПРЕЖДЕНИЕ
Вообще-то, как показывает практика, возвращаемое значение LoadLibrary – это не совсем адрес загрузки DLL. В
некоторых случаях в младших битах находятся какие-то флаги. Например, при
вызове функции LoadLibraryEx с флагом LOAD_LIBRARY_AS_DATAFILE младший бит
возвращаемого значения всегда будет установлен в 1.
Выход достаточно прост: поскольку при
загрузке модуля в адресном пространстве создаётся регион, а адреса начала
регионов должны быть кратны 64К, для получения «настоящего» адреса загрузки
нужно просто обнулить два младших байта.
Получение адреса функции
Есть два способа получить адрес функции: простой и для
настоящих программистов. :)
Простой способ
Простой способ основан на том, что смещение начала
функции от начала DLL – величина постоянная, от процесса не зависящая. Это
значит, что если:
загрузить в свой процесс ту же DLL;
получить адрес нужной функции;
вычесть из адреса функции адрес загрузки DLL;
прибавить к получившемуся смещению адрес загрузки DLL
в процессе-жертве,
то получится адрес функции в процессе-жертве.
Рекомендуем скачать другие рефераты по теме: банк рефератов 5 баллов, дипломная работа персонал.