Всем привет! Конечно, это надо писать на C++, но уж так получилось, что нужно на .NET.
Имеется работающий процесс. Его код содержит функции, имена и адреса которых известны. Можно ли выполнить функцию в этом процессе?
Здравствуйте, Flammable, Вы писали:
F>Всем привет! Конечно, это надо писать на C++, но уж так получилось, что нужно на .NET. F>Имеется работающий процесс. Его код содержит функции, имена и адреса которых известны. Можно ли выполнить функцию в этом процессе?
Сомневаюсь.
От имени функции толку мало, если эта функция не экспортируется, а вот адрес, надо полагать, можно превратить в делегат с помощью Marshal.GetDelegateForFunctionPointer. Разумеется, сначала надо этот делегат описать.
С этим проблем не предвидится, но сначала надо попасть в этот процесс и заставить его загрузить рантайм NET. Попасть в него можно с помощью CreateRemoteThread, но вот заставить этот поток выполнять NET-код вряд-ли получится.
Я-бы не заморачивался и использовал подходящий язык, Си или дельфи, например.
"Нормальные герои всегда идут в обход!"
Re: Вызов функций чужого процесса
От:
Аноним
Дата:
08.11.10 19:25
Оценка:
Здравствуйте, Flammable, Вы писали:
F>Всем привет! Конечно, это надо писать на C++, но уж так получилось, что нужно на .NET. F>Имеется работающий процесс. Его код содержит функции, имена и адреса которых известны. Можно ли выполнить функцию в этом процессе?
посмотрите здесь http://blogs.msdn.com/b/jmstall/archive/2006/09/28/managed-create-remote-thread.aspx
Здравствуйте, Flammable, Вы писали:
F>Всем привет! Конечно, это надо писать на C++, но уж так получилось, что нужно на .NET. F>Имеется работающий процесс. Его код содержит функции, имена и адреса которых известны. Можно ли выполнить функцию в этом процессе?
Если адреса известны то, как уже посоветовали CreateRemoteThread. Просто, передавайте ей уже известный адрес.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
TK>Если адреса известны то, как уже посоветовали CreateRemoteThread. Просто, передавайте ей уже известный адрес.
Вы не могли-бы чуть подробнее? Вы имеете в виду передать этот адрес в качестве потоковой функции? А как тогда быть с параметрами и с возможным несовпадением сигнатур? Или я Вас неправильно понял?
Ещё возникла мысль использовать прекомпилированную в нативный код NET-dll, но тут тоже, по-моему, будет непросто. Нужно будет обеспечить релок кода, что скорее всего придётся делать вручную.
1)Процесс А получает IntPtr для своего-же делегата.
2)Запускает процесс Б, передав через параметры этот IntPtr.
3)Процесс Б вызывает CreateRemoteThread для процесса А, исользуя полученный от него IntPtr.
ИМХО, представлен самый неинтересный случай из всех возможных. Оба процесса — NET-приложения, оба процесса готовы выполнить соответствующие действия, наконец, это вообще не имеет смысла, так как процесс А с тем-же успехом может сам создать поток со своим делегатом, процесс Б вообще не нужен. То есть пример, по-моему, чисто академический, к реальной жизни никак не подходящий.