2008-11-04 5 views
1

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?

Répondre

2

Vous n'avez pas expliqué si vous effectuez des correctifs à froid (pilote sur disque) ou des correctifs à chaud (pilote en mémoire). Pour les correctifs en mémoire, toutes sortes de problèmes peuvent exister, tels que l'exécution du pilote lorsque vous le patchez, le ou les processeurs ayant mis en cache des parties du code, etc. Reportez-vous à la section Intel sur le code auto-modifiable.

Pour les correctifs sur disque, il se peut que vous ayez un enregistrement de relocalisation pour l'adresse cible. Ainsi, lorsque le pilote est chargé, le chargeur de module dynamique corrige l'adresse de IOLog dans le code, en la remplaçant par l'adresse réelle. Cela écrasera vos instructions nop.

+0

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

+0

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. –

+0

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

Questions connexes