No que diz respeito aos programas do espaço do usuário, é muito fácil enganá-los e falsificar o conteúdo de praticamente qualquer arquivo. Por exemplo, suponha que um programa C esteja usando o /proc/cpuinfoarquivo para verificar o número de série. O programa está protegido contra cópia e vinculado ao serial, e eu não tenho o código fonte. No entanto, ainda posso executar strace program 2>&1 | grep cpuinfo, o que revelará algo como:
open("/proc/cpuinfo", O_RDONLY) = 3
Neste ponto, eu posso criar uma pequena biblioteca, cpuinfo.socom a seguinte função:
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);
}
Como você pode ver, estou verificando se o usuário da biblioteca tenta abrir /proc/cpuinfo; nesse caso, eu abro /tmp/cpuinfo.
Depois, executarei o programa original protegido contra cópia como LD_PRELOAD=/path/to/cpuinfo.so program, e ele lerá felizmente meu arquivo falso, pensando que é /proc/cpuinfo, enquanto estiver trabalhando corretamente com o restante dos arquivos.
Observe que, se o software protegido contra cópia incluir objetos do kernel, será muito mais difícil de enganar, pois ele pode acessar o hardware diretamente. No entanto, esse software também funcionará apenas com o kernel para o qual foi construído, tornando a distribuição bastante impraticável.