Вызов функции из C # .exe с неуправляемым C ++ .dll - PullRequest
5 голосов
/ 24 мая 2011

Итак, у меня есть исполняемый файл, созданный на C #, у меня нет его исходного кода, но я разобрал его с помощью IDA, и он дал мне много объектно-ориентированной сборки.

IЯ создал файл .exe, который внедряет .dll в другой .exe, и я вставил эту новую C ++ DLL в C # .exe, без проблем, вызывается DLLMain и так ...

Но когда я внедряю эту DLL в обычный файл .exe, созданный на C ++, я могу вызвать функцию в .exe с адресом памяти, который я могу использовать для IDA.

Проблема в том, что объектно-ориентированныйСборка не имеет адресов в своей функции, даже при разборке имен функций.

Итак, есть ли способ вызвать эту функцию с моей внедренной DLL в файле C # .exe?

Если возможно, могу ли я использовать пространство имен, объявленное в файле C # .exe, и все его функции и переменные, даже будучи закрытыми?

Пример дизассемблированного кода:

.namespace MyCSharpApp
{
.class public auto ansi Test extends [mscorlib]System.Object
{
  .field public value class [Microsoft.Xna.Framework]Microsoft.Xna.Framework.Vector2 pos

  .field public int32 foo
....

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

Вы пытаетесь сделать что-то хитрое, и я не совсем понимаю, что это такое.Из вашего описания у вас есть как минимум четыре вещи:

  • Управляемый EXE
  • Управляемый DLL
  • Неуправляемый EXE
  • Неуправляемый DLL

некоторые из которых вы контролируете (т.е. исходный код), а некоторые нет.

Вы хотите использовать процесс, который вы называете «инъекцией», чтобы изменить модуль, который вы не контролирует вызов модуля, над которым вы делаете .Для этого вы используете инструмент, который требует, чтобы у вас была неуправляемая точка входа в адресном пространстве процесса.

Если вы получаете то, что вы хотите с неуправляемыми модулями, тогда все, что вам нужно сделатьэто написать новый модуль смешанного режима (над которым вы, очевидно, имеете контроль), чтобы вызвать управляемую DLL, которой вы не управляете.Теперь у вас есть неуправляемая DLL (для целей экспорта), и проблема ее управления исчезла.

Для вызова управляемого кода из нового неуправляемого модуля-оболочки можно использовать методы, описанные в этой вводной статье.:

В основном вам необходим проект C ++ / CLI, который ссылается на управляемую DLL черного ящика ивызывает его и экспортирует неуправляемую точку входа, которую вы можете «взять по адресу» для инъекции.Поиск найдет вам гораздо больше идей.

Наконец, можете ли вы использовать private методы в управляемой DLL (над которой у вас нет контроля), используя этот метод?Нет, не напрямую.Тем не менее, это управляемая DLL, поэтому она должна иметь некоторые public точек входа, чтобы они когда-либо были кому-нибудь полезны, и их можно вызывать.Если этого недостаточно, вы можете использовать отражение из C ++ / CLI для вызова закрытых методов и доступа к закрытым членам.

1 голос
/ 24 мая 2011

Вам нужно будет использовать API неуправляемого хостинга / отладки.Если бы вы могли вставить управляемую DLL, это было бы намного проще, вы могли бы просто использовать Reflection.

...