2010-08-18 3 views
4

Sujet: Assemblée PPC Langue - Linux noyau Loadble ModuleComment hooker la table syscall à l'exécution sur Linux PPC?

Détail: Comment l'accès local TOC (r2) lorsqu'il est appelé à partir du noyau dans le crochet de syscall table?

J'ai écrit un module de noyau chargeable pour Linux qui utilise le hook de table syscall pour intercepter les appels système et consigner les informations les concernant avant de passer l'appel au gestionnaire d'origine. Cela fait partie d'un produit de sécurité. Mon module fonctionne bien et fonctionne en code de production sur une grande variété de versions de noyau Linux et de distributions avec des noyaux 32 et 64 bits fonctionnant tous sur du matériel x86. Je tente de porter ce code pour fonctionner sur Linux pour les processeurs PPC et a rencontré quelques problèmes. En utilisant la source du noyau Linux, il est assez facile de voir comment la table d'appel système est implémentée différemment sur PPC. Je peux remplacer les entrées dans la table avec des adresses de fonction de mes propres gestionnaires compilés, pas de problème.

Mais, voici le problème que je rencontre des problèmes. Le PPC ABI utilise cette chose appelée une table des matières (TOC) qui est stockée dans le registre R2 de la CPU et s'attend à adresser les données globales et locales d'un module en utilisant un décalage de l'adresse (adresse TOC) contenue dans ce registre. Cela fonctionne bien dans les cas normaux où un appel de fonction est fait parce que le compilateur sait charger l'adresse TOC du module dans le registre avant de faire l'appel (ou c'est déjà là parce que normalement vos fonctions sont appelées par votre propre code). Cependant, lorsque je place l'adresse de ma propre fonction (de mon module noyau chargé à l'exécution) dans la table d'appels système, le noyau appelle mon gestionnaire avec une valeur R2 qui n'est pas celle attendue par mon code C compilé, donc mon code obtient le contrôle sans pouvoir accéder à ses données.

Est-ce que quelqu'un sait d'un exemple de code là-bas montrant comment gérer cette situation? Je ne peux pas recompiler le noyau. Cela devrait être un cas simple de hooking de table syscall runtime, mais je n'ai pas encore trouvé, ou trouver des exemples spécifiques à PPC.

idées:

main codant pour un talon de langage d'assemblage qui permet d'économiser la valeur R2, charge le registre avec mon adresse locale TOC, exécute mon code, restaure la valeur ancienne avant d'appeler le gestionnaire d'origine. Je n'ai pas la profondeur de l'expérience d'assemblage PPC pour le faire, et je ne suis pas sûr que cela fonctionnerait.

Une option gcc magique qui va générer mon code sans utiliser TOC. Il existe une option gcc documentée "-mno-toc" qui ne fonctionne pas sur mon PPC6 Linux. Il semble que ce ne soit qu'une option pour le système V.4 et le PowerPC embarqué.

Toute aide est grandement appréciée!

Merci!

+0

Je crains de ne pas avoir de suggestion pour la solution, mais vous savez que les devs du noyau rendent la modification de la table syscall difficile? Ce n'est pas quelque chose qu'ils veulent supporter avec une API interne. – stsquad

Répondre

0

Vous avez besoin d'un talon pour charger r2. Il y a des exemples dans la source du noyau.

1

Linux possède une infrastructure d'audit syscall générique qui fonctionne sur powerpc et vous pouvez accéder à partir de l'espace utilisateur. Avez-vous envisagé d'utiliser cela plutôt que d'écrire un module noyau?

Questions connexes