Domanda

E 'possibile utilizzare strumenti GNU (gcc, binutils, ecc) per modificare tutte le occorrenze di un'istruzioni di montaggio in una no-op? Specificamente, gcc con l'opzione -pg genera la seguente montaggio (ARM):

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: ebfffffe    bl  0 <mcount>

Voglio registrare l'indirizzo di questo ultima istruzione, e quindi modificare in un nop come nel seguente codice

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: e1a00000    nop         (mov r0,r0)

Il kernel Linux può fare qualcosa di simile a questo a run-time, ma sto cercando una soluzione accumulo di tempo.

È stato utile?

Soluzione

Questo sarà certamente più facile con un formato di istruzioni a lunghezza fissa RISC-ish che per esempio X 86.

Si dovrebbe essere relativamente semplice da usare libelf (bel tutorial qui: http : //people.freebsd.org/~jkoshy/download/libelf/article.html ) o libbfd ( http://sourceware.org/binutils/docs-2.19/bfd/index.html ) per aprire il file oggetto, modificare le istruzioni all'interno della sezione .text, e scrivere di nuovo utilizzando API fornite. Che si tratti di vale la pena o meno dipenderà da considerazioni di carattere non tecnico (io sono un po 'curioso però ...).

E 'la pena ricordare che ci potrebbe essere qualche ruga con l'utilizzo di libelf o libbfd se questo ha bisogno di lavorare in un ambiente cross-sviluppo.

Altri suggerimenti

È possibile compilare il codice con gcc -S ad emettere un listato assembler, invece di compilare completamente in un file oggetto o eseguibile. Poi, basta sostituire le istruzioni desiderati con no-ops (ad esempio utilizzando sed), e continuare la compilazione da lì.

Se anche voi volete fare questo per i file oggetto o librerie che non si ha il codice sorgente originale per, avrete invece devono utilizzare uno strumento come objdump(1) di smontare loro e ottenere gli indirizzi delle istruzioni che si desidera sostituire. Poi, analizzare le intestazioni dei file oggetto per trovare gli offset all'interno del file di tali istruzioni, e quindi sostituire le istruzioni macchina senza-ops direttamente nei file oggetto. Questo è un po 'più complicato, ma fattibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top