funcion - ¿Cómo podría interceptar llamadas de linux sys?
llamadas al sistema en c windows (8)
Además del truco LD_PRELOAD, y los módulos Kernel de Linux que reemplazan un determinado syscall con uno proporcionado por usted, ¿hay alguna posibilidad de interceptar un syscall (abrir, por ejemplo), para que primero pase por su función, antes de que llegue a la apertura real?
¿Por qué no puedes / no quieres usar el truco LD_PRELOAD?
Código de ejemplo aquí:
/*
* File: soft_atimes.c
* Author: D.J. Capelis
*
* Compile:
* gcc -fPIC -c -o soft_atimes.o soft_atimes.c
* gcc -shared -o soft_atimes.so soft_atimes.o -ldl
*
* Use:
* LD_PRELOAD="./soft_atimes.so" command
*
* Copyright 2007 Regents of the University of California
*/
#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>
extern int errorno;
int (*_open)(const char * pathname, int flags, ...);
int (*_open64)(const char * pathname, int flags, ...);
int open(const char * pathname, int flags, mode_t mode)
{
_open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
if(flags & O_CREAT)
return _open(pathname, flags | O_NOATIME, mode);
else
return _open(pathname, flags | O_NOATIME, 0);
}
int open64(const char * pathname, int flags, mode_t mode)
{
_open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
if(flags & O_CREAT)
return _open64(pathname, flags | O_NOATIME, mode);
else
return _open64(pathname, flags | O_NOATIME, 0);
}
Por lo que entiendo ... es más o menos el truco LD_PRELOAD o un módulo kernel. No hay mucho terreno intermedio a menos que desee ejecutarlo en un emulador que pueda atrapar su función o reescribir el código en el binario real para atrapar su función.
Suponiendo que no puede modificar el programa y no puede (o no quiere) modificar el kernel, el enfoque LD_PRELOAD es el mejor, suponiendo que su aplicación es bastante estándar y no es realmente una que intenta maliciosamente pasar al pasado tu intercepción (En cuyo caso necesitarás una de las otras técnicas).
Algunas aplicaciones pueden engañar / ptrace para que no se ejecuten, por lo que la única opción real que he tenido es usar systemtap
Systemtap puede interceptar un grupo de llamadas al sistema si es necesario debido a su coincidencia comodín. Systemtap no es C, sino un lenguaje separado. En modo básico, el systemtap debería evitar que hagas cosas estúpidas, pero también se puede ejecutar en el "modo experto" que permite que un desarrollador use C si es necesario.
No es necesario que aplique parches a su kernel (o al menos no debería), y una vez que se ha compilado un módulo, puede copiarlo de un cuadro de prueba / desarrollo e insertarlo (a través de insmod) en un sistema de producción.
Todavía tengo que encontrar una aplicación de Linux que haya encontrado una forma de evitar el problema / evitar ser atrapado por systemtap.
No tengo la sintaxis para hacerlo con gracia con un LKM de forma manual, pero este artículo proporciona una buena visión general de lo que debe hacer: http://www.linuxjournal.com/article/4378
También podría parchar la función sys_open. Comienza en la línea 1084 de file / open.c a partir de linux-2.6.26.
También puede ver si no puede usar inotify, systemtap o SELinux para hacer todo este registro sin tener que construir un nuevo sistema.
Parece que necesitas auditar.
Auditd permite el seguimiento global de todas las llamadas de sys o accesos a archivos, con el registro. Puede establecer claves para eventos específicos que le interesan.
Si solo quiere ver lo que se abre, quiere ver la función ptrace () o el código fuente de la herramienta de línea de comando. Si realmente desea interceptar la llamada, quizás hacer que haga otra cosa, creo que las opciones que enumeró, LD_PRELOAD o un módulo kernel, son sus únicas opciones.
Si solo quiere hacerlo para fines de depuración, mire dentro de strace, que está integrado en la parte superior de la llamada al sistema ptrace (2) que le permite conectar el código cuando se realiza una llamada al sistema. Consulte la parte PTRACE_SYSCALL de la página man.
si realmente necesita una solución que podría interesarle en el rootkit de DR que logra esto, http://www.immunityinc.com/downloads/linux_rootkit_source.tbz2 el artículo al respecto está aquí http://www.theregister.co. uk / 2008/09/04 / linux_rootkit_released /
Valgrind se puede usar para interceptar cualquier llamada de función. Si necesita interceptar una llamada al sistema en su producto terminado, entonces esto no servirá. Sin embargo, si intentas interceptar durante el desarrollo, puede ser muy útil. Frecuentemente he usado esta técnica para interceptar las funciones de hash para poder controlar el hash devuelto con fines de prueba.
En caso de que no lo sepa, Valgrind se usa principalmente para encontrar fugas de memoria y otros errores relacionados con la memoria. Pero la tecnología subyacente es básicamente un emulador x86. Emula tu programa e intercepta llamadas a malloc / free etc. Lo bueno es que no necesitas volver a compilar para usarlo.
Valgrind tiene una función que denominan Envoltura de funciones , que se usa para controlar la interceptación de funciones. Consulte la sección 3.2 del manual de Valgrind para más detalles. Puede configurar el ajuste de funciones para cualquier función que desee. Una vez que se intercepta la llamada, se invoca la función alternativa que usted proporciona.