Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Assembler zu Hexadezimal
LittleBen - So 28.08.11 18:16
Titel: Assembler zu Hexadezimal
Hallo,
habe mich gerade gefragt, wie JMP 00402CCC zu E9 AC8CFFFF wird. Was wird dort gerechnet?
Brauche das, um zu wissen, was jmp 000093B0 als Hexadezimal ist.
Vielen Dank & Grüße,
Benny
Tankard - So 28.08.11 19:15
e9 ist der opcode für einen relativen sprung. es werden die bytes gezaehlt um wieviele stellen gesprungen wird. (zweier complement).
LittleBen - So 28.08.11 19:21
Achso ist das. Aber was würde dann jmp 000093B0 ergeben?
Tankard - So 28.08.11 19:25
das kommt drauf an wo der befehl steht. nur als beispiel und nicht richtig wegen der befehlslaenge
zb. da jetzt 3 bytes uebersprungen werden. (kommt noch drauf an wie der ip (instruction pointer) aussieht
muesste ich auch wieder nachlesen, da ich schon lange nichts mehr in assembler mache. bzw der assembler das eh selber errechnet.
0000 jmp 0006 e9 03 00
0002 jmp 0006 e9 00 00
0006 nop
genaue erklärung findest du hier:
http://de.wikibooks.org/wiki/Assembler_%2880x86_Prozessor%29-Programmierung:_Spr%C3%BCnge_und_Schleifen
LittleBen - So 28.08.11 19:33
Jetzt verstehe ichs! Vielen Dank!
uall@ogc - Di 30.08.11 00:06
so ein Jump ist relativ
dieser berechnet sich aus:
ZuAdresse - VonAktuelle -5
wenn du von
0x00500029 zu 0x00500020 springen willst wär dass ein 0x00500029-0x00500020-5 = -14 bzw. "-0xD" = 0xFFFFFFF2
diese muessen jeweils Byteweise vertauscht werden -> Little-endian
man muesste jetzt an die adresse 0x00500029 die Werte E9 F2 FF FF FF schreiben
in delphi waere das:
Delphi-Quelltext
1: 2: 3: 4: 5:
| FromAddr := Pointer($00500029) ToAddr := Pointer($00500020)
PByte(FromAddr)^ := $E9 PInteger(Integer(FromAddr)+1)^ := Integer(ToAddr)-Integer(FromAddr)-5 |
um es einfacher zu machen: du kannst auch ein absoluten jump durch PUSH <ADDR> RET machen
schau einfach mal aufhttp://uall.cheat-project.com/uallCollection/ und dort auf HookCode
Um deine Frage zu beantworten: ohne deine startadresse zukennen kann dir das niemand sagen, soll der wert relativ sein dann musst du E9 B0 93 00 00 schreiben
LittleBen - Di 30.08.11 13:12
Okay, dann könnte man das ja auch umdrehen: ZuAdresse = BinäreAdresse + (VonAdresse -5)
Stimmt das?
uall@ogc - Do 01.09.11 19:58
Was verstehst du unter binäradresse?
Wenn du die Adresse im speicher hast wo der jump steht, kannst du die Adresse ausrechnen zu der gesprungen wird. Nichts anderes amcht auch der Prozessor.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| 0x00500000 E9 08 00 00 00 -> JMP+8 0x00500005 90 -> +0 0x00500006 90 -> +1 0x00500007 90 -> +2 0x00500008 90 -> +3 0x00500009 90 -> +4 0x0050000A 90 -> +5 0x0050000B 90 -> +6 0x0050000C 90 -> +7 0x0050000D 90 -> +8 <- hier wird hingesprungen 0x0050000E 90 0x0050000F 90 |
bzw in deinem Beispiel:
JMP 00402CCC
IRGENDWO: E9 AC8CFFFF
->
00402CCC = IRGENDWO + BigEndian(Integer(AC8CFFFF)) -5
->
00402CCC = IRGENDWO + Integer(FFFF8CAC) -5
->
00402CCC = IRGENDWO - 00007354 -5
->
IRGENDWO = 00402CCC + 00007354 + 5
->
IRGENDWO = 0040A025
d.h. deine folge E9 AC8CFFFF müsste an der adresse 0040A025 gestanden haben
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!