2010-04-22 77 views

回答

22

答案取決於您是要在自己的應用程序還是系統範圍內執行此操作。在你自己的應用程序中,它非常簡單;動態鏈接器提供了諸如DYLD_INSERT_LIBRARIES之類的功能。如果您爲了調試/檢測目的而執行此操作,請檢查DTrace。

您可以使用方法混搭替換Objective-C方法實現,例如, JRSwizzle或Apple的method_exchangeImplementations(10.5+)。

如果要在整個系統範圍內修改庫行爲,則需要加載到其他進程的地址空間。最初設計用於其他用途(input managersscripting additions

  • 兩個加載機制常被濫用的用於此目的,但我不會真的建議他們。
  • mach_inject/mach_override是分別用於加載代碼和替換函數實現的開源庫集合;但是,您有責任編寫使用這些庫的自己的應用程序。 (此外,看一看this answer;您需要特殊權限代碼注入到其他進程。)

請記住,應用程序打補丁/代碼注入非調試的目的強烈地受到蘋果和某些Mac氣餒用戶(和開發人員)對這種做法極爲關鍵。大部分這種批評都是知之甚少的,但是有一些合法的寫得很差的「插件」(尤其是那些修補了Safari的插件),這些插件與應用程序崩潰和問題有牽連。代碼防守。

(聲明:我是一個(免費)APE模塊的作者和它使用mach_inject的應用程序)

+0

鏈接是死有什麼更新?我正在談論SDK – 2013-05-21 00:34:11

+1

APE現在基本上不受支持,而且幾個操作系統版本還沒有正式發佈 - 你最好的選擇是mach_inject。 – 2013-05-21 02:24:46

+0

由於SIP,El Capitan及以上版本現在忽略'DYLD_INSERT_LIBRARIES'。 – Qix 2016-08-08 01:43:40