PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu Injection



Rothir
15.02.2016, 08:19
Ich habe mir vor kurzem die Notepad.exe von Windows XP geschnappt und einmal in OllyDbg geladen.
Nun habe ich eine DLL nach System32 kopiert und registriert (mit dem Namen WinSystem.dll).

Gepatcht sieht mein Notepad nun so aus:
http://ibin.co/2X1pkcPUijaQ

Nach dem ausführen funktioniert alles zuerst einwandfrei. Bis ich meine Maschine dann neu starte, danach funktioniert die ganze exeDatei nicht mehr....
Kann es sein, dass sich die Adressen verändern, dann meine Frage wie ich die Adresse zur zB kernel32.dll ermitteln kann?

Ich habe auch schon Versucht die Adressen in "Names in Notepad (Strg + N)" zu verwenden und zu callen, allerding führte auch das nicht zur Lösung.

Schonmal vielen dank :)

4ctid
15.02.2016, 09:37
Soweit ich weiß sind die Adressen selten statisch. Die Basis Adresse einer dll kannst du zur Laufzeit per GetModuleHandle (https://msdn.microsoft.com/en-us/library/windows/desktop/ms683199(v=vs.85).aspx) ermitteln.

Rothir
15.02.2016, 11:10
Es schlägt jedoch schon beim kernel32.LoadLibraryA fehl. Die GetModuleHandle ist jedoch auch in dieser, also müsste ich diese dann doch auch nicht aufrufen können oder täusche ich mich da?
Steh grade komplett aufm Schlauch >.< könntest mir evtl. ein Beispiel geben? Die notepad.exe in original könnte ich auch kurz uppen falls gewünscht.

EDIT:

Also habs schon hingekriegt. Folgendes hat Abhilfe geschaffen:
- Strg+N -> Names in Notepad und die Offsets für LoadLibraryA und GetProcAddress raussuchen
- statt direkt call kernel32.Blah -> call dword [offset von Dialog davor]
Als Ergebnis schreibt OllyDbg: call dword ptr ds:[<&kernel32.funktion>] statt wie oben nur call kernel32.funktion

Wenn mir noch einer erklären könnte was genau da passiert? Ich schätze mal dass ich auf die imports in der Datei per Referenz verweise oder sehe ich das falsch?

gORDon_vdLg
15.02.2016, 17:05
Genau, du hast im oberen Post einen 5-Byte langen Call welcher relativ von der Adresse springt wo er im Speicher liegt. Also E8 für Call und in den anderen 4 Bytes die Distanz. Daruch dass du "call dword ptr[xzy]" benutzt wird zu der Adresse gesprungen welche an dem angegebenen Pointer steht, was in deinem Fall wie du richtig erkannt hast die Referenz aus der Importtabelle ist.
Vielleicht ist folgendes für dich interessant, das habe ich vor Jahren mal geschrieben, es wird mittels des PE Editors LordPE noch ein neuer Import hinzugefügt und benutzt: http://techcat.de/index.php?tutorials-1
Das Target ist sogar auch der Notepad.

PS: GetModuleHandle und LoadLibrary geben beide das Gleiche zurück, nur dass LoadLibrary die dll halt läd wenn sie noch nicht geladen war. Was ihm in diesem Fall halt eh nichts gebracht hätte weil er es immer noch relativ gecallt hätte.

Rothir
15.02.2016, 19:01
Okay perfekt! Danke :3 Das Tutorial ist für mich auch interessant ja ^^