2009-05-21 19 views

Respuesta

3

No está familiarizado con AIX, pero las siguientes obras en Linux y Solaris. Puede usar la variable de entorno LD_PRELOAD, que le dice a ld.so que cargue una biblioteca compartida antes de libc y luego escriba su propia versión de la llamada al sistema, y ​​opcionalmente llame al original. man ld.so para más información. Algo a lo largo de las líneas de

#include <dlfcn.h> 

typedef int (*ioctl_fn)(int, int, void*); 

static 
int 
my_ioctl(int  fildes, 
     int  request, 
     void* argp, 
     ioctl_fn fn_ptr) 

{ 
    int result = 0; 

    /* call original or do my stuff */ 
    if (request == INTERESTED) 
    { 
     result = 0; 
    } 
    else 
    { 
     result = (*fn_ptr)(fildes, request, argp); 
    } 

    return result; 
} 

/* 
* override ioctl() - on first call get a pointer to the "real" one 
* and then pass it onto our version of the function 
*/ 
int 
ioctl(int fildes, 
     int request, 
     void* argp) 
{ 
    static ioctl_fn S_fn_ptr = 0; 

    if (S_fn_ptr == 0) 
    { 
     S_fn_ptr = (ioctl_fn)dlsym(RTLD_NEXT, "ioctl"); 
    } 

    return my_ioctl(fildes, request, argp, S_fn_ptr); 
} 

talladas esto de algún código que tenía por ahí, disculpas si he hecho que sea incorrecta.

+1

Nitpick: Está interceptando llamadas de biblioteca (del sistema), no llamadas al sistema. Probablemente lo que el interrogador quiso hacer, pero vale la pena señalar que estás respondiendo una pregunta ligeramente diferente. Aún una respuesta +1. –

+0

@John M - Supongo que la pregunta es un poco vaga: ¿con qué propósito @debugger quiere interceptar las llamadas al sistema? Si se trata de modificar el comportamiento, lo anterior funcionará, si es con fines de rastreo, luego use truss/strace/dtrace o el equivalente de AIX, ... Podría ser todo existencial y debatir "¿qué es una llamada al sistema?". ¡Gracias por la respuesta! – Beano

0

No estoy seguro acerca de AIX, pero lo he hecho en Linux. En Linux, la tabla de llamadas del sistema está contenida en la matriz sys_call_table. Tenemos que encontrar primero la dirección de esta tabla. Ahora, esto es algo complicado y hay múltiples formas de hacerlo.

Podemos encontrar su dirección examinado archivo sysmap:

punb200m2labs08vm1:/ # cat /boot/System.map-4.4.21-69-default | grep sys_call_table 
ffffffff81600180 R sys_call_table 

Por lo tanto, ffffffff81600180 es la dirección de sys_call_table en mi máquina. En su módulo kernel, puede simplemente cambiar la función predeterminada correspondiente a cierto número de llamada del sistema (que está cambiando) y asignarla a su propia función.

p. Ej. Supongamos que quiere interceptar una llamada al sistema 'abierta' cuyo número es __NR_open en Linux. Después de obtener la dirección de sys_call_table desde arriba, simplemente asignar su función para index __NR_open de sys_call_table:

sys_call_table[__NR_open] = your_function; 

donde your_function se implementa por usted para interceptar llamadas del sistema 'abierto'. A partir de ahora, cada llamada al sistema abierto pasará por esta función.

Los detalles diferirían en AIX, pero la idea general sería similar, supongo. Solo necesita averiguar el procedimiento específico de AIX para lograr esto.

Cuestiones relacionadas