[C#]Dll Injection

06/26/2010 19:29 BlackWu#1
Hallo Leute,

ich möchte einen Dll Injector in C# schreiben.
Eigentlich ist alles andere fertig bis auf das wichtigste: den Teil des Programms der die Dll injected.
Wie funktioniert eine Injection in C#?
Habe in google gesucht aber nichts gefunden.

Mfg BlackWu
06/26/2010 20:07 Akorn#2
Lass mich raten du hast bis jetzt nicht viel mehr gemacht als eine Oberfläche zusammengestellt.

Es gibt mehrere möglichkeiten eine Dll zu injectieren. Die meisten injectoren funktionieren so das sie eine funktion die eine Dll lädt in den Prozessspeicher des opfer pogramms schreiben und diese dort zum ausführen bringen.

Da du aber sprache verwendest die bytecode erzeugt und die opfer pogramme warscheinlich aus maschienencode bestehen, wird man das mit c# nicht alleine auf diese art realiesieren können.
06/26/2010 20:14 BlackWu#3
Quote:
Originally Posted by Akorn View Post
Lass mich raten du hast bis jetzt nicht viel mehr gemacht als eine Oberfläche zusammengestellt.

Es gibt mehrere möglichkeiten eine Dll zu injectieren. Die meisten injectoren funktionieren so das sie eine funktion die eine Dll lädt in den Prozessspeicher des opfer pogramms schreiben und diese dort zum ausführen bringen.

Da du aber sprache verwendest die bytecode erzeugt und die opfer pogramme warscheinlich aus maschienencode bestehen, wird man das mit c# nicht alleine auf diese art realiesieren können.
Richtig geraten! :awesome:
Danke für die Hilfe, aber kennst du vieleicht ein Tutorial wo genauer auf Code injection mit C\C++ oä. eingegangen wird?

06/26/2010 20:59 nkkk#4
jo, du musst(so hab ich es zumindest gemacht) ein e C++ Dll schreiben, und eine C++ exe die die Dlll injectet, vielicht kann man auch die Dll direkt von C# aus injecten, mir ist das allerdings nicht so gelungen.
06/26/2010 21:03 Bot_interesierter#5
Einen Injektor kann man ohne Probleme in .NET programmieren, nur die DLL die du injizierst muss nativ sein, eine .NET assembly wird nicht funktionieren.

Die DLL Injektion geht ziemlich einfach, du holst dir mit system.Diagnostic.Process.EnterDebugMode(); erstmal Debug Privilegien, dann musst du dir ein Prozess Handle, mit den richtigen rechten zu dem Prozess in den du die DLL injizieren möchtest, holen, um danach in diesem Prozess etwas Speicher zu allozieren in den du dann den kompletten Pfad der DLL schreibst, dann rufst du die Windows Api CreateRemoteThread auf die Adresse von LoadLibrary auf und übergibst als lpParamter die Adresse des Strings mit dem DLL Pfad.

Alle Informationen wie genau man die Windows Apis verwendet findest du auf MSDN.com.

Edit: Die API für das Allozieren von Speicher in einem fremden Prozess heißt VirtualAllocEx
Auf MSDN steht auch immer wie man die Windows Api Funktionen in den .NET Sprachen richtig benutzt.
06/26/2010 21:39 Akorn#6
hier mal nen link zu einem tutorial wie man es in C macht [Only registered and activated users can see links. Click Here To Register...].

Quote:
Originally Posted by Bot_interesierter View Post
Einen Injektor kann man ohne Probleme in .NET programmieren, nur die DLL die du injizierst muss nativ sein, eine .NET assembly wird nicht funktionieren.

Die DLL Injektion geht ziemlich einfach, du holst dir mit system.Diagnostic.Process.EnterDebugMode(); erstmal Debug Privilegien, dann musst du dir ein Prozess Handle, mit den richtigen rechten zu dem Prozess in den du die DLL injizieren möchtest, holen, um danach in diesem Prozess etwas Speicher zu allozieren in den du dann den kompletten Pfad der DLL schreibst, dann rufst du die Windows Api CreateRemoteThread auf die Adresse von LoadLibrary auf und übergibst als lpParamter die Adresse des Strings mit dem DLL Pfad.
Aber LoadLibrary muss ja innerhalb des opferpogramms aufgerufen werden.
Also musste man doch Loadlibrary in eine funktion packen und diese in das opferpogramm rein schreiben und diese funktion dann mittels CreateRemotetThread ausfuhren. Aber wen jetzt diese function die Loadlibrary beinhaltet in bytecode vorliegt dann bezweifel ich das man sie einfach mit CreateRemoteThread aufrufen kann.

EDIT:
Ich mein auch das in dem tutorial vom HABO das ich oben gelinkt habe irgendwo drin stand das man kein byte code verwenden darf.
06/26/2010 22:05 BlackWu#7
Vielen Dank für eure hilfe.

Mfg BlackWu
06/26/2010 22:10 Bot_interesierter#8
@Akorn
Man kann LoadLibrary direkt über CreateRemoteThread ausführen, es gibt keinen Grund irgendwelche Funktionen in den Speicher des Ziels zu schreiben, daher auch keine Probleme mit Bytecode, das Problem wäre allerdings auch zu umgehen mit einer unmanaged Funktion, damit kann man quasi nativen Code in C# schreiben, allerdings wird es etwas kompliziert diesen Code dann zu kopieren, einfach wäre es direkt Shell Code also assembler zu schreiben und diesen zu injizieren.
Aber wie gesagt das alles ist unnötig da man LoadLibrary mit CreateRemoteThread ausführen kann.
06/28/2010 18:15 Medix#9
[Only registered and activated users can see links. Click Here To Register...]

sollte dir weiter helfen :)
08/04/2010 23:22 xenex(toemsel)#10
[Only registered and activated users can see links. Click Here To Register...]
08/05/2010 01:06 SmackJew#11
@Bot_interesierter: Mal ne OT Frage, kannst du mir mal die Story hinter dem retardierten Nickname berichten? :p
08/05/2010 13:01 Bot_interesierter#12
Nun das war so, also da war ein Nickname Feld und dort musste man etwas eintragen =)

Damit der Beitrag nicht ganz OT ist:
@xenex
Dieses CLR Hosting ist nur was für Leute die PInvoke lieben ;)