![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выполнить чужую процедуру в чужой программе
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]Для этого, в первую очередь, должен быть известен адрес начала кода процедуры в адресном пространстве чужой программы.