Per quanto riguarda i programmi userspace, è abbastanza facile ingannarli e falsificare il contenuto di quasi tutti i file. Ad esempio, supponiamo che un programma C stia usando il /proc/cpuinfofile per verificare il numero seriale. Il programma è protetto da copia e collegato al seriale e non ho il codice sorgente. Tuttavia, posso ancora correre strace program 2>&1 | grep cpuinfo, che rivelerà qualcosa di simile:
open("/proc/cpuinfo", O_RDONLY) = 3
A questo punto, posso creare una piccola libreria, cpuinfo.socon la seguente funzione:
int open(const char *file, int flags) {
static int (*real_open)(const char *file, int flags);
if(!real_open) real_open = dlsym(RTLD_NEXT, "open");
if(!strcmp(file, "/proc/cpuinfo")) file = "/tmp/cpuinfo";
return real_open(file, flags);
}
Come puoi vedere, sto verificando se l'utente della libreria tenta di aprire /proc/cpuinfo, nel qual caso /tmp/cpuinfoinvece apro .
Quindi eseguirò il programma originale protetto da copia LD_PRELOAD=/path/to/cpuinfo.so programe leggerà felicemente il mio file falso pensando che sia /proc/cpuinfo, mentre funziona correttamente con il resto dei file.
Si noti che se il software protetto da copia include oggetti kernel, sarà molto più difficile da ingannare, poiché potrebbe accedere direttamente all'hardware. Tuttavia, tale software funzionerà anche solo con il kernel per cui è stato creato, il che rende abbastanza poco pratico la distribuzione.