# mtrace 如何在程式還沒跑完的時候用mtrace 攔截發生記憶體洩漏的問題呢 mtrace 就是去 hook malloc or free 的 funciotn 的東西 嘗試了幾種方式,在編譯glibc 也就是 c語言 預設會去call fucntion 的 library 主要就是在 ![](https://i.imgur.com/n0tCc6y.png) 有加鎖,預設我是要從原本的入口點 ![](https://i.imgur.com/5OgjVUR.png) 這邊修改的結果嘗試了很多方式, 主要是看能不能讓寫檔部分脫離main thread 再來自行寫thread 會遇到 編譯lib 需要加lpthread 的問題主要我還是找不到要加在哪 再來就是試圖在hook function 的地方也就是 ,我們 c語言經過我們的 > mtrace(); 正常流程要到 return 才能得到我們的輸出 mtrace 的原理就是去 hook malloc free 預設function ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <mcheck.h> int main(){ setenv("MALLOC_TRACE", "output", 1); mtrace(); char * text = ( char * ) malloc (sizeof(char) * 100); memset(text,'/0',100); memcpy(text,"hello,world!",12); while(true){} <=============程式還沒跑完要得到 output printf("%s/n","1"); printf("%s/n",text); free(text); return 0; } ``` 最後我們用奇怪的方式,脫離main thread ```c= char buffer[50]; sprintf(buffer,"echo qqqqqqq+ %p %#lx >> test.txt", hdr, (unsigned long int) size); system(buffer); ``` 這樣我們就可以在程式還沒結束之前得到我們的輸出了,我們會再進一步對這些記憶體做處理 ![](https://i.imgur.com/fRNuQck.png) # glibc 紀錄一下編譯 glibc link 到 我們編譯test 步驟 http://www.gnu.org/software/libc/ ```bash= tar zxvf glibc-2.27.tar.gz 記得不是在解壓縮的目錄裡面創往目錄外面一層創 mkdir -p build/glibc-build cd build/glibc-build ../../glibc-2.27/configure CFLAGS="-fno-builtin-strlen -lpthread -ggdb -O2" FEATURES="preserve-libs nostrip splitdebug" --prefix=/root/mtrace/build/glibc-build make -j20 make install g++ test.c -o test ... \ -Wl,--rpath=/root/mtrace/build/glibc-build/lib \ -Wl,--dynamic-linker=/root/mtrace/build/glibc-build/lib/ld-linux-x86-64.so.2 ```