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