Herzlich Willkommen zu einem neuen Release hier
"Ey was soll das werden?"
Ganz einfach: die Möglichkeit, beim Start von [beliebiges Programm einsetzen] eine DLL injecten/laden zu lassen, in diesem Tutorial am Beispiel von Metin (weils am gängigsten ist)
Voraussetzungen:
-
-
-
Code:
- Brain
Also, los gehts!
- Die Exe starten (ich geh jetzt immer von der Metin-Exe aus)
- Dem Bild folgen:
- Wir sind also soweit... Jetzt wirds lustig
Wir befinden uns grad am Entrypoint der Exe, der wird beim Start der Exe aufgerufen
Wir suchen uns nun zuerst die Adresse der LoadLibraryA-Funktion aus der Kernel32.dll:
- Unser Ergebnis:
CALL DWORD PTR DS:[73F36C]
- Was machen wir jetzt? GENAU, die Entrypoint-Funktion anzapfen
(Um wieder dort hin zu kommen, entweder STRG+G und 00641BD3 eingeben oder auf dem Nummernblock einmal - und einmal + drücken)
- Wir suchen uns eine Stelle, an der noch kein Code steht (vorzugsweise ganz am Ende der Datei)
- Ganz runterscrollen, dann wieder bisschen hoch, bis diese ganzen "DB 00" in Code übergehen (bei mir startets ab 0073E45A)
Diese Adresse brauchen wir jetzt
- Wir gehen wieder in die EP-Funktion (STRG+G -> 00641BD3 )
- Wir brauchen nun eine Anweisung mit 5 Bytes, die wir durch unseren Jump ersetzen können
Ich nehme:
00641CAE E8 B1500000 CALL 00646D64
WICHTIG!!!! "CALL 00646D64" aufsparen, das müssen wir danach natürlich ausführen
- Leertaste in der Zeile die ich hier grad gepostet hab (00641CAE)
- Den CALL durch JMP 0073E45A ersetzen (Die Adresse mit DB 00)
- Dem JMP durch einen Enter-Klick folgen
- Folgenden Code hinsetzen: (am besten Zeile für Zeile abschreiben)
CALL 00646D64
PUSHAD
PUSH 11111111
CALL DWORD PTR DS:[73F36C]
CMP EAX, 0
JE 00000000
POPAD
JMP 00641CB3
Erklärung:
CALL 00646D64 - Der vorherige überschriebene CALL, ohne den kanns abschmieren
PUSHAD - Speichert alle Register, wichtig!
PUSH 11111111 - Eine zufällige Adresse, die wird noch geändert!
CALL DWORD PTR DS:[73F36C] - Der CALL zur LoadLibraryA von vorhin
CMP EAX, 0 - Da der Rückgabewert NULL bei einem Fail ist, stürzt der Client ab falls die DLL nicht geladen werden konnte
(Siehe )
JE 00000000 - Lässt den Client abstürzen, falls die DLL nicht geladen wurde (JE = Jump if equal)
POPAD - ruft die von PUSHAD gespeicherten Register ab
JMP 00641CB3 - Der Sprung zurück (Einfach eine Zeile unter dem vorherigen platzierten JMP)
- Was geschieht nun mit PUSH 11111111? Natürlich wollen wir hier unseren DLL-Namen pushen
Dazu gehen wir zu 0073E47A (direkt unter JMP 00641CB3) und drücken STRG+E
Hier öffnet sich ein kleiner Dialog zur Byte-Editierung
Wir nehmen einfach unseren DLL-Namen (bei mir tut_dll.dll) und schreiben ihn in die oberste Edit-Box (bei ASCII) + drücken auf OK
- Die Adresse, wo der String beginnt (0073E47A) jetzt kopieren und
PUSH 11111111 durch
PUSH 0073E47Aersetzen
Neben dem PUSH sollte jetzt rechts "ASCII "tut_dll.dll"" erscheinen
Wenn ja -> alles passt!
- Als letztes noch die DLL ins Verzeichnis der EXE kopieren und die EXE aus Olly speichern.
Dazu einfach rechtsklick irgendwo ins Fenster -> Edit -> Select All -> Rechtsklick ins Fenster -> Edit -> Copy to Executable -> Rechtsklick in das neue Fenster -> Save File... -> Ich speicher es als metin2client_injector.exe ab
Olly aber noch nicht schließen, falls noch Fehler drin wären müsste man ansonsten von vorne beginnen!
Wenn alles richtig funktioniert hat, geht nun ein schönes kleines schwarzes Fenster auf
(Die RedirectIOToConsole-Funktion ist zwar aus Google, für DLLs zum Debugging aber unglaublich nützlich!)
Ich hoffe dass das hier einigermaßen verständlich war
Wenn nicht, einfach fragen
Padmak