5 Stimmen

Aufruf einer Funktion von C# .exe mit nicht verwalteter C++ .dll

Also, ich habe eine ausführbare Datei, die mit C# gemacht wurde, ich habe nicht den Quellcode, aber ich habe es mit IDA disassembliert, und es gab mir eine Menge von objektorientierten Assembly.

Ich habe eine Exe-Datei, die eine DLL in eine andere Exe injiziert gemacht, und ich habe diese neue C++-DLL in die C#-Exe injiziert, ohne Probleme, die DLLMain aufgerufen wird und so...

Aber wenn ich diese DLL in eine normale, mit C++ erstellte .exe-Datei einfüge, kann ich eine Funktion in der .exe mit ihrer Speicheradresse aufrufen, die ich in IDA übernehmen kann.

Das Problem ist, dass objektorientierte Assemblies keine Adressen für ihre Funktionen haben, selbst wenn die Funktionsnamen disassembliert werden.

Also, gibt es eine Möglichkeit, die ich diese Funktion mit meiner injizierten DLL auf die C#-Exe-Datei aufrufen kann?

Wenn möglich, gibt es eine Möglichkeit, wie ich den in der C#.exe-Datei deklarierten Namespace und alle seine Funktionen und Variablen verwenden kann, auch wenn sie privat sind?

Beispiel für disassemblierten Code:

.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
....

3voto

Rick Sladkey Punkte 33363

Sie versuchen, etwas Kompliziertes zu tun, und mir ist nicht ganz klar, was es ist. Ihrer Beschreibung nach haben Sie mindestens vier Dinge:

  • Verwaltete EXE
  • Verwaltete DLL
  • Unverwaltete EXE
  • Unverwaltete DLL

über die Sie zum Teil Kontrolle haben (z. B. Quellcode), zum Teil aber auch nicht.

Sie möchten ein Modul mit Hilfe eines Prozesses, den Sie "injecting" nennen, ändern nicht Kontrolle haben, um ein Modul aufzurufen, das Sie do Kontrolle zu haben. Um dies zu tun, verwenden Sie ein Werkzeug, das einen nicht verwalteten Einstiegspunkt im Adressraum des Prozesses erfordert.

Wenn Sie mit nicht verwalteten Modulen erreichen, was Sie wollen, müssen Sie nur ein neues Mixed-Mode-Modul schreiben (über das Sie natürlich die Kontrolle haben), um die verwaltete DLL aufzurufen, die Sie nicht kontrollieren. Jetzt haben Sie effektiv eine nicht verwaltete DLL (für Exportzwecke) und das Problem, dass sie verwaltet wird, ist verschwunden.

Um verwalteten Code von Ihrem neuen nicht verwalteten Wrapper-Modul aufzurufen, können Sie die in diesem Einführungsartikel beschriebenen Techniken verwenden:

Grundsätzlich benötigen Sie ein C++/CLI-Projekt, das auf Ihre verwaltete Blackbox-DLL verweist, sie aufruft und einen nicht verwalteten Einstiegspunkt exportiert, dessen Adresse Sie für Ihre Injektion "übernehmen" können. Bei der Suche werden Sie eine ganze Menge weiterer Ideen finden.

Und schließlich, können Sie anrufen private Methoden in der verwalteten DLL (über die Sie keine Kontrolle haben) mit dieser Methode? Nein, nicht direkt. Da es sich jedoch um eine verwaltete DLL handelt, muss sie über un peu de public Einstiegspunkte, die jemals für irgendjemanden nützlich waren und die Sie anrufen können. Wenn das nicht genug ist, können Sie kann Reflection aus C++/CLI verwenden, um private Methoden aufzurufen und auf private Mitglieder zuzugreifen.

1voto

Ben Voigt Punkte 268424

Sie müssen die nicht verwalteten Hosting-/Debugging-APIs verwenden. Wenn Sie eine verwaltete DLL injizieren könnte, wäre dies viel einfacher, Sie könnten nur Reflection verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X