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/cpuinfo
arquivo 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.so
com 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.