LD_PRELOAD

2017-04-14 misc Linux Hook c

Hook 機制在不同的層面上有不同的作法

LD_PRELOAD 可以讓你預先載入自己的 shared object 檔,如此一來就可以在某些我們感興趣的 function 動手腳

// main.c
#include <stdio.h>

int main(void) {
    puts("Hello world!");
    return 0;
}

main.c 是一個很簡單的 hello world 程式,很多初學者的第一個程式範例

很明顯該程式中只有一個 puts function 也就是我們的目標

首先透過 man 來查詢 puts 的宣告 man 3 puts

得知是 int puts(const char *s)

我們便需要宣告一個跟它一模一樣的 function pointer 來存放

// hook.c
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
#include <string.h>

int puts(const char *s) {
    int *(*old_puts)(const char *msg);
    old_pust = dlsym(RTLD_NEXT, "puts");
    printf("length of messages: %zu\n", strlen(s));
    return old_puts(s);
}

$ cc -o main main.c

$ cc -o hook.so hook.c -fPIC -shared -ldl -D_GNU_SOURCE

都編譯成功以後,使用以下格式理論上就可以成功 hook puts 函數了

$ LD_PRELOAD=./hook.so ./main