Linux-Kernel: Beispiel für das Hooking von Systemaufrufen

Ich versuche, einen einfachen Testcode zu schreiben, um das Verknüpfen der Systemaufruftabelle zu demonstrieren.

"sys_call_table" wird in 2.6 nicht mehr exportiert, daher greife ich nur nach der Adresse aus der Datei "System.map" und sehe, dass sie korrekt ist Systemaufrufe).

Wenn ich jedoch versuche, diese Tabelle zu ändern, gibt der Kernel ein "Ups" mit "Kernel-Paging-Anforderung unter der virtuellen Adresse c061e4f4 kann nicht verarbeitet werden" aus und der Computer wird neu gestartet.

Dies ist CentOS 5.4, auf dem 2.6.18-164.10.1.el5 ausgeführt wird. Gibt es irgendeinen Schutz oder habe ich nur einen Fehler? Ich weiß, dass es mit SELinux geliefert wird, und ich habe versucht, es in den zulässigen Modus zu versetzen, aber es macht keinen Unterschied

Hier ist mein 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;
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage