Grundlegende Frage zum Binärcode
-
Hallo,
ich habe mir zu Testzwecken folgendes Programm geschrieben:
;... .DATA szStr DB "Hallo",0 szStr2 DB "Caption",0 .CODE Start: push 64d push OFFSET szStr2 push OFFSET szStr push 0d call MessageBoxA push 0d call ExitProcess ret END Start
Nun habe ich es mit OllyDbg und Hex Workshop geöffnet. Mein Ziel war es, die Anwendung nachträglich so umzuschreiben, dass ein anderer Text angezeigt wird. Folgendermaßen wollte ich es realisieren (geht einfacher, aber zum lernen eben...):
push 60 im ein jmp + Adresse am Ende des Codes. Dort am Ende wollte ich dann ein neuen String "bauen" und dann per MessageBoxA aufrufen, also:...
JMP 0123
...
0122 - ...
0123 - push 0
0124 - push offset addresse des Strings
...
012n - call MessageBoxA
[Exit]Nun fielen mir ein paar seltsame Dinge auf: In Ollydbg wird z.B. "PUSH OFFSET test.szStr" (test = modul, szStr = definierter String) wie folgt übersetzt: 68 00409100. Doch im Hex Workshop lese ich "68 00 40 40 00". Warum ist das so, wird das zur Laufzeit etwa geändert?
Vielen Dank schon einmal, ich hoffe ich konnte mich verständlich ausdrücken!
-
Stichwort: base relocation
Der PE-loader ändert die OFFSETs beim laden: 0x404000 + 0x510000 = 0x914000
Mit der Linker-Option /FIXED sollte dieser Effekt verschwinden.
-
Aha, das erklärt einiges
Ne, möchte den Effekt ja nicht "beseitigen", sondern eher Umgehen...
Das heißt also:
Adresse während der Ausführung = Base Adresse + Offset in der Binary ?
-
Wenn deine EXE von Windows verschoben wird (=>ASLR), dann kann man diese Rechnung zumindest für absolute Offsets verwenden. Das macht aber, wie schon gesagt, der PE-loader für dich.
Image relocation wird erst seit Windows Vista unterstützt (für EXE’s) und soll bösen Jungs das Leben schwerer machen – du kannst getrost darauf verzichten (/FIXED)
-
Okay, hab mal geschaut was ASLR im Prinzip ist...
Aber wenn ich jetzt wie oben erwähnt, z.B. folgenden Befehl habe:push OFFSET szStr2 push OFFSET szStr
[OllyDbg]
Adresse - Bytes - Befehl
00F71002 - 68 0640F700 - PUSH OFFSET test.szStr2
00F71007 - 68 0040F700 - PUSH OFFSET test.szStr
[/OllyDbg][Hex Workshop]
6806404000
6800404000
[/Hex Workshop]Was müsste ich im Hex Workshop modifizieren, damit z.B. zweimal test.szStr geladen wird...?
Könnte es stimmen, dass:
68 0640F700 = Push-Opcode(68) + Offset(0640F700) ?
-
Gast4321 schrieb:
Was müsste ich im Hex Workshop modifizieren, damit z.B. zweimal test.szStr geladen wird...?
Könnte es stimmen, dass:
68 0640F700 = Push-Opcode(68) + Offset(0640F700) ?Die Adresse währen der Laufzeit hilft dir hier nicht:
[Hex Workshop]
6806404000 ==> 6800404000
6800404000 ==> 6800404000
[/Hex Workshop]
so würde zwei Mal der gleich Zeiger übergeben.
(die Basisadresse 0x404000 kann man im Übrigen aus dem PE Header entnehmen)Was erhoffst du dir den mit der Rumspielerei zu lernen? – Assembler bestimmt nicht!
-
Hm...was erhoffe ich mir mir zu lernen, gute Frage. Ich hab es nur zufällig entdeckt und bin neugierig geworden...
Okay soweit, aber angenommen ich möchte einen neuen String nachträglich in die Anwendung einbauen. Und bei der MessageBox möchte ich diesen dann ausgeben.
Kann ich dann für den Push-Befehl:68 + Adresse in der Binary, wo ich den String hingesetzt habe
verwenden, oder hab ich da einen Denkfehler?
-
Mit OllyDbg kann man das so machen - in der PE Datei, "von Hand", nur dann, wenn noch ein paar Bytes am Ende der code oder data section frei sind (für den String). Ansonsten muss man die PE zerlegen, modifizieren und anschließend neu aufbauen, was deine Fähigkeiten derzeit wohl weit Übersteigt – am besten du benutz OllyDbg, der dies kann.
-
Alles klar, danke.
Nein, ich wollte schon die Anwendung von Hand modifizieren, sprich ohne OllyDbg