Corriger CALLL en remplaçant par NOP fonctionne dans l’espace utilisateur mais pas dans l’espace noyau

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

Question

Je souhaite patcher un pilote de périphérique. Ce pilote de périphérique appelle IOLog et je souhaite supprimer la journalisation.

Si je remplace le CALLL vers IOLog par (le nombre correspondant de) NOP dans le pilote de périphérique (kext), le noyau se bloque avec ce qui ressemble à une pile fracassée ("Pointeur de trame 0 (backtrace terminé-invalide)").

Cependant, la même technique fonctionne bien dans l'espace utilisateur (par exemple, NOPping NSLogs dans un binaire OS X).

Qu'est-ce qui me manque ici?

Était-ce utile?

La solution

Vous n'avez pas expliqué si vous utilisiez des correctifs à froid (pilote sur disque) ou à chaud (pilote en mémoire). Pour les correctifs en mémoire, toutes sortes de problèmes peuvent exister, tels que le pilote en cours d'exécution lorsque vous corrigez le correctif, le ou les processeurs ayant mis en cache des parties du code, etc. Consultez la section du manuel d'Intel sur le code à modification automatique. / p>

Pour appliquer un correctif sur le disque, il se peut que vous ayez un enregistrement de déplacement pour l'adresse cible. Ainsi, lorsque le pilote est chargé, le chargeur de module dynamique corrigera l’adresse de IOLog dans le code, en la remplaçant par la véritable adresse. Cela écrasera vos instructions nop.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top