modprobe modificar lsmod diseño como comando cargar c linux-kernel

modificar - Cómo obtener el ID de usuario al escribir el módulo kernel de Linux



modificar kernel linux (3)

Debe llamar a current_uid (), definido en linux / cred.h (comenzando por 2.6, antes era current-> uid). Ver el documento del kernel sobre las credenciales

la corriente es una macro , por cierto.

Aquí está mi función en mi módulo kernel que inserto usando el comando insmod después de make en etapas posteriores. Estoy trabajando en goldfish (2.6.29)

asmlinkage long our_sys_read(unsigned int fd, char *buf, size_t count) { printk("------->> our_sys_read getuid() ---------- %d/n", getuid()); return original_call_read(fd,buf,count); }

Quiero interceptar las llamadas al sistema y averiguar qué usuario hizo estas llamadas al sistema. Pero cuando ejecuto ''make'', me arroja el siguiente error.

/home/mohsin/LKM/trapcall.c:245: error: implicit declaration of function ''getuid''

Cualquier sugerencia sería apreciada.


Quizás puedas usar esto:

#include <include/linux/cred.h> static int getuid() { return current_uid(); }

cred significa "credenciales", y esta macro devuelve el ID de usuario de las credenciales actualmente activas. Sin embargo, tenga en cuenta que la "identificación de usuario actual" puede significar varias cosas en Linux.

[Dan3 obviamente no tuvo que excavar tanto código como yo para encontrar esto - ¡o comenzó antes que yo!]


Después de pasar dos días, finalmente descubrí cómo encontrar el proceso que hizo una llamada al sistema. Daré todas las sugerencias que encontré en diferentes enlaces para que si mi solución no funciona, una de las otras funcione.

1) Como me dijo Mats,

#include <include/linux/cred.h> static int getuid() { return current_uid(); }

Usted llama a esta función para obtener el uid, pero me dio números negativos como -943124788 etc.

2)

uid_t credd_uid ; const struct cred *cred = current_cred(); credd_uid = current->cred->uid;

Mismo resultado como números negativos grandes.

3)

uid_t struct_uid; struct user_struct *u = current_user(); struct_uid = get_uid(u);

4) Solución trabajada

Está dado aquí en realidad.

i) Declarar prototipo de función en la parte superior como

asmlinkage int (*getuid_call)();

ii) Agregue la siguiente línea a la función init_module ()

/ * Obtenga la llamada del sistema para getuid * /

getuid_call = sys_call_table[__NR_getuid];

iii) Llamar a la función en las funciones de llamada del sistema atrapado para obtener uid

uid_t uid = getuid_call();