2010-03-07 15 views
15

¿Hay alguna manera de agregar una dinámica de llamada al sistema, como a través de un módulo? He encontrado lugares donde puedo anular una llamada al sistema existente con un módulo simplemente cambiando la matriz sys_call_table[] para obtener mi función reemplazada en lugar de la nativa cuando mi módulo está instalado, pero ¿puedes hacer esto con una nueva llamada al sistema y un módulo?kernel de Linux: agregue la llamada al sistema de forma dinámica a través del módulo

+0

siempre pensé que la adición de las llamadas del sistema era un nono, pero eso es sólo de oídas. – jdizzle

+1

Sí, la adición de llamadas al sistema es inútil para un rootkit :) –

+0

Definitivamente no es posible agregar un syscall. Es probable que desee una nueva solución a su problema. ¿Por qué sientes que necesitas un nuevo syscall de todos modos? – stsquad

Respuesta

11

No, sys_call_table es de tamaño fijo:

const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { ...

Lo mejor que puede hacer, ya que es probable que ya descubierto, es intercept llamadas al sistema existente.

+1

Gracias. Sí, he decidido interceptar. – Zach

0

La interceptación de una llamada al sistema existente (para hacer algo en el kernel) no es la correcta en algunos casos. Por ejemplo, si los controladores del espacio de usuario necesitan ejecutar algo en kernel, enviar algo allí o leer algo de kernel.

Normalmente, para los controladores, la forma correcta es usar la llamada ioctl(), que es solo una llamada al sistema, pero puede llamar a diferentes funciones del kernel o módulos de controladores, pasando diferentes parámetros a través de ioctl().

Lo anterior es para la ejecución del código del kernel controlado por el usuario.

Para pasar datos, puede usar procfs o controladores sysfs para comunicarse con el kernel.

PD: cuando interceptas la llamada al sistema, que generalmente afecta a todo el sistema operativo, tienes que preocuparte por cómo resolver el problema de hacerlo de manera segura: ¿qué pasa si alguien llama la llamada al sistema y luego modificas/interceptar los códigos?

6

Zach, sí es posible: D

Aunque sys_call_table es de tamaño fijo, en algunos casos, puede haber posiciones libres en la tabla

Mira este enlaces:
lxr.free electrones. com/fuente/arch/x86/kernel/syscall_32.c
lxr.free-electrons.com/source/arch/x86/kernel/syscall_64.c

  • En primer lugar el kernel llena todas las posiciones de sys_call_table con un puntero a sys_ni_syscall

  • durante la compilación, los archivos asm/syscalls_32.h y asm/syscalls_64.h son generada en base a las siguientes tablas:

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 vistazo a estas tablas Y. Puede ver que algunas posiciones continuarán apuntando a sys_ni_syscall, por ejemplo, las posiciones 17, 31, 32, 35, ..., en syscall_32.tbl ya que no están implementadas.

Por lo tanto, nuestra única tarea es identificar estas posiciones y "registrar" nuestro nuevo syscall.

puse algo similar en mi git
https://github.com/MrN0body/rsysadd

Cuestiones relacionadas