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