Entwickler-Ecke
Algorithmen, Optimierung und Assembler - jump in maschinencode
Boldar - Sa 02.08.14 19:12
Titel: jump in maschinencode
Hallo,
ich suche informationen darüber, wie ich einen (x-86) jmp- Befehl in maschinencode übersetzen kann.
Der Debugger macht z.B. aus
folgenden Maschinencode an Adresse
567BD080:
Das E9 ist wohl der jump - wie aber ist die Adresse codiert? Ist das relativ? Das müsste doch ein
far near jump sein, also absolut?
Ich habe dazu schon nach Infos gesucht, aber nicht sspezifisches gefunden.
lg Boldar
jaenicke - Sa 02.08.14 20:50
Siehe zum Beispiel hier:
http://www.mathemainzel.info/files/x86asmref.html#jmp
Mit E9 ist ein Sprung mit einem near pointer kodiert. Das ist der heutige normale Pointertyp bei einem Sprung. Far Pointer braucht man normalerweise nicht mehr.
Was im Disassembler zu sehen ist, ist die Adresse, die du links in der Liste der Adressen auch siehst. Diese wandelt der Debugger z.B. aus relativen Adressen usw. um. Zum Beispiel bei einem short jump (EB03, 3 Byte hinter diesen Befehl springen).
Was möchtest du denn erreichen? Kannst du keine Sprungmarken verwenden?
Boldar - Sa 02.08.14 23:18
Was ich erreichen möchte, ist folgendes: Ich möchte den maschinencode selber ermitteln. Ich tippe im Debugger das
jmp 065CE910 ein, und der trägt dafür an der entsprechenden Stelle die bytes
E98B18E1AF ein.
E9 codiert den sprung, soweit klar. Aber wie bestimme ich den Rest? Das Reference sheet was du mir gepostet hast, hatte ich schon gesehen, aber folgendes ist da komisch: Da steht für E9 länge von 3 bytes. Mein Befehl ist aber 5 bytes lang.
Ich möchte quasi eine funktion (in Delphi code später) bauen, der das sprungziel und die Quelladdresse gebe, und die mir die Maschinencode Bytes errechnet - So wie das der debugger auch macht, wenn ich da on the fly opcodes editiere.
Aus dem Assemblercode
Quelltext
1:
| 567BD080 --- jmp 065CE910 |
wird im bytecode ein
Und das funktioniert auch. Aber wie erechne ich das?
Wie passt das 567BD080 in die 8B18E1AF ??
lg Boldar
mandras - So 03.08.14 00:57
E9 kodiert für einen insgesamt 5 Byte langen Sprungbefehl (Opcode+4 Bytes Displace)
Basis für das Displace ist der Program Counter NACH dem Befehl.
Man beachte die LSB-Order bei Intel-Prozessoren. Das niederwertigste Byte kommt immer zuerst
Beispiel 1:
04001203 E908000000 JMP $+8 ; springt nach 04001210
04001208 .... irgendwas anderes
04001210 und hier geht es nach dem JMP oben weiter
Beispiel 2 - Rolle Rückwärts
04001202 90 NOP
04001203 E9FFFFFFFA JMP $-6 ; springt nach 04001202
Boldar - Di 05.08.14 11:48
Danke, ich habs jetzt endlich verstanden. Ich hatte vergessen, dass der Instruktion counter ja auch noch um die Länge des Jump-Befehls erhöht wird.
Wer neugierig ist: brauchen tue ich das ganze, um eine Funktion zu hooken, in einem Fall, wo die klassischen Methoden nicht funktionieren.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!