Können Sie Windows-Hooks oder andere Methoden Code-Injektion mit C# tun? Ich habe viele Dinge über die Code-Injektion gesehen, aber alle sind in C/C++ erledigt. Ich kenne keine dieser Sprachen und habe Schwierigkeiten beim Übersetzen. Hat jemand irgendwelche Ideen, wie man das macht?Code-Injektion mit C#
Antwort
Kevin, ist es möglich. Sie können eine Bibliothek mit einem Fenster-Hook-Prozess mit verwaltetem C++ erstellen. Alles, was Sie tun müssen, ist diesen Haken in eine Anwendung mit Standard-WinAPI (SetWindowsHookEx etc.) zu injizieren. In diesem Hook können Sie die Methode System :: AppDomain :: CurrentDomain-> Load aufrufen, um Ihre Assembly in die AppDomain der Zielanwendung zu laden. Dann können Sie die in Ihrer Baugruppe definierten Methoden über Reflektion aufrufen. Zum Beispiel verwendet Snoop diese Methode.
kam gerade über einen Link, der zu diesem Thema ausführlich behandelt, damit ich es posten hier wollte: How To Inject a Managed .NET Assembly (DLL) Into Another Process
Der Link scheint zu brechen –
Hier ist ein Archiv von Wayback Machine https://web.archive.org/web/20130303142450/http://www.codingthewheel.com/archives/how-to-inject-a-managed -assembly-dll –
Ich sehe, warum der Link gebrochen ist ... Der Autor nimmt für immer auf den Punkt! –
Mike Stall hat this sample, die Create verwendet. Es hat den Vorteil, kein C++ zu benötigen.
Sie können CInject für die Code-Injektion in .NET-Assemblies an der CodePlex-Site http://codeinject.codeplex.com/ auschecken. Sie müssen kein Wissen über die Code-Injektion haben, um Code injizieren zu können, wenn Sie CInject verwenden.
Oder Sie können die genannten Schritte folgen In diesem Artikel zu [Intercepting Method Calls unter Verwendung von IL] (http://www.codetails.com/punitganshani/intercepting-method-calls-using-il/20121202) erstellen Sie Ihren eigenen Interceptor mithilfe von Reflection.Emit-Klassen in C#. –
EDIT: Ich habe die Frage falsch interpretiert .... Ich hatte den Eindruck, dass die Frage über Code-Injektion in den laufenden Prozess war.
Ich trete die Partei ziemlich spät, aber ich habe gerade genau dies vor ein paar Wochen gebraucht:
Ein Delegierter enthält die privaten Felder IntPtr _methodPtr
and IntPtr _methodPtrAux
, die die Speicheradresse des Körpers darstellen. Indem man das Feld (über Reflektion) auf bestimmte Werte setzt, kann man die Speicheradresse ändern, auf die der EIP zeigen wird.
Unter Verwendung dieser Information kann man folgendes tun:
- ein Array mit Montage Bytes erstellen, die
- Bewegen Sie den Methodenzeiger des Delegierten auf die Bytes in Frage
- Rufen Sie die Delegat ausgeführt werden sollen
- Gewinn ???
(Natürlich können Sie das _methodPtr
-Wertes auf jede Speicheradresse ändern - auch im Kernel-Space, aber dies könnte geeignete Ausführungsrechte erforderlich).
Ich habe ein Arbeitscodebeispiel hier, wenn Sie wollen:
public static unsafe int? InjectAndRunX86ASM(this Func<int> del, byte[] asm)
{
if (del != null)
fixed (byte* ptr = &asm[0])
{
FieldInfo _methodPtr = typeof(Delegate).GetField("_methodPtr", BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo _methodPtrAux = typeof(Delegate).GetField("_methodPtrAux", BindingFlags.NonPublic | BindingFlags.Instance);
_methodPtr.SetValue(del, ptr);
_methodPtrAux.SetValue(del, ptr);
return del();
}
else
return null;
}
, die wie folgt verwendet werden:
Func<int> del =() => 0;
byte[] asm_bytes = new byte[] { 0xb8, 0x15, 0x03, 0x00, 0x00, 0xbb, 0x42, 0x00, 0x00, 0x00, 0x03, 0xc3 };
// mov eax, 315h
// mov ebx, 42h
// add eax, ebx
// ret
int res = del.InjectAndRunX86ASM(asm_bytes); // should be 789 + 66 = 855
Natürlich auf könnte auch die folgende Methode schreiben:
Das gleiche könnte wahrscheinlich zu bestehenden Methoden (nicht Delegaten) über Reflexion:
// UNTESTED //
Action new_method_body =() => { };
MethodInfo nfo = typeof(MyType).GetMethod(.....);
IntPtr ptr = nfo.MethodHandle.Value; // ptr is a pointer to the method in question
InjectX86ASM(new_method_body, new byte[] { ......., 0xC3 }); // assembly bytes to be injected
int target = new_method_body.Method.MethodHandle.Value.ToInt32();
byte[] redirector = new byte[] {
0xE8, // CALL INSTRUCTION + TARGET ADDRESS IN LITTLE ENDIAN
(byte)(target & 0xff),
(byte)((target >> 8) & 0xff),
(byte)((target >> 16) & 0xff),
(byte)((target >> 24) & 0xff),
0xC3, // RETURN INSTRUCTION
};
Marshal.Copy(redirector, 0, ptr, redirector.Length);
Verwenden Sie einen beliebigen Code auf eigene Gefahr. Die Codebeispiele müssen mit der
/unsafe
-compiler switch kompiliert werden.
Das OP möchte Code in einen externen Prozess einfügen. –
@joshpoley: Oh mein Schlechter ... muss die Frage falsch gelesen haben: / – Unknown6656
Link jetzt unterbrochen –
Es kann für jemanden nützlich sein, auf https://web.archive.org/web/20081228210203/http://blois.us/Snoop/ w.r.t. der gebrochene Link. –