Главная страница
    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.47 MB
Время: 0.049 c
15-1178103104
IMHO
2007-05-02 14:51
2007.06.03
Что за мода такая?


1-1175692451
Damager
2007-04-04 17:14
2007.06.03
TJvCheckTreeView


11-1160942958
Psychedelic
2006-10-16 00:09
2007.06.03
как обратиться к KOLProject не через инспектор?


4-1167257905
Shadow[AN]
2006-12-28 01:18
2007.06.03
Получение имени и размера шрифтов из текушей темы Windows


15-1178185081
db2admin
2007-05-03 13:38
2007.06.03
Вопрос совместимости





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский