miércoles, 24 de abril de 2013

Breve tutorial sobre LD_PRELOAD

man ld.so

¿Sabía Usted que es posible remplazar por completo las funciones de la librería estándar con copias personalizadas? o.O Este corto artículo trata un tema que, de ser bien utilizado , puede resultar muy poderoso . Podrá conocer lo que se logra con la variable de entorno LD_PRELOAD en GNU/Linux . ¿Qué cosa es ese bicho? No muerde :) . Le invito a seguir leyendo este artículo y suscribirse a este blog mediante RSS para estar informado acerca de temas avanzados de programación y uso de los comandos del shell de los sistemas Unix .

LD_PRELOAD en acción

A modo de ejemplo vamos a cambiar la función fopen y utilizar nuestra propia copia . Lo mismo se puede hacer con otras funciones e.g. printf , scanf , ... Comencemos con un programa simple (prog.c):

#include <stdio.h>

int main(void) {
    printf("Calling the fopen() function...\n");

    FILE *fd = fopen("test.txt","r");
    if (!fd) {
        printf("fopen() returned NULL\n");
        return 1;
    }

    printf("fopen() succeeded\n");

    return 0;
}

En pocas palabras solamente invocamos la función estándar fopen y chequeamos el valor de retorno . Vamos a compilar y ejecutar .

$ ls
prog.c  test.txt

$ gcc prog.c -o prog

$ ls
prog  prog.c  test.txt

$ ./prog
Calling the fopen() function...
fopen() succeeded

Por otra parte compilamos una versión personalizada de la función fopen y la distribuimos por separado :

#include <stdio.h>

FILE *fopen(const char *path, const char *mode) {
    printf("Always failing fopen\n");
    return NULL;
}

Llamamos a este fichero nullfopen.c y lo compilamos como una librería nullfopen.o .

$ gcc -Wall -fPIC -shared -o nullfopen.so nullfopen.c

Ahora ya estamos listos para modificar LD_PRELOAD :

$ LD_PRELOAD=./nullfopen.so ./prog
Calling the fopen() function...
Always failing fopen
fopen() returned NULL

Como se puede constatar se remplazó fopen con una versión que siempre falla . Este truco es muy útil para depurar aplicaciones o remplazar ciertas partes de libc u otra librería que utilice la aplicación . Un uso práctico notable es el comando tsocks , utilizado para dotar las aplicaciones con la capacidad de conectarse a través de un proxy .

Espero tener tiempo pronto y escribir otro artículo acerca de la mecánica interna que hace posible los resultados que se obtienen con la variable LD_PRELOAD . Si está interesado en conocer más acerca de los sistemas Unix le invito a leer otros artículos sobre comandos y suscribirse a este blog mediante RSS para estar al tanto de nuevos temas . Si tiene preguntas no dude en dejar un comentario . Todo es posible simelo pide ...

No hay comentarios:

Publicar un comentario