Patchare CALLL sostituendolo con NOP funziona nello spazio utente ma non nello spazio kernel

StackOverflow https://stackoverflow.com/questions/261021

Domanda

Ho un driver di dispositivo che voglio patchare. Questo driver di dispositivo chiama IOLog e desidero eliminare la registrazione.

Se sostituisco CALLL a IOLog con (il numero corrispondente di) NOP all'interno del driver del dispositivo (kext), il kernel si arresta in modo anomalo con quello che sembra uno stack smash (" Backtrace terminated-invalid frame pointer 0 ").

La stessa tecnica, tuttavia, funziona perfettamente nello spazio utente (ad esempio NOPping NSLogs all'interno di un binario OS X).

Cosa mi sto perdendo qui?

È stato utile?

Soluzione

Non hai spiegato se esegui patch a freddo (driver su disco) o hot patch (driver in memoria). Per il patching in memoria, potrebbero esistere tutti i tipi di problemi, come ad esempio il driver in esecuzione quando lo patch, le CPU che hanno parti del codice memorizzate nella cache, ecc. Vedere la sezione del manuale Intel sul codice automodificante.

Per le patch su disco, è possibile che si disponga di un record di trasferimento per l'indirizzo di destinazione. Quindi, quando viene caricato il driver, il caricatore del modulo dinamico risolverà l'indirizzo di IOLog nel codice, sostituendolo con l'indirizzo reale. Questo sovrascriverà le tue istruzioni nop.

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