2013-04-27 48 views
2

是否有用於處理x86/x64機器碼的任何C庫?具體來說,我想在運行時修改程序地址空間中的函數。用於在運行時操作機器代碼的庫?

例如,我有功能foobar,對此我有自己的內部運作的來源或知識,但不能重新編譯他們所在的庫,和我有功能baz我寫我自己。現在我希望能夠說出如下內容:「在功能foo中,查找對bar的呼叫,並在其前注入baz的說明。」該工具必須相應地調整程序中的所有相關地址。

我知道所有的零碎都存在,例如有工具可以做hotpatching的功能。由於優化等原因,我想可能會有一些限制,但基本功能應該是可能的。我無法找到這樣的東西,有沒有人有一些鏈接?

+1

優化您的Google搜索以包括諸如「代碼編織」,「代碼注入」和「面向方面的編程」等術語。 – 2013-04-27 23:06:41

+0

@Brendan:這是一個有點假設的問題。但是在某些情況下,您無法在技術上(無法替換系統庫)或法律上(由於授權)進行此操作。 – jdm 2013-04-28 08:41:46

回答

3

這就是所謂的「自我修改代碼」(參見wikipedia),它在80年代和90年代早期相當流行。但是,特別是在機器代碼和ASM中,它幾乎已經成爲現代語言的一種方法,因爲它非常脆弱。託管語言試圖提供更安全的模型,因爲它也是緩衝區溢出攻擊的基礎。

考慮到您的代碼頁可能被標記爲只讀或寫入時複製,並且您可能會在許多現代操作系統上遇到訪問衝突,但如果內存爲我服務,則需要掌握基本原則一個變量的內存地址或函數,並且您需要具有關於在該位置生成的代碼和/或堆棧佈局的相當詳細的知識。

這裏有一些鏈接,讓你開始;

  1. How to write self-modifying code in x86 assembly
  2. Self-modifying code for debug tracing in quasi-C

具體來說,你的情況,我不會通過插入操作,然後試圖調整所有的代碼修改foo,所有你需要做的是改變jump地址bar要經過中介。這被稱爲Thunk。這樣做的好處在於,將跳轉地址從一個跳轉到另一個跳轉地址的脆弱性要小得多,因爲它不會更改原始功能的結構,只是一個數字。事實上,通過比較它是微不足道的。

在您的thunk中,您可以在調用真實功能之前和之後執行任何您喜歡的操作。如果你已經在同一個地址空間並且你的代碼被加載了,你就回家了。

如果您使用的是Windows,你可能也想如果你使用gcc來看看Detours.

+0

是的 - 安全問題,而不是線程安全的。最好避免。 – 2013-04-29 11:52:38

1

,並要替換的整體功能,您可以重定向,使用-Wl,wrap,functionName包裝的功能開關:https://stackoverflow.com/a/617606/111160

然後任何時候代碼想要訪問,請致電functionName它運行您提供的__wrap_functionName。您仍可以使用__real_functionName訪問原件。

如果您想在每次致電baz之前執行一些操作,請使您的__wrap_baz執行該操作,然後再調用__real_baz

相關問題