動態庫載入後的函式解析

2021-10-04 13:31:56 字數 2096 閱讀 1122

最近做乙個demo,簡單來說就是通過ptrace的功能,把自己寫的乙個so(內有咱們要hook後的函式實現),動態載入到目標程式後,通過修改got表的方式,把目標函式替換成咱們自己的函式,後面在目標程式的**裡,再呼叫該函式時,呼叫的就是咱們hook後的函式。這種實現方式之前被廣泛的用在外掛程式開發、動態除錯等領域,也是hacker們的一種手段。

我hook了malloc函式:

實現後,跟同事討論這個問題,為什麼在hook_so裡的mymalloc裡呼叫malloc——在上面的demo裡是newputs 和 puts——不會出現遞迴呼叫,現象就是死迴圈,簡單來說,就是在主程式裡呼叫malloc呼叫的是mymalloc,而在mymalloc裡呼叫malloc時,呼叫的就是glibc裡的malloc?

這裡面涉及到動態載入的一些知識點,在這裡不展開描述,感興趣的同學可以搜尋一下 elf、動態載入等關鍵字;

下面就說一下我的分析過程;

自己寫了乙個簡單的target程式:

編譯後gdb之,前面不管,在84行打斷點:

檢視一下:

一句話總結就是:

」在程式剛開始執行時,got 表項是空的,當符號第一次被呼叫時會動態解析符號的絕對位址然後轉去執行,並將被解析符號的絕對位址記錄在 got 中,第二次呼叫同一符號時,由於 got 中已經記錄了其絕對位址,直接轉去執行即可(不用重新解析)「

下面進行另外的測試,重啟啟動目標程式,然後在第乙個malloc和第二個malloc之間,使用hook技術,對malloc進行hook,那麼hook後馬上detach,然後gdb attach之;

替換的目標函式是malloc,替換後的mymalloc如下:

開始除錯:

可以看到,當hook後,第一次解析mymalloc裡的malloc時,是通過so中的got來進行定址的;

這裡也展示出:主程式中的got和hook方式加入的so中的got是兩個不同的got!!!

——其實對我來說,這是我做這個測試的最需要的答案。

下面接續最後乙個malloc的解析:

順便說一句,通過target的列印,可以看到hook已經成功,呼叫malloc時,實際上呼叫的已經是mymalloc了;

最後乙個malloc的解析過程,和上面乙個的malloc的解析是完全一樣的,即:在主程式中通過got和plt定址到mymalloc,然後在so中,再通過so的got和plt定址到malloc的呼叫——這裡對應的是glibc的malloc的位址;就不再貼圖了,感興趣的可以自己去嘗試一下下;

1.主程式中的malloc的呼叫——如果沒有動態注入so的情況下——第一次呼叫malloc時,會有乙個重定位的過程,第一次重定位完成後,就會把malloc的絕對位址寫入到got中,後面再呼叫malloc時,就不用再進行重定位了,直接通過got和plt定位到函式位址;

2.動態注入so的情況下,進行了malloc的hook,那麼除了主程式的got和plt定址,還需要so內的got和plt定址,通過這種方式來實現真正的malloc的呼叫;

當前對got和plt的理解還很膚淺,本文中的描述可能存在不準確的地方,如果錯誤,敬請指正,謝謝;

安裝php後無法動態載入庫

安裝apache mysql php並配置完成後使用phpinfo測試顯示正常,但是無法動態增加庫 原因 安裝php後不會生成php.ini檔案,但是phpinfo測試正常 解決方法 1 檢視配置檔案需要存放路徑,一般編譯php時使用 with config file path引數設定,也可以用ph...

動態載入動態庫

message函式的宣告你應該知道吧,把它的宣告和下面的語句寫到乙個標頭檔案中 pragma comment lib,a.lib 然後你的對話方塊.cpp中包含這個標頭檔案就可以使用message函式了。如果dll沒有對應的.lib檔案,那麼就只能使用動態載入的方式了。動態呼叫動態庫步驟 1 建立乙...

動態載入庫

使用vc程式設計時遇到乙個奇怪的情況,包含了,但是編譯器編譯結果告知無法找到hmonitor結構,從vc上 能看到hmonitor結構宣告在windef.h裡,但是包含了還是不行,最後乙個同事告知包含multimon.h即可。好,切入正題。結構找到了,不過很多函式沒有找到,在網上也沒找到好方法。最後...