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/cpuinfo
file 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.so
con 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/cpuinfo
invece apro .
Quindi eseguirò il programma originale protetto da copia LD_PRELOAD=/path/to/cpuinfo.so program
e 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.