Ändern der Dateiberechtigungen im Kernel

8

Ich schreibe Kernel-Modul (C in Linux) und ich möchte die Berechtigung der anderen Dateien darin ändern. irgendeine Lösungsmöglichkeit? seit ich im Kernel bin, kann ich chmod syscall nicht benutzen und ... Danke für deine Hilfe

Das ist mein Makefile:

%Vor%

Und das ist mein Code:

%Vor%

Beim Erstellen gibt es eine Warnung:

  

WARNING: "sys_chmod" [file] undefiened

und beim Laden des Moduls mit "sudo insmod" gibt es diesen Fehler:

  

Unknown sybol in module

Es scheint, dass dieser Fehler besonders in Kernel-Modulen auftritt. irgendeine Idee? Nochmals vielen Dank!

    
Mehrdad 28.08.2009, 17:24
quelle

2 Antworten

3

Die Systemaufrufe sind keine exportierten Symbole. Sie müssen ein bisschen hacken, wenn Sie sie wollen.

Sie möchten Ihre Finger auf sys_call_table setzen. Es enthält einen Zeiger auf jeden Systemaufruf. Betrachten Sie arch/x86/kernel/syscall_table_32.S oder arch/i386/kernel/entry.S für ältere Kernel.

Sie können grep sys_call_table /usr/src/linux/System.map (oder /proc/kallsyms , wenn die Symbole exportiert werden), um die Basisadresse dieser Tabelle zu finden. Sie können diese Adresse als Parameter für Ihr Modul haben (das Konvertieren einer Hex-Zeichenfolge in einen Zeiger wird benötigt).

Sie können den richtigen syscall mit dem in arch/x86/include/asm/unistd_32.h (oder include/asm-i386/unistd.h für ältere Kernel) definierten Offset aufrufen. Sie erhalten etwas wie: #define __NR_chmod 15

Makros sind hilfreich:

%Vor%

Vergessen Sie außerdem nicht, das Datensegment zu ändern, wenn Sie den Kernel-Puffer (für den Dateinamen für Beispiele) übergeben, der Benutzerpuffer sein soll:

%Vor%     
Nicolas Viennot 30.08.2009, 07:34
quelle
5

Willkommen bei stackoverflow! IIRC Sie möchten sys_chmod()

  

Aus der Linux-Kernel-Mailing-Liste

     

Am Donnerstag, den 20. Februar 2003 um 11:10:27 Uhr +0100 schrieb Andrea Arcangeli:   Am 20. Februar 2003 um 12:40:43 Uhr -0500 schrieb Jeff Garzik:

     
    

Am Donnerstag, den 20. Februar 2003 um 11:04:37 Uhr +0530 schrieb Prasad:

         
      

Gibt es einen Weg, mit dem ich einen Systemaufruf im Kernel aufrufen könnte       Raum? Der Syscall soll als anderer Prozess getarnt ausgeführt werden. Das tatsächliche

    
         

Rufen Sie sys_whatever () auf. Sehen Sie sich den Kernel-Code für Beispiele an.

         

Der Kernel tut dies bereits in     verschiedene Orte. sys_read, sys_write,     open_filp, sys_close und andere     Funktionen können vom Kernel aus sicher aufgerufen werden     Code - obwohl dies nicht erwünscht ist.     init / do_mounts.c ist ein besonders     ärgerlicher Fall, und ist ein großer Grund, warum     klibc muss zusammengeführt werden. syscalls     sollte aus dem Userspace gemacht werden, nicht aus dem     Kernel.

  

Die Leute fangen an, sich Sorgen zu machen, da dies nicht die Art von Sache ist, die Sie im Kernel tun könnten (es sei denn, Sie benutzen Sie, Sie wissen, was Sie tun). Wenn Sie nur die Berechtigungen für ein bestimmtes Ereignis ändern möchten, tun Sie dies über den Benutzerbereich mit inotify oder ähnlichem.

Haftungsausschluss beiseite:

Hier ist ein Code, den ich in einem anderen Kernelmodul gefunden habe, das die Aufrufe sys_ * verwendet:

%Vor%

Auch gefunden:

%Vor%

in include/linux/syscalls.h

Wohlgemerkt, es ist eine Weile her, seit ich irgendwelche Kernel-Sachen gemacht habe. Überprüfen Sie , dass dies die geeignete Schnittstelle für chmod-Kram ist und dass Sie keinen anderen Aufruf abkürzen, der beispielsweise Sicherheitshaken implementiert.

Auch Dieser Link enthält Informationen zu syscalls und deren Symbolen. Auch Hier ist eine Kurzreferenz von User-Space-API-Systemaufrufen und wo sie im Kernel implementiert sind.

    
Aiden Bell 28.08.2009 23:27
quelle