2009-04-24 16 views
6

Supponiamo di aver assegnato l'indirizzo in cui è stato inserito il mio codecave utilizzando VirtualAllocEx (restituisce l'indirizzo) e scrivo il mio codice in quell'indirizzo utilizzando WriteProcessMemory().C# Teorico: scrivere un JMP su una codecave in asm

ecco la domanda:

Come faccio a scrivere un salto al mio CodeCave? So che i salti iniziano con "E9", ma come faccio a convertire l'indirizzo restituito da VirtualAllocEx in un UInt32 corretto (dword) in modo che il debugger/compilatore capirà l'istruzione?

Ad esempio:

Sono all'indirizzo 00402020 (OEP dell'app nativa). Scrivo un salto a 004028CF (luogo vuoto) "JMP 004028CF". L'istruzione in byte si presenta così:

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

"E9" è come indichiamo un JMP. Che dire di "AA080000", come posso generare questo?

Ho bisogno di fare qualcosa di simile, così posso inizializzare un JMP con il mio codecave, che sarà localizzato all'indirizzo restituito da VirtualAllocEx().

Qualsiasi aiuto sarà apprezzato con gratitudine!

Grazie in anticipo.

+3

Qual è il C# po 'a questa domanda? – Steven

risposta

4

E9 è un salto relativo in modo che i successivi 32 bit siano solo un offset rispetto all'attuale puntatore di istruzioni. Vedi Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M pagine 549ff per i dettagli. Per ulteriori informazioni, vedere Intel® 64 and IA-32 Architectures Software Developer's Manuals.

Quindi l'opcode da saltare da 00402020 a 004028CF dovrebbe essere il seguente.

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

Quando viene eseguita l'istruzione di salto, il puntatore all'istruzione è già impostato per l'istruzione successiva. Così l'offset della istruzione di salto e l'attuale valore del puntatore di istruzioni differiscono da 5.

CurrentInstructionPointer = AddressOfJumpInstruction + 5 

UPDATE

Corretto errore circa il valore puntatore all'istruzione corrente. Grazie.

+1

Sto chiedendo come convertire "004028CF" in "AA080000", Come posso convertire l'indirizzo di destinazione in quei 32 bit in modo che l'istruzione diventi valida? –

+0

Avresti potuto dirmi "Indirizzo di destinazione - (meno) indirizzo corrente" invece di darmi quel pdf di 600 pagine. Tuttavia, come già accennato, apprezzo tutti i tuoi sforzi, quindi accetto la tua risposta. Grazie! –

+0

@Daniel: quello che stai dicendo qui è sbagliato!La formula corretta per questo caso è: a - da - 5 – newgre

1

per ottenere l'offset basta sottrarre gli indirizzi relativi:

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

nota: current_len è di 5 byte su istruzioni x86 E9 JMP. vedi il mio post su questo thread per maggiori informazioni:

VirtualAlloc C++ , injected dll, asm