2009-04-24 7 views
6

Nehmen wir an, ich habe die Adresse zugewiesen, wo mein Codecave platziert VirtualAllocEx (es gibt die Adresse zurück) und ich schreibe meinen Code in diese Adresse mit WriteProcessMemory().C# Theoretisch: Schreibe einen JMP in einen Codecave in asm

Hier ist die Frage:

Wie schreibe ich einen Sprung zu meinem codecave? Ich weiß, dass Sprünge mit "E9" beginnen, aber wie konvertiere ich die Adresse, die von VirtualAllocEx zurückgegeben wird, in ein korrektes UInt32 (dword), damit der Debugger/Compiler den Befehl versteht?

Zum Beispiel:

ich an der Adresse bin 00402020 (OEP der nativen App). Ich schreibe einen Sprung zu 004028CF (leere Stelle) "JMP 004028CF". Die Anweisung in Bytes wie folgt aussieht:

CPU Disasm 
Address Hex dump  Command         Comments 
00402020 E9 AA080000 JMP 004028CF 

"E9" ist, wie wir eine JMP zeigen. Was ist mit "AA080000", wie erzeuge ich das?

Ich muss etwas Ähnliches tun, damit ich einen JMP zu meinem Codecave initialisieren kann, der an einer von VirtualAllocEx() zurückgegebenen Adresse gefunden wird.

Jede Hilfe wird dankbar geschätzt!

Vielen Dank im Voraus.

+3

Was ist die C# Bit auf diese Frage? – Steven

Antwort

4

E9 ist ein relativer Sprung, daher sind die späteren 32 Bits nur ein Offset zum aktuellen Befehlszeiger. Details siehe Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M Seiten 549ff. Weitere Informationen finden Sie unter Intel® 64 and IA-32 Architectures Software Developer's Manuals.

Also der Opcode, um von 00402020 zu 004028CF zu springen, sollte der folgende sein.

 
    E9 00 00 08 AA 
Offset = DestinationAddress - CurrentInstructionPointer 
000008AA = 004028CF   - 00402025 

Wenn der Sprungbefehl ausgeführt wird, wird der Befehlszeiger bereits auf den nächsten Befehl eingestellt. So ist der Versatz des Sprungbefehls und der aktuelle Befehlszeigerwert unterscheiden sich durch 5.

CurrentInstructionPointer = AddressOfJumpInstruction + 5 

UPDATE

Korrigierter-Fehler über den aktuellen Befehlszeiger Wert. Danke jn.

+1

Ich frage, wie man "004028CF" in "AA080000" umwandelt, wie wandle ich die Zieladresse in diese 32 Bits um, damit die Instrulation gültig wird? –

+0

Sie könnten mir gesagt haben "Zieladresse - (minus) aktuelle Adresse" anstatt mir, dass PDF von 600 Seiten.Wie auch immer, wie ich bereits erwähnt, ich schätze jede Ihrer Bemühungen, also akzeptiere ich Ihre Antwort. Danke! –

+0

@Daniel: was du hier sagst, ist falsch!Die richtige Formel für diesen Fall ist: to - from - 5 – newgre

1

die relative subtrahieren versetzt zu bekommen nur die Adressen:

uint32_t patch_address = (uint32_t) VirtualAlloc(...); 
uint32_t jmp_offset = patch_address - (current_offset + current_len); 

Anmerkung: current_len ist 5 Byte auf x86-E9 JMP-Befehl. siehe meinen Beitrag auf diesem Thread für weitere Informationen:

VirtualAlloc C++ , injected dll, asm

Verwandte Themen