Autor Beitrag
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Sa 02.08.14 19:12 
Hallo,
ich suche informationen darüber, wie ich einen (x-86) jmp- Befehl in maschinencode übersetzen kann.
Der Debugger macht z.B. aus
ausblenden Quelltext
1:
jmp 065CE910					


folgenden Maschinencode an Adresse 567BD080:
ausblenden Quelltext
1:
E98B18E1AF					

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


Zuletzt bearbeitet von Boldar am Sa 02.08.14 23:06, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 02.08.14 20:50 
Siehe zum Beispiel hier:
www.mathemainzel.inf...s/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?

Für diesen Beitrag haben gedankt: Boldar
Boldar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: 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
ausblenden Quelltext
1:
567BD080    ---    jmp 065CE910					

wird im bytecode ein
ausblenden Quelltext
1:
E98B18E1AF					

Und das funktioniert auch. Aber wie erechne ich das?
Wie passt das 567BD080 in die 8B18E1AF ??
lg Boldar
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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

Für diesen Beitrag haben gedankt: Boldar
Boldar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: 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.