SysCalls



  • joboyy schrieb:

    @devkid
    Habe das aktuelle Ubuntu 9.04 kernel version
    2.6.28.11-generic

    Ich auch, und da funktioniert es bei mir auch nicht. Ich hab jetzt leider keinen andere Distro/Kernel installiert zum Testen.

    joboyy schrieb:

    das modul sollte eigentlich für sämtliche 2.6.x kernel funktionieren.

    Naja, source-kompatibel würde es bleiben, der Kernel müsste nur speziell konfiguriert sein...



  • joboyy schrieb:

    @tippgeber.

    Das ist kompletter Schwachsinn, sry:

    1. Hatte ich das selbe Script wie du, nur selber programmiert und leicht abgeändert. => Gibt genau die selbe Adresse zur SysCallTable aus

    2. /proc/kallsyms wird bei jedem reboot neu geschrieben und dort werden sämtliche symbole ausgelagert, damit auch die sys_call_adresse.

    Stimmt. Versuch mal bevor du auf die sys_call_table schreibst ihr die Schreibberechtigung zu geben, scheinbar ist die Seite ab 2.6.24 read-only.
    Das geht mit "set_memory_rw( sctable, 1);", diese Funktion ist in arch/x86/mm/pageattr.c zu finden.



  • @tippgeber
    Danke, ich dachte schon an eine WriteProtection.
    Werde mir das jetzt mal genauer ansehen und die Ergebnisse hier posten 🙂

    Grüße



  • /home/si/Desktop/kernel/hello11.c:51: Fehler: Implizite Deklaration der Funktion »set_memory_rw«

    ...
    Er scheint die Funktion nicht zu kennen. Die Includes sind:

    #include <linux/string.h>
    #include <linux/smp_lock.h>
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/file.h>
    #include <linux/fs.h>
    #include <linux/sched.h>
    #include <linux/syscalls.h>
    #include <linux/time.h>
    #include <asm/unistd.h>
    #include <linux/version.h>
    #include <linux/errno.h>
    #include <linux/dcache.h>
    #include <linux/mm.h>
    #include <asm/uaccess.h>
    #include <asm/string.h>
    #define __KERNEL_SYSCALLS__
    #include <linux/dirent.h>
    #include <linux/fcntl.h>
    


  • Du musst halt die Funktionsdeklaration angeben: int set_memory_rw(unsigned long addr, int numpages);

    Aber du kannst dir die Mühe sparen, denn es funktioniert nicht, habe es eben getestet.

    Wenn du einfach nur auf deinem lokalen System das machen willst, dann kannst du auch ganz einfach im Kernel Sourcecode die Schreibberechtigung hinzufügen. Dummerweise finde ich gerade die entsprechende Datei nicht mehr 😞



  • Es muss doch ne Möglichkeit geben auf die syscalls schreiben zu können?



  • jojoboyj schrieb:

    Es muss doch ne Möglichkeit geben auf die syscalls schreiben zu können?

    Wenn es so einfach wäre, dann wäre die Sicherheit des Kernels enorm reduziert. Wenn du auf die Erstellung als Modul verzichten würdest wäre es auch gar kein Ding, dann hättest du ganz legitim Zugriff darauf, oder wenn du die Seite der sys_call_table beschreibbar machst. Aber in jedem Fall musst du den Kernel selbst patchen. Was für deine Übungszwecke doch in Ordnung sein sollte, oder nicht :)?



  • Wie schon oben erwähnt sollte es für jeden 2.6.x Kernel funktionieren.
    Und ich kann nicht anfangen auf privat System bzw. manchmal produktiv System immer erst den Kernel zu patchen. Das sollte eigentlich übers Modul laufen...



  • jojoboyj schrieb:

    Wie schon oben erwähnt sollte es für jeden 2.6.x Kernel funktionieren.
    Und ich kann nicht anfangen auf privat System bzw. manchmal produktiv System immer erst den Kernel zu patchen. Das sollte eigentlich übers Modul laufen...

    Auf Produktivsystemen musst du aber auch davon ausgehen, dass dort entsprechend geschützte Kernel laufen die Checksummen der sys_call_table anlegen und regelmäßig überprüfen (siehe das von mir verlinkte Paper). Und wie du siehst ändert sich hier ständig etwas, so sind verfahren aus dem 2.6.24er Kernel schon jetzt nicht mehr anwendbar.



  • Also gibt es im Moment wirklich keine Möglichkeit?



  • Ist jetzt schon dein dritter Thread zum Thema. Akzeptier halt mal wie's ist 😉


Anmelden zum Antworten