Sejauh menyangkut program userspace, sangat mudah untuk mengelabui mereka dan memalsukan isi file apa saja. Sebagai contoh, misalkan program C menggunakan /proc/cpuinfo
file untuk memverifikasi nomor seri. Program ini dilindungi salinan dan terikat pada serial, dan saya tidak memiliki kode sumber. Namun, saya masih dapat menjalankan strace program 2>&1 | grep cpuinfo
, yang akan mengungkapkan sesuatu seperti:
open("/proc/cpuinfo", O_RDONLY) = 3
Pada titik ini, saya dapat membuat perpustakaan kecil, cpuinfo.so
dengan fungsi sebagai berikut:
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);
}
Seperti yang Anda lihat, saya sedang memeriksa apakah pengguna perpustakaan mencoba untuk membuka /proc/cpuinfo
, dalam hal ini saya buka /tmp/cpuinfo
sebagai gantinya.
Kemudian saya akan menjalankan program yang dilindungi salinan asli LD_PRELOAD=/path/to/cpuinfo.so program
, dan itu akan dengan senang hati membaca file palsu saya berpikir itu /proc/cpuinfo
, sambil bekerja dengan benar dengan sisa file.
Perhatikan bahwa jika perangkat lunak yang dilindungi salinan menyertakan objek kernel, akan lebih sulit untuk dibohongi, karena dapat mengakses perangkat keras secara langsung. Namun, perangkat lunak semacam itu juga hanya akan berfungsi dengan kernel yang dibangunnya, sehingga tidak praktis untuk didistribusikan.