利用LD PRELOAD給glibc庫函式加鉤子

2021-08-25 03:18:44 字數 1634 閱讀 9856

通過getuid、printf等函式講解了基本的加鉤子的方法:

如果你希望的不僅僅是替換掉原有庫函式,而且還希望最終將函式邏輯傳遞到原有系統函式,那麼你可能需要用到rtld_next。系統可能提示

rtld_next未定義,這裡給出了解決方案:

我的過程記錄

fork.c,最後編譯成fork.so

#include #include #include #include #include #include /* 即使按照參考文獻中的方法,定義__use_gnu * 還是被提示rtld_next未定義 * 只能用這種猥瑣的,不可移植的方法了 * 實驗目的,無傷大雅。 */ # define rtld_next ((void *) -1l) static pid_t (*real_fork)(void); pid_t fork(void) return real_fork(); }

strlen.c,最後編譯成strlen.so 。 需要說明的是,最後這個so沒有用到,因為我遇到了乙個詭異的事情,詳細見後文。

#include size_t strlen(const char *s) return i; }

測試**。測試了strlen和fork。

但是,我並沒有為strlen加鉤子,因為,我發現,無論是否掛鉤strlen,這個測試函式總是沒有反應,根本沒有進入到strlen.c的**中。不過呢,當我用export ld_preload="./strlen.so"後,vi、ls等應用程式都能夠進入到strlen.c中,唯獨我的./hello不能進入strlen.c。詭異!

fork函式測試有效。

#include #include #include #include int main(int argc,char** argv)

編譯過程(只涉及到 fork.c 和 hello.c )

gcc -fpic -shared -ldl -o fork.so fork.c

; note: 如果沒有家ldl,則提示找不到符號dlsym,沒有家-fpic,則編譯器會提示新增此選項。跟網上的一些資料有點出入。

gcc -o hello hello.c

export ld_preload="./fork.so"

./hello abcd

abcd length is 4

fork is called

pid=0

pid=12828

export ld_preload=""

; clear preload path

上面使用ld_preload的方法有個問題,它是乙個持久的全域性設定,可能會影響到./hello之外的程式的正常行為。乙個更好的使用方法是直接執行:

ld_preload="./fork.so" ./hello abcd

後記:關於dlsym

#include void *dlopen(const char *filename, int flag); char *dlerror(void); void *dlsym(void *handle, const char *symbol); int dlclose(void *handle);

ld_preload能夠很方便地實現應用層的二進位制相容,值得推廣。同時謹記ld_preload不可濫用,否則會干擾正常系統的功能。一般,用完後需要將ld_preload的內容清空。

利用LD PRELOAD給glibc庫函式加鉤子

通過getuid printf等函式講解了基本的加鉤子的方法 如果你希望的不僅僅是替換掉原有庫函式,而且還希望最終將函式邏輯傳遞到原有系統函式,那麼你可能需要用到rtld next。系統可能提示 rtld next未定義,這裡給出了解決方案 我的過程記錄 fork.c,最後編譯成fork.so in...

利用LD PRELOAD進行hook

好久沒玩hook這種猥瑣的東西裡,今天在linux 驗了一把。loader在進行動態鏈結的時候,會將有相同符號名的符號覆蓋成ld preload指定的so檔案中的符號。換句話說,可以用我們自己的so庫中的函式替換原來庫里有的函式,從而達到hook的目的。這和windows下通過修改import ta...

利用公式給硬碟精確分割槽

系統重灌 這個話題,很多朋友早已不陌生了!那麼當我們為自己的愛機重灌系統時,有沒有注意到分割槽細節呢?分割槽下來各盤的空間資料都是整數麼?我想大多數不是吧?今天我們就來一起學習個分割槽為整數的方法!硬碟整數分割槽計算方法一般演算法 分割槽大小 分割槽大小 1 4 1024 分割槽大小。如果按照硬碟分...