Форум: "Начинающим";
Текущий архив: 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.043 c