C'è un modo per aggiungere una chiamata di sistema dinamica, ad esempio attraverso un modulo? Ho trovato dei punti in cui è possibile ignorare una chiamata di sistema esistente con un modulo semplicemente modificando l'array sys_call_table[]
per ottenere la funzione sostituita anziché quella nativa quando il modulo è installato, ma è possibile farlo con una nuova chiamata di sistema e un modulo?kernel Linux: aggiungi la chiamata di sistema in modo dinamico tramite il modulo
risposta
Intercettare la chiamata di sistema esistente (per fare qualcosa nel kernel) non è il modo giusto in alcuni casi. Ad esempio, se i tuoi driver userspace devono eseguire qualcosa nel kernel, inviare qualcosa lì o leggere qualcosa dal kernel?
Solitamente per i driver, il modo corretto è utilizzare la chiamata ioctl(), che è solo una chiamata di sistema, ma può chiamare diverse funzioni del kernel o moduli driver, passando diversi parametri tramite ioctl().
Quanto sopra è per l'esecuzione del codice del kernel controllato dall'utente.
Per il passaggio dei dati, è possibile utilizzare procfs oi driver sysfs per comunicare con il kernel.
PS: quando si intercetta la chiamata di sistema, che generalmente influisce sull'intero sistema operativo, ci si deve preoccupare di come risolvere il problema di farlo in modo sicuro: cosa succede se qualcun altro sta chiamando a metà la chiamata di sistema e quindi si modifica/intercettare i codici?
Zach, sì è possibile: D
Sebbene sys_call_table è di dimensione fissa, in alcuni casi possono essere posizioni libere nella tabella
Consultate questo link:
lxr.free elettroni. com/source/arch/x86/kernel/syscall_32.c
lxr.free-electrons.com/source/arch/x86/kernel/syscall_64.c
Innanzitutto il kernel riempie tutte le posizioni di sys_call_table con un puntatore a sys_ni_syscall
in fase di compilazione, i file asm/syscalls_32.h e asm/syscalls_64.h sono generato in base alle seguenti tabelle:
lxr.free -electrons.com/source/arch/x86/syscalls/syscall_32.tbl
lxr.free-electrons.com/source/arch/x86/syscalls/syscall_64.tbl
Con un breve sguardo a questi tavoli y Si potrebbe vedere che alcune posizioni continueranno a puntando a sys_ni_syscall, ad esempio, posizioni 17, 31, 32, 35, ..., in syscall_32.tbl poiché non sono implementate.
Pertanto, il nostro unico compito è identificare queste posizioni e "registrare" il nostro nuovo syscall.
ho messo qualcosa di simile sul mio git
https://github.com/MrN0body/rsysadd
Ho sempre pensato che l'aggiunta di chiamate di sistema è stato un nono, ma questo è solo per sentito dire. – jdizzle
Sì, l'aggiunta di chiamate di sistema è praticamente inutile per un rootkit :) –
L'aggiunta di un syscall non è sicuramente supportata. È probabile che tu voglia una nuova soluzione al tuo problema. Perché senti di aver bisogno di un nuovo syscall? – stsquad