[C# Beginner] Dll injection "intern"
-
Guten Abend
ich futzel mich im Moment etwas in C# rein und versuche eine DLL in einen Prozess zu Injizieren.
Soweit so gut, allerdings bekomme ich dies nur hin, solange die DLL in einem Verzeichniss auserhalb ist.
D.h. Ordner aufm Desktop => "Injector" + .dll => Im injector den Pfad angeben => injizieren usw.
Ich möchte nun allerdings direkt die .dll in das Programm integrieren und diese von dort heraus Injizieren.
Bin leider sehr am verzweifeln, da ich keine Lösung finde
public static int inject(string dllPath, Process tProcess) { Process targetProcess = tProcess; string dllName = dllPath; IntPtr procHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, false, targetProcess.Id); IntPtr loadLibraryAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); IntPtr allocMemAddress = VirtualAllocEx(procHandle, IntPtr.Zero, (uint)((dllName.Length + 1) * Marshal.SizeOf(typeof(char))), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); UIntPtr bytesWritten; WriteProcessMemory(procHandle, allocMemAddress, Encoding.Default.GetBytes(dllName), (uint)((dllName.Length + 1) * Marshal.SizeOf(typeof(char))), out bytesWritten); CreateRemoteThread(procHandle, IntPtr.Zero, 0, loadLibraryAddr, allocMemAddress, 0, IntPtr.Zero); return 0; }
Dies ist mein aktueller Code mit dem ich externe .dll's injizieren kann.
Würde mich sehr über hilfe und evtl. belehrung freuen!
-
Du meinst du willst die DLL in dein Programm einbetten und so injizieren?
Dazu müsstest du die DLL halt während der Laufzeit in ein temporäres Verzeichnis entpacken. Oder was genau meintest du?
-
DarkShadow44 schrieb:
Du meinst du willst die DLL in dein Programm einbetten und so injizieren?
Dazu müsstest du die DLL halt während der Laufzeit in ein temporäres Verzeichnis entpacken. Oder was genau meintest du?den gleichen gedanken gang hatte ich auch aber das know how ist nicht vorhanden.
Gäbe es da eine Möglichkeit?
-
Klar. Sollte recht einfach sein die DLL einzubette, such einfach mal nach "embedded resource".
Zum Beispiel Codeproject - Embedding and Using Resources from .Net Assembly. Den Stream könntest du dann einfach in einen Filestream kopieren und schon hast du die DLL wiederals Datei.
-
Scheitert es vielleicht einfach an
public static int inject(string dllPath, Process tProcess) { Process targetProcess = tProcess; string dllName = Path.GetFullPath(dllPath); // <------------
?
Die Variablen-Namen sind dann natürlich verkehrt rum (der Pfad steht indllName
, der Name indllPath
). Hab halt einfach nur dein Beispiel minimal angepasst - Variablen umbenennen darfst du selbst.Davon abgesehen ist natürlich die Art & Weise wie hier mit
Encondig.GetBytes()
vs.dllName.Length
verfahren wird Quatsch.
Sollte bei CP1252 aber keinen Unterschied machen.
Und warum nicht gleichLoadLibraryW
verwenden?
-
Habe das mit dem Embedded source mal probiert leider nicht das wunschergebniss.
@Hustbaer Hört sich Interessant an leider verstehe ich noch nicht wie mir der Code Snip, sowie LoadLibraryW weiterhelfen sollen. Könntest du mir da genauere Infos zu geben? Danke
-
Simpl3x schrieb:
Habe das mit dem Embedded source mal probiert leider nicht das wunschergebniss.
Inwiefern? Was klappt nicht, bzw. was genau ist an der Lösung unerwünscht?
Simpl3x schrieb:
@Hustbaer Hört sich Interessant an leider verstehe ich noch nicht wie mir der Code Snip, sowie LoadLibraryW weiterhelfen sollen. Könntest du mir da genauere Infos zu geben? Danke
Wenn der Pfad zu deiner DLL ein relativer Pfad ist kann es Probleme geben, deshalb solltest du immer absolute Pfade verwenden.
Und LoadLibraryW solltest du verwenden damit eventuelle Sonderzeichen im Pfad keine Probleme machen. Zwecks Einfachkeit und Kompatibilität ist es ratsam immer explizit Unicode zu verwenden, und nie das Default-Encoding.
-
Wenn ich das ganze richtig verstanden habe, funktioniert das ganze über eine XML?
Wenn nicht, war ich grade anscheinend zu Unfähig zum googeln.Habe leider nur Infos mit XML gefunden, welche mich nicht wirklich weitergebracht haben. Könntest du mir evtl. eine kurze erläuterung geben?
-
Ist Simpl3x ein Troll oder hat er/sie/es einfach nur überhaupt komplett total keine Ahnung von Programmieren?
ps:
public static void inject(string dllPath, Process targetProcess) { dllPath = System.IO.Path.GetFullPath(dllPath) + "\0"; byte[] dllPathBytes = Encoding.Unicode.GetBytes(dllPath); IntPtr targetProcessHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, false, targetProcess.Id); IntPtr loadLibraryWAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW"); IntPtr dllNameBufferAddressInTargetProcess = VirtualAllocEx(targetProcessHandle, IntPtr.Zero, (uint)dllPathBytes.Length, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); UIntPtr bytesWritten; WriteProcessMemory(targetProcessHandle, dllNameBufferAddressInTargetProcess, dllPathBytes, (uint)dllPathBytes.Length, out bytesWritten); CreateRemoteThread(targetProcessHandle, IntPtr.Zero, 0, loadLibraryWAddress, dllNameBufferAddressInTargetProcess, 0, IntPtr.Zero); // Prozesshandle freigeben? Threadhandle freigeben? Error-Handling? }
-
C++, Java, PHP usw alles kein Problem aber von C# stimmt ich dir zu habe ich 0 Ahnung.
Deshalb versuche ich das ganze ja zu verstehen.
Danke schonmal, werde mich gleich nochmal dran versuchen.
-
So, habe endlich das Problem gelöst.
Habe nun wie DarkShadow44 vorgeschlagen das ganze über embedded source geregelt.
Lasse die Datei in ein Verzeichnis extracten, führe die Injection aus und lasse anschließend die Libriary wieder Löschen
Vielen dank nochmal an DarkShadow44 für deine Hilfe!
-
Simpl3x schrieb:
C++, Java, PHP usw alles kein Problem aber von C# stimmt ich dir zu habe ich 0 Ahnung.
Wie um alles in der Welt kommst du dann auf "XML"? Was soll XML damit zu tun haben?
-
Beruhig dich doch bitte
Ich hatte müde Augen und war nicht mehr ganz Fit im denken.Im nachhinein, nach weiteren nachforschungen habe ich es doch verstanden & selbständig gelöst.
Also sei doch nicht so feindlich mir gegenüber.
Wünsche dir noch ne angenehme Nacht!
-
Ich bin ganz ruhig.
Simpl3x schrieb:
Beruhig dich doch bitte
Ich hatte müde Augen und war nicht mehr ganz Fit im denken.Nein. Erklär mir bitte wie man hier auf XML kommen kann. Das ist einfach sowas von total daneben, da KANN man einfach nicht drauf kommen.
Simpl3x schrieb:
verstanden & selbständig gelöst
Mhm, ja, sicher.
Simpl3x schrieb:
Also sei doch nicht so feindlich mir gegenüber.
Das ist deine Interpretation.