ASM code in Byte Format?

03/18/2012 23:02 Crack-wtf#1
Hi Leute.

Ich nutze seit längerem den Debugger von CheatEngine, und vermisse eine Funktion.

Nämlich nach Befehlen zu suchen.

z.B. zu suchen wo "Call MeineAddresse" steht.

Jetzt wollte ich mir ein Tool Basteln, womit ich solche Befehle in Hex Umwandeln kann, um es dann mit CE Suchen zu können.

Nun stehe ich aber vor einem Problem.

Ich weis nicht, wie Addressen "portiert" werden.

z.B. ist "00470290" in Hex format "A9 C1 FF FF"

Hoffe jemand kann mir weiterhelfen.

EDIT:
"00000000" = "FB E6 DC FE"
"FFFFFFFF" = "FA E6 DC FE"

EDIT:
Die Funktion "Find Assembly Code" arbeitet zu langsam, also nicht darauf stützen.
03/19/2012 13:00 MrSm!th#2
Das sind Offsets die die Adresse relativ zur Instruction-Position beschreiben.

Du willst mir nicht ernsthaft erzählen, dass du deinen eigenen Assembler schreiben willst oder?! Wie unnötig..
03/19/2012 15:42 link#3
Wenn es dir nur um "call 0x11223344" geht, könntest du wie folgt vorgehen:

Du schreibst dir eine Funktion, die als Parameter den Anfang des Codes und die Länge entgegen nimmt. Dann überprüfst du das erste Byte des Codes auf 0xE8, um bei Übereinstimmung die nächsten vier Bytes auf die momentane Adresse + 5 zu addieren und sie dann mit deiner gesuchten Adresse vergleichen zu können. Wenn es sich nicht um 0xE8 handelt oder die Adresse nicht die gesuchte ist, rufst du einen Length Disassembler wie z.B. mlde32 mit der momentanen Adresse auf, der dir dann die Länge der Instruktion zurückgibt, sodass du diese überspringen kannst und an der nächsten landest, die du dann wieder auf 0xE8 überprüfst.

Bei statischer Analyse kannst du halt auch nur mit statischen Adressen arbeiten und sowas wie "call eax" oder "call [eax]" fällt dann natürlich direkt aus den Möglichkeiten..

"call [0x11223344]" könntest du noch mit einbeziehen, indem du das erste Byte auf 0xFF und das zweite auf 0x15 (disp32-addressing, reg=2) überprüfst, die nächsten vier Bytes dann als absolute Adresse nimmst, aus dieser dann die Adresse, die gecallt wird, und sie mit deiner vergleichst.
Solch ein Call könnte allerdings auch mit dem SIB-Byte kodiert werden, sodass du das zweite Byte auf 0x14 und das dritte noch auf 0x25 überprüfen müsstest und erst dann die Adresse als DWORD kommt. Ist aber eher ungewöhnlich, da der Befehl halt unnötigerweise ein Byte größer ist.

Du könntest aber auch OllyDbg und dann Strg + R (Find References) benutzen.
03/19/2012 15:53 MrSm!th#4
Quote:
Originally Posted by link View Post
Wenn es dir nur um "call 0x11223344" geht, könntest du wie folgt vorgehen:

Du schreibst dir eine Funktion, die als Parameter den Anfang des Codes und die Länge entgegen nimmt. Dann überprüfst du das erste Byte des Codes auf 0xE8, um bei Übereinstimmung die nächsten vier Bytes auf die momentane Adresse + 5 zu addieren und sie dann mit deiner gesuchten Adresse vergleichen zu können. Wenn es sich nicht um 0xE8 handelt oder die Adresse nicht die gesuchte ist, rufst du einen Length Disassembler wie z.B. mlde32 mit der momentanen Adresse auf, der dir dann die Länge der Instruktion zurückgibt, sodass du diese überspringen kannst und an der nächsten landest, die du dann wieder auf 0xE8 überprüfst.

Bei statischer Analyse kannst du halt auch nur mit statischen Adressen arbeiten und sowas wie "call eax" oder "call [eax]" fällt dann natürlich direkt aus den Möglichkeiten..

"call [0x11223344]" könntest du noch mit einbeziehen, indem du das erste Byte auf 0xFF und das zweite auf 0x15 (disp32-addressing, reg=2) überprüfst, die nächsten vier Bytes dann als absolute Adresse nimmst, aus dieser dann die Adresse, die gecallt wird, und sie mit deiner vergleichst.
Solch ein Call könnte allerdings auch mit dem SIB-Byte kodiert werden, sodass du das zweite Byte auf 0x14 und das dritte noch auf 0x25 überprüfen müsstest und erst dann die Adresse als DWORD kommt. Ist aber eher ungewöhnlich, da der Befehl halt unnötigerweise ein Byte größer ist.

Du könntest aber auch OllyDbg und dann Strg + R (Find References) benutzen.
Er will kein Tool zum Suchen schreiben bzw. eins haben, sondern ein Tool, das ihm die Call Instruction in Opcodes übersetzt, damit er die per CheatEngine suchen kann.
03/19/2012 16:02 link#5
Achso, um mit CE dann nach den Hex-Werten zu suchen.
Aber da ein Call ja relativ ist, wird das nicht möglich sein. Deswegen entweder ein eigenes Tool schreiben oder z.B. OllyDbg verwenden.
03/19/2012 17:10 MrSm!th#6
Quote:
Aber da ein Call ja relativ ist
Was ihm ja nicht bekannt war.

Ich find es ohnehin irgendwie unnötig, dafür extra ein eigenes Tool zu schreiben, gibt doch schon genug Tools wie Olly Plugins etc.
Ansonsten, wie du schon sagtest, wird eine eigene Dll notwendig sein, die den Speicher nach Calls zur Adresse durchsucht.
03/19/2012 18:10 Nightblizard#7
Falls du einen Assembler schreiben willst, ist der folgende Link Referenz Nr. 1 für dich:
[Only registered and activated users can see links. Click Here To Register...]

Sehr lesenswert, aber ziemlich harte Kost.
03/20/2012 22:09 Crack-wtf#8
Ok leute ich habs jetzt rausgefunden.
Pinki hat mir nen gedankenstoß gegeben.
Bei Jumps: Addy Des jumps - Addy zu der gejumpt wird -5. Und bei dem ergebnis alle bytes umdrehen.
Bei Mov: Addy die beschrieben wird einfach umdrehen. Und dahinter den wert auch umdrehen.
Bei Call: Ähnlich wie bei Jumps
03/20/2012 23:33 MrSm!th#9
Genau das haben wir dir schon beschrieben.