Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.064 c
3-1173879416
Vladisllav
2007-03-14 16:36
2007.06.03
Связь двух таблиц Ib в Delphi


15-1178619138
Ламот
2007-05-08 14:12
2007.06.03
Ошибка отложенной записи (WinXP & FAT32)


15-1178208918
Ёжик
2007-05-03 20:15
2007.06.03
Объявление экземпляра класса


2-1179223610
shreck
2007-05-15 14:06
2007.06.03
TStringGrid. Как программно выделить текст в конкретной ячейке.


15-1178300863
vasya123123
2007-05-04 21:47
2007.06.03
Свой инсталлятор / installer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский