CreateRemoteThread, LoadLibrary, und PostThreadMessage. Was ist die richtige IPC-Methode?
Okay, ich bin injizieren von code in einem anderen Prozess mit der CreateRemoteThread/LoadLibrary "trick".
Ende ich mit einer thread-id, und ein Prozess mit einer DLL von meiner Wahl dreht. Zumindest in der Theorie, die DLL nichts tut in dem moment so überprüfen, das ist ein wenig kompliziert. Für die Zeit, die ich bereit bin zu akzeptieren, es auf den glauben allein. Neben dieser Frage muss beantwortet werden, bevor ich schieben Sie zu hart in dieser Richtung.
Im Grunde, können Sie nicht blocken, in DllMain. Jedoch, alles, was ich habe, um die Kommunikation mit den remote-thread id. Diese praktisch stellt sich für PostThreadMessage/GetMessage Spielereien, die blockieren. Könnte ich drehen bis ein anderer thread DllMain, aber ich habe keine Möglichkeit, die Kommunikation Ihrer id wieder zurück auf das thread erstellen und keinen Weg vorbei an den anderen thread-id an der Fernbedienung ein.
Kurz und knapp, wenn ich bin momentan dabei, einen remote-thread in einem Prozess wie soll ich die Kommunikation mit dem ursprünglichen Prozess?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schritt null; die injizierte DLL sollte ein Einstiegspunkt, nennen wir es
Init()
nimmtLPCWSTR
als Ihren einzigen parameter und gibtint
; d.h. die gleiche Signatur wieLoadLibrary()
und daher genauso gültig wie ein thread-start-Funktion, Adresse...Schritt eins; injizieren load library und remote-thread. Nichts klüger, in die injiziert DLLs
DLLMain()
. Speichern Sie dieHMODULE
zurückgegeben wird als exit-code der Injektion thread, dies ist derHMODULE
des injizierten DLL und der return-WertLoadLibrary()
.Hinweis, dass dies nicht mehr eine zuverlässige Ansatz auf x64 wenn
/DYNAMICBASE
und ASLR (Address space layout randomisation) aktiviert ist, da dieHMODULE
auf x64 ist größer als dieDWORD
RückgabewertGetThreadExitCode()
und den Adressraum änderungen bedeuten, dass es nicht mehr als wahrscheinlich, dass dieHMODULE
's Wert ist klein genug, um fit in dieDWORD
. Siehe die Kommentare unten und die verlinkte Frage (hier) für ein umgehen mit shared memory zu kommunizieren, dieHMODULE
Schritt zwei; laden der injizierten DLL mit LoadLibrary in den Prozess, die macht der Injektion. Dann finden Sie den Versatz Ihrer
Init()
entrypoint in Ihrem Adressraum und daraus dieHMODULE
Ihrer injizierte DLL in Ihrem Adressraum. Sie haben nun die relative Abweichung derInit()
Funktion. Nehmen Sie dieHMODULE
des injizierten DLL in den Zielprozess (d.h. der Wert, den Sie gespeichert in Schritt eins) und der relativen Adresse derInit()
zu. Sie haben jetzt die Adresse vonInit()
in der Ziel-Prozess.Schritt drei; nennen
Init()
im Ziel-Prozess mit der gleichen "remote thread" - Ansatz, den Sie verwendet aufrufenLoadLibrary()
. Sie können eine Zeichenfolge übergeben, um die Init () - Aufruf, das kann alles sein, was Sie sich einbilden.Was ich eher zu tun ist, übergeben Sie einen eindeutigen string key, dass ich den Einsatz als Teil eines named pipe-Namen. Die DLL Injiziert und die Injektion Prozess nun beide wissen, dass der name eine named pipe, und Sie können die Kommunikation zwischen Ihnen. Die
Init()
Funktion nichtDLLMain()
und nicht leiden unter den Einschränkungen, die Auswirkungen aufDLLMain()
(wie nennt man das nicht innerhalbLoadLibrary
, etc) und so kann man das normale Zeug drin. Sobald die DLL injiziert und die Injektion Prozess verbunden sind, über eine named pipe können Sie die übergabe von Befehlen und Daten hin und her, wie Sie möchten. Seit bestehen derInit()
Funktion ein string ist, können Sie stellen Sie sicher, dass die named pipe ist einzigartig für diese bestimmte Instanz der Injektion verarbeiten und diese bestimmten injizierten DLL was bedeutet, können Sie mehrere Instanzen der Injektion Prozess zur gleichen Zeit, und jeder Prozess gelingen kann, in mehrere Ziel-Prozesse und alle diese Kommunikationswege sind eindeutig und kontrollierbar.Haben Sie nicht die thread-id eines Threads in der remote-Prozess, weil die, die Sie verwendet, um die dll zu laden verlassen, wenn das Modul erfolgreich geladen wurde in den Adressraum des Prozesses.
Können Sie ganz einfach die normale Kommunikation zwischen Prozessen Methoden wie named profile/Rohre/erstellen einer benannten Fenster/usw. kommunizieren mit Ihrem "Injektion" - Prozess.