是否有辦法在malloc的hook函式中呼叫原生malloc?
試試 tcmalloc 的 hook 。
https://
github。com/gperftools/g
perftools/blob/master/src/gperftools/malloc_hook。h
可以參考 visual leak detect這個專案的思路,很輕量的方案。
hook是你自己寫的嗎?
如果是,那執行緒問題可以粗暴地加個鎖。。。反正感覺你也是在做除錯。
Detours不能做非stdcall的函式hook,所以題主就放棄熱補丁的方式吧,可以採用IAT hook,但是這也要求目標程式是採用動態連結CRT執行時庫編譯的,因為靜態連結的是不用把malloc函式的地址放在匯入表的。
當然啦,題主如果是要自己寫工具來分析堆記憶體的使用情況,並且是隻針對windows系統,那就不用去hook malloc這個函數了,C執行時庫函式最終都會呼叫對應實現平臺的系統API,windows上最終會呼叫
HeapAlloc
。所以你把Hook層次放低一點,然後就可以直接使用微軟的Detours庫來做了,穩定,高效。
給你個傳送門:Detours - Microsoft Research
不好意思之前的回答有點毛病。
但是貌似題主做的是Linux系統,所以以上全是廢話啦,不過辦法肯定是有的。
其實題主完全不必使用malloc hook,因為本身malloc也是一個weak symbol,所以你直接寫一個malloc同簽名的函式就行了,至於如何call原函式,可以透過符號 __libc_malloc,這個符號直接指向malloc的實現部分,透過這個符號呼叫就不會去call malloc_hook
extern
void
*
__libc_malloc
(
size_t
size
);
void
*
malloc
(
size_t
size
)
{
// do your stuff
{
}
// call the original malloc
return
__libc_malloc
(
size
);
}
當然還有更深入層次的辦法:
自己擼inline hook,關於Inline Hook可以補充點乾貨,實習時候做的PPT,年代比較久遠了。雖然是基於windows 平臺實現的,但是在彙編二進位制層面不分系統,原理全部一樣。
可以用呼叫棧判斷是否重入。如果重入在鉤子裡直接返回。由於都是棧操作,執行緒安全的。
上一篇:網王推文
下一篇:最好的感情都要有儀式感