LD_PRELOAD no es demasiado difícil, y no necesita ser root. Interponga su propia rutina C que se llama en lugar del verdadero open()
en la biblioteca C. Su rutina verifica si el archivo a abrir es "/tmp/adb.log" y llama a la apertura real con un nombre de archivo diferente. Aquí está su shim_open.c:
/*
* capture calls to a routine and replace with your code
* gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
* LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
*/
#define _FCNTL_H 1 /* hack for open() prototype */
#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#define OLDNAME "/tmp/adb.log"
#define NEWNAME "/tmp/myadb.log"
int open(const char *pathname, int flags, mode_t mode){
static int (*real_open)(const char *pathname, int flags, mode_t mode) = NULL;
if (!real_open) {
real_open = dlsym(RTLD_NEXT, "open");
char *error = dlerror();
if (error != NULL) {
fprintf(stderr, "%s\n", error);
exit(1);
}
}
if (strcmp(pathname,OLDNAME)==0) pathname = NEWNAME;
fprintf(stderr, "opening: %s\n", pathname);
return real_open(pathname, flags, mode);
}
Compílalo con gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
y pruébalo poniendo algo en /tmp/myadb.log
y ejecutando LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
. Entonces prueba LD_PRELOAD en adb.
Aquí hay un ejemplo muy simple de usar util-linux
de unshare
para poner un proceso en un espacio de nombres de montaje privado y darle una vista diferente del mismo sistema de archivos que tiene actualmente su padre:
{ cd /tmp #usually a safe place for this stuff
echo hey >file #some
echo there >file2 #evidence
sudo unshare -m sh -c ' #unshare requires root by default
mount -B file2 file #bind mount there over hey
cat file #show it
kill -TSTP "$$" #suspend root shell and switch back to parent
umount file #unbind there
cat file' #show it
cat file #root shell just suspended
fg #bring it back
cat file2 #round it off
}
there #root shell
hey #root shell suspended
hey #root shell restored
there #rounded
Puede darle a un proceso una vista privada de su sistema de archivos con el unshare
utilidad en los sistemas Linux actualizados, aunque la instalación del espacio de nombres de montaje en sí misma ha sido bastante madura para toda la serie del kernel 3.x. Puede ingresar espacios de nombres preexistentes de todo tipo con nsenter
utilidad del mismo paquete, y puede obtener más información con man
.