LD_PRELOAD

Bir uygulamada bulunan bir fonksiyonu LD_PRELOAD yazarak değiştirebiliriz. Bunun için aşağıdaki gibi bir C kodumuz olsun.

#include <stdio.h>

int test(char* msg){
    puts(msg);
    return 0;
}

void main(){
    return test("Hello World");
}

Bu dosyayı derleyelim.

gcc -o main main.c

Buradaki değiştirmek istediğimiz test fonksiyonunu aşağıdaki gibi ayrı bir dosyaya yazalım.

#include <stdio.h>

int test(char* mgs){
    puts("Hmmm");
    return 1;
}

Bu dosyayı shared olarak derleyelim.

gcc test.c -o test.so -shared

main dosyamızı aşağıdaki gibi çağırlırsak değiştirmek istediğimiz fonksiyon çalışır.

LD_PRELOAD=$PWD/test.so ./main

Eğer değiştirdiğimiz fonksiyona ihtiyacımız varsa aşağıdaki gibi kullanarak elde edebiliriz.

#include <stdio.h>
#include <dlfcn.h> /* dlsym için */

int test(char* mgs){
    int (*orig)(char*) = dlsym(RTLD_NEXT, "test");
    int status = orig("HmmmV2");
    return status+2;
}

Yukarıdaki gibi yaparak asıl fonksiyona orig adı ile erişebiliriz.