Cercando di no-op un'istruzione
-
16-09-2019 - |
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.
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.