一、ld_preload是什麼
ld_preload是linux系統的乙個環境變數,它可以影響程式的執行時的鏈結(runtime linker),它允許你定義在程式執行前優先載入的動態鏈結庫。
這個功能主要就是用來有選擇性的載入不同動態鏈結庫中的相同函式。通過這個環境變數,我們可以再主程式和其動態鏈結庫的中間載入別的動態鏈結庫,
甚至覆蓋正常的函式庫。一方面,我們可以以此功能來使用自己的或是更好的函式(無需別人的原始碼),而另一方面,我們也可以向別人的程式注入程式,
從而達到特定的目的。
二、程式呼叫流圖
三、演示程式**
// myverifypasswd.c
#include #include #include "mystrcmp.h"
void main(int argc,char **argv)
if (!mystrcmp(passwd,argv[1]))
printf("invalid password!\n");
}
// mystrcmp.h
#include int mystrcmp(const char *s1, const char *s2);
// mystrcmp.c
#include #include #include "mystrcmp.h"
int mystrcmp(const char *s1, const char *s2)
四、程式編譯與試驗
n6@x240s:~/桌面/ld_preload$ gcc mystrcmp.c -fpic -shared -o libmystrcmp.so
n6@x240s:~/桌面/ld_preload$ gcc myverifypasswd.c -l. -lmystrcmp -o myverifypasswd
n6@x240s:~/桌面/ld_preload$ export ld_library_path=/home/n6/桌面/ld_preload
n6@x240s:~/桌面/ld_preload$ ldd myverifypasswd
linux-vdso.so.1 => (0x00007ffedc1bd000)
libmystrcmp.so => /home/n6/桌面/ld_preload/libmystrcmp.so (0x00007eff99a7f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007eff99698000)
/lib64/ld-linux-x86-64.so.2 (0x000056269aba4000)
n6@x240s:~/桌面/ld_preload$ ./myverifypasswd
usage: ./myverifypasswd n6@x240s:~/桌面/ld_preload$ ./myverifypasswd abc
invalid password!
n6@x240s:~/桌面/ld_preload$ ./myverifypasswd password
correct password!
五、替換庫**
六、替換並測試執行
七、ld_preload運用總結
Mysql學習筆記 摘抄
大體來說,mysql可以分為server層和儲存引擎層倆部分。server層包括聯結器,查詢快取,分析器,優化器,執行器等。涵蓋mysql大多數核心服務功能,以及所有的內建函式,所有的跨儲存引擎的功能都在這一層實現,比如儲存過程,觸發器,檢視等。而儲存引擎負責資料的儲存和提取 日誌模組 redo l...
Map 容器 學習總結(摘抄)
下標訪問 和at 方法兩種方式,推薦第二種方法,它會進行邊界檢查。對於mapmap str 其訪問方式為 map str firstel 或者map str.at firstel 返回鍵值firstel對應的值 int size const 返回對映中的元素數量。map.size bool empt...
數學之美(吳軍著)學習總結和經典摘抄
1.不同的文明,由於地域的原因。歷史上相互隔絕。便會有不同的文字。隨著文明的融合與衝突,不同文明下的人們須要交流,或者說通訊,那麼翻譯的需求便產生了。翻譯這件事之所以能達成。不過由於 不同的文字系統在記錄資訊的能力上是等價的 這個結論非常重要 進一步講。文字不過資訊的載體,而並不是資訊本身。那麼不用...