En ce qui concerne les programmes de l'espace utilisateur, il est assez facile de les tromper et de truquer le contenu de n'importe quel fichier. Par exemple, supposons qu'un programme C utilise un /proc/cpuinfo
fichier pour vérifier le numéro de série. Le programme est protégé contre la copie et lié à la série, et je n'ai pas le code source. Cependant, je peux toujours courir strace program 2>&1 | grep cpuinfo
, ce qui révèlera quelque chose comme:
open("/proc/cpuinfo", O_RDONLY) = 3
À ce stade, je peux créer une petite bibliothèque, cpuinfo.so
avec la fonction suivante:
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);
}
Comme vous pouvez le voir, je vérifie si l'utilisateur de la bibliothèque essaie de s'ouvrir /proc/cpuinfo
, auquel cas j'ouvre à la /tmp/cpuinfo
place.
Ensuite, j'exécuterai le programme original protégé contre la copie en tant que LD_PRELOAD=/path/to/cpuinfo.so program
, et il lira avec plaisir mon faux fichier en le pensant /proc/cpuinfo
, tout en travaillant correctement avec le reste des fichiers.
Notez que si le logiciel protégé contre la copie comprend des objets du noyau, il sera beaucoup plus difficile à tromper, car il pourrait accéder directement au matériel. Cependant, un tel logiciel ne fonctionnera également qu'avec le noyau pour lequel il a été construit, ce qui rend sa distribution assez peu pratique.