J'ai un pilote de périphérique que je veux patcher. Ce pilote de périphérique appelle IOLog et je souhaite me débarrasser de la journalisation. Si je remplace le CALLL à IOLog avec (le nombre correspondant de) NOPs dans le pilote de périphérique (kext), le noyau se bloque avec ce qui ressemble à une pile brisée ("Backtrace terminated-invalid frame pointer 0").Patcher hors CALLL en remplaçant par NOPs fonctionne dans l'espace utilisateur mais pas dans l'espace noyau
Cependant, la même technique fonctionne très bien dans l'espace utilisateur (par exemple NOPping NSLogs dans un binaire OS X).
Qu'est-ce qui me manque ici?
Je fais des correctifs sur disque. Si mes NOP étaient remplacés par un effet de relocalisation, le pilote ne fonctionnerait-il pas comme avant le correctif? La relocalisation pourrait jouer un rôle en effet, mais je dois encore comprendre comment cela fonctionne. otool répertorie 390 entrées de relocalisation dans l'image mach du pilote. – diciu
La relocalisation fonctionne en remplaçant les octets de l'instruction par l'adresse cible. Donc, si l'appel est E8 xx xx xx xx, alors il écrase les xxs. Si vous remplacez E8 et tous les xx avec des nops, il quitte le premier nop, et écrase les autres avec la cible, ces octets deviennent alors des instructions. –
Ok, ça a du sens. Et cela explique pourquoi quand j'ai utilisé GDB pour regarder le pilote de périphérique, j'ai vu l'appel 0x0 tandis qu'un débogueur capable de symboles affichait l'appel _IOLog. Le débogueur capable de symboles doit avoir regardé la table de relocalisation. Merci pour les pointeurs, je vais continuer à creuser. – diciu