Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.03;
Скачать: CL | DM;

Вниз

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

 
pasenus   (2007-05-13 08:43) [0]

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


 
begin...end ©   (2007-05-13 08:57) [1]

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


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

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

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

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

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

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


 
DrPass ©   (2007-05-13 11:16) [3]

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

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

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


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

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

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

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


 
Eraser ©   (2007-05-13 12:29) [5]

> [0] pasenus   (13.05.07 08:43)

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


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

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


 
Eraser ©   (2007-05-13 13:37) [7]

> [6] pasenus   (13.05.07 12:46)

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



Страницы: 1 вся ветка

Текущий архив: 2007.06.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
2-1179146369
POP
2007-05-14 16:39
2007.06.03
Непонятка с передачей данных (COM порт)


2-1179176488
redlord
2007-05-15 01:01
2007.06.03
ограничение скорости чтения из файла


15-1178625191
vajo
2007-05-08 15:53
2007.06.03
Какую конфигурацию посоветуете?


1-1175861729
Wahnsinng
2007-04-06 16:15
2007.06.03
Как отключить сообщение об ошибках


15-1178766213
Slider007
2007-05-10 07:03
2007.06.03
С днем рождения ! 10 мая