Noyau Linux: Système d'appel d'accrochage exemple

Je suis en train d'écrire un simple code de test comme une démonstration de l'accrochage de la table des appels systèmes.

"sys_call_table" n'est plus exporté dans le noyau 2.6, je suis juste en saisissant l'adresse du Système.fichier de la carte, et je peux voir qu'il est correct (à la Recherche par le biais de la mémoire à l'adresse que j'ai trouvé, je peux voir les pointeurs pour les appels système).

Cependant, lorsque j'essaie de modifier ce tableau, le noyau donne un "Oups" avec "incapables de gérer le noyau de pagination demande à l'adresse virtuelle c061e4f4" et la machine redémarre.

C'est CentOS 5.4 exécution de la version 2.6.18-164.10.1.el5. Est-il une sorte de protection ou dois-je juste avoir un bug? Je sais qu'il vient avec SELinux, et j'ai essayé de le mettre en mode permissif, mais il ne fait pas une différence

Voici mon code:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/unistd.h>

void **sys_call_table;

asmlinkage int (*original_call) (const char*, int, int);

asmlinkage int our_sys_open(const char* file, int flags, int mode)
{
   printk("A file was opened\n");
   return original_call(file, flags, mode);
}

int init_module()
{
    //sys_call_table address in System.map
    sys_call_table = (void*)0xc061e4e0;
    original_call = sys_call_table[__NR_open];

    //Hook: Crashes here
    sys_call_table[__NR_open] = our_sys_open;
}

void cleanup_module()
{
   //Restore the original call
   sys_call_table[__NR_open] = original_call;
}
Avez-vous expérimenté avec LD_PRELOAD ou ptrace? Ne sont-ils pas répondre à ce que vous essayez de faire?
Pas vraiment, le but de l'exercice est de charger un module noyau qui va accrocher un système d'appel pour l'ensemble du système. Il n'importe pas vraiment ce qu'il fait à ce point.
Veuillez noter que, pour les fins de l'enseignement, il pourrait être OK pour examiner cette question, mais il a, à la fois techniques et des problèmes de licences. Ne pas l'utiliser dans le monde réel!
ce pourrait être le cas d'utilisation de ce code? Puis-je brancher tout appel système linux de cette façon?
quoi? Soins pour étoffer un peu?

OriginalL'auteur Stephen | 2010-01-20