Dll Injection, Opfer Prozess stürzt ab
-
Das hat mit einer Option von VS rein gar nichts zu tun. Du injectest eine ganz normale DLL, welche Runtime Checks sollten da Probleme machen ?
Erstmal: Das "new" und "delete" auf dem FILE Obejkt ist Blödsinn, da mischst du C und C++. Das Object wir durch "fopen" geöffnet und durch "fclose" geschlossen.
Schon mal versucht den Zielprozess zu debuggen ? Ich würde wetten "fopen_s" schlägt fehl, der Aufruf von "fprintf" crasht dann.
Mach aus der DLLMain einfach nurMessageBox(0,"Hi","Test",0); return TRUE;
Wenn das schiefgeht liegts jedenfalls nicht an der DLL
-
Das selbe mit dem
strlen()+1
muss auch noch beiVirtualAllocEx
hin.
Wobei es daran vermutlich auch nicht liegt.Der Returntyp von
GetProcAddress
istFARPROC
, nichtLPVOID
, aber daran wird's eher auch net liegen.DarkShadow44 schrieb:
Mach aus der DLLMain einfach nur
MessageBox(0,"Hi","Test",0); return TRUE;
Wenn das schiefgeht liegts jedenfalls nicht an der DLL
Darf man in der
DllMain
echt ne MessageBox aufmachen?
Ich würde einfach mal nurWriteDebugStringA("TEST234\n")
machen.
Und dann mit DebugView o.ä. gucken ob es getraced wird.
-
Also ich kann nur sagen dass ich damit nie Probleme hatte, auch wenn das bekanntlich nicht unbedingt viel heißt. Nimm also lieber hustbaers Idee.
Hauptsache dass sichersteht dass die Dll selber nicht das Problem ist. Und ansonsten einfach nen Debugger nutzen
-
Da es eigentlich nur sicher ist Kernel32 Funktionen in DllMain zu benutzen würde ich den Aufruf der MessageBox (User32) als unsicher einstufen...
-
Okay, danke es funktioniert mit einer einfachen message box!
Merkwürdig aber nun gut.
-
DarkShadow44 schrieb:
Ich würde wetten "fopen_s" schlägt fehl, der Aufruf von "fprintf" crasht dann.
Ich würde wetten, das delete in Zeile 23 schlägt fehl.
FILE* wird durch fopen_s neu definiert und durch fclose ungültig gemacht. In seinem Code entsteht also ein Speicherlack + ungültiger Speicherzugriff.
-
Sagen wir es so, du hast keinen blasen Schimmer was du da machst. Ich würde dir empfehlen dich richtig mit der Materie vertraut zu machen, und nicht einfach copy and past von tutorials...so bringt das nämlich gar nichts.
GastGastGast schrieb:
Auf einer Seite habe ich gelesen das VS mit einer bestimmten Einstellung selbst runtime checks in den Code einfügt und dadurch das allozieren nicht richtig funktionieren könnte.
Das trifft bei der Technik LoadLibrary+CreateRemoteThread nicht zu.
oder
GastGastGast schrieb:
//Läd Funktion LoadLibrary in den Speicher
LPVOID pLoadLib = GetProcAddress( GetModuleHandle( "Kernel32.dll" ), "LoadLibraryA" );Was macht die Zeile aus deiner Sicht? Ich glaube du verstehst da was ganz falsch.
Ausserdem brauchst du SeDebugPrivilege() für System Services.
Aber alles in allem würde ich sagen das es an deiner DLL hängt!
Edit: Youka hat dich jetzt sogar darauf hingewiesen!
-
Naja, erstmal das Problem ist gelöst.
Es lag wirklich an meiner DLL.
Zu deiner Frage was der Quote Zeile macht:
Es werden beim Program start automatisch mehrere windowseigene Dlls in das Programm geladen.
Ich nehme an GetProcAdree liefert mir dir genaue adresee der Funktion loadLib von der Kernel.dll
Wie gesagt es sind erste schritte um mir die windows api näher zu bringen.
Das man ohne Warnung in einem ausdrücklichen C++ Projekt C Methoden verwenden darf war mir so nicht bewusst. Ich habe gelernt auf dem Heap allozierte variablen müssen wieder gelöscht werden. Bin zwar noch nicht so erfahren in C++ aber ich denke es hat sich einiges getan in den letzten Wochen (komme aus der Java ecke)
Gibt es eine Möglichkeit Funktion Beschreibungen in VS zu laden?
Eclipse hat z.B für Java eine recht umfangreiche API mit genauer Methoden Definition das vermisse ich bei c++ etwas.
-
GastGast schrieb:
Es werden beim Program start automatisch mehrere windowseigene Dlls in das Programm geladen.
Ich nehme an GetProcAdree liefert mir dir genaue adresee der Funktion loadLib von der Kernel.dll
Warum Kommentierst du dann die Zeile so?
// Läd Funktion LoadLibrary in den Speicher
-
Das ist Anfängersprache
-
schon beantwortet hups
-
Naja, ich habe mir mehrere Tutorials durchgelsen bis ich den Sinn hinter den ganzen Aufrufen verstanden habe und dann einfach schnell ein paar Kommentare in den Code gehauen.
Ich hätte natürlich zeigt oder deutet sagen sollen.