我在gdb的目標可執行文件之外,我甚至沒有對應於該目標的堆棧。無論如何,我想要單步執行,以便我可以驗證彙編代碼中發生了什麼,因爲我不是x86彙編的專家。不幸的是,gdb拒絕執行這個簡單的彙編級調試。它允許我在適當的斷點處設置和停止,但只要我嘗試單步啓動,gdb會報告錯誤「無法找到當前函數的邊界」,並且EIP不會更改。使用gdb在指定的可執行文件之外的單步彙編代碼會導致錯誤「找不到當前函數的邊界」
的附加細節:通過GCC asm語句生成
機器代碼和我它複製到其中它執行內核存儲器位置,從objdump的-d的輸出。我不介意使用加載器將對象代碼加載到重定位地址的簡單方法,但請記住加載必須在內核模塊中完成。
我想另一種選擇是產生一個假的內核模塊或調試信息文件給gdb,使它相信這個區域在程序代碼中。 gdb可以在內核可執行文件本身上正常工作。 (對於那些真正想知道的人,我在運行時將代碼插入到VMware VM內部的Linux內核數據空間中,並通過gdb從gdb調試遠程內核,通過VMware Workstation的內置gdb存根調試內核。注意:我不是在編寫內核漏洞;我是一名安全研究生寫的原型)
(我可以在我的程序集中的每條指令上設置一個斷點,這個工作但會很費力一段時間後,因爲x86彙編指令會有所不同,並且每次重新啓動時程序集的位置都會更改。)
聰明的http://www.ksplice.com/通過組裝「假」內核模塊並加載它們,將數據和代碼注入內核。如果他們能做到,爲什麼不能呢? ;-) – ephemient 2010-03-10 23:20:43