LD_PRELOAD tidak terlalu sulit, dan Anda tidak perlu menjadi root. Sisipkan rutinitas C Anda sendiri yang dipanggil sebagai pengganti open()
yang asli di pustaka C. Rutinitas Anda memeriksa apakah file yang akan dibuka adalah "/tmp/adb.log" dan memanggil file terbuka yang sebenarnya dengan nama file yang berbeda. Ini shim_open.c Anda:
/*
* 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);
}
Kompilasi dengan gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
dan mengujinya dengan memasukkan sesuatu ke dalam /tmp/myadb.log
dan menjalankan LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
. Kemudian coba LD_PRELOAD di adb.
Berikut adalah contoh penggunaan util-linux
yang sangat sederhana unshare
untuk meletakkan proses di ruang nama pemasangan pribadi dan memberinya tampilan berbeda dari sistem file yang sama yang dimiliki induknya saat ini:
{ 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
Anda dapat memberikan proses tampilan pribadi dari sistem filenya dengan unshare
utilitas pada sistem linux terkini, meskipun fasilitas mount namespace sendiri sudah cukup matang untuk seluruh seri kernel 3.x. Anda dapat memasukkan semua jenis ruang nama yang sudah ada sebelumnya dengan nsenter
utilitas dari paket yang sama, dan Anda dapat mengetahui lebih lanjut dengan man
.