Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как выполнить чужую процедуру в чужой программе


pasenus ©   (2007-05-13 08:43:00) 

Здравствуйте. Такая проблема. Есть чужой exe-файл, в нем процедура. Описание и параметры ее я знаю. Как мне из моей проги передать параметры и  выполнить эту процедуру в . То есть чтобы процедура выполнилась не в моей проге , а в той в которой она и описана.


Eraser   (2007-05-13 13:37:00) [1]

> [6] pasenus   (13.05.07 12:46)

достаточно подменить контекст одного из потоков целевой программы.. см. статью - там все описано.


pasenus   (2007-05-13 12:46:00) [2]

Спасибо. Но может все таки можно обойтись без внедрения? Я ведь хочу выполнить не свою процедуру, а родную. мне нужно только передать параметры и получить результат. Таких примеров ни у кого нет?


Eraser   (2007-05-13 12:29:00) [3]

> [0] pasenus   (13.05.07 08:43)

http://www.wasm.ru/article.php?article=apihook_2


pasenus   (2007-05-13 12:02:00) [4]

Выходит задача даже упрощается. Зная адрес функции и параметры(из отладчика) я должен делать так.

1.  без изменений.
2. выделяем память в чужом процессе под параметры функций и указатель на нее
3. CreateRemoteThread - создаем в чужом процессе поток с адреса в указателе. А как передать параметры?

И может у кого есть пример запуска процедур c параметрами в чужом процессе?процессе?


DrPass   (2007-05-13 11:16:00) [5]

2. Смотря что за переменные. Если в той процедуре в качестве параметров должен передаваться один указатель, то да, VirtualAllocEx/WriteProcessMemory/CreateRemoteThread подойдет. Если что-либо другое, то нет, конечно.

3. Ну, во-первых, GetModuleHandle работает только для модулей в адресном пространстве текущего процесса. Чужое приложение работает в собственном адресном пространстве. Во-вторых, GetProcAddress позволяет определить адреса только экспортируемых процедур и функций. У exe-файлов в 99.9999% таких процедур ровно 0. Адрес можно определить только одним способом (если, конечно, нет map-файла, оставшегося от сборки приложения) - запустить приложение под отладчиком и посмотреть.

4. Скорее всего, тебе придется внедрять свою DLL в АП того приложения, а уже она должна будет делать все действия по подготовке параметров и вызова этой процедуры


pasenus   (2007-05-13 09:17:00) [6]

да, примерную последовательность действий я знаю. До непосредственно запуска.

1. Открываем процесс чужой проги
ThreadId := GetWindowThreadProcessId(WindowName, @ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, True, ProcessId);

2. Выделяем память под переменные(название искомой функции) в этом процессе
VirtualAllocEx(???)

3. Получаем адрес нужной процедуры
теперь нам надо вызвать GetModuleHandle(а не loadlibrary, т.к. екзешник уже загружен) и GetProcAdress . Все это в чужом процессе.
как?
4. Запускаем найденную процедуру с нашими параметрами в процессе чужой проги
CreateRemoteThread(???)

Вот хотелось подробно про каждый пункт. И если я не прав то как правильно?


begin...end   (2007-05-13 08:57:00) [7]

Для этого, в первую очередь, должен быть известен адрес начала кода процедуры в адресном пространстве чужой программы.


Наверх

Титульная страница Поиск, карта сайта Написать письмо