我需要劫持我自己的進程的所有操作系統調用。我不能重寫代碼,因爲它部分不是我的代碼(插件)。如果我想調用原始實現,我需要能夠在特定系統調用的實現中決定。如何掛鉤我自己的進程的所有操作系統調用?
操作系統將在第一個Windows XP和更高版本。稍後os x 10.5及更高版本將隨後發佈。從具有32位版本的Windows開始,後來適用於所有操作系統也是64位版本。
我發現了很多關於鉤住其他進程的文檔和工具,但是我希望我的工作更簡單,我希望能有一些源代碼。
非常感謝Bernd。
我需要劫持我自己的進程的所有操作系統調用。我不能重寫代碼,因爲它部分不是我的代碼(插件)。如果我想調用原始實現,我需要能夠在特定系統調用的實現中決定。如何掛鉤我自己的進程的所有操作系統調用?
操作系統將在第一個Windows XP和更高版本。稍後os x 10.5及更高版本將隨後發佈。從具有32位版本的Windows開始,後來適用於所有操作系統也是64位版本。
我發現了很多關於鉤住其他進程的文檔和工具,但是我希望我的工作更簡單,我希望能有一些源代碼。
非常感謝Bernd。
有很多掛鉤庫可以讓你做到這一點,例如Windows上的Detours或madCodeHook。毫無疑問,OSX上有類似的庫,我只是不知道它們!
鉤住一個例程並用你自己的實現代替它是很容易的。在某些情況下保留運行原始例程的選項並不那麼容易,這就是使用鉤子庫會爲您帶來痛苦的地方。
當選擇掛鉤庫或自己實現一個庫時,請確保它是線程安全的! – Grim 2011-05-23 12:53:28
謝謝。起初我想,呃,我知道這些圖書館。但實際上你的回答激勵我重新思考,現在我看到了一種實際使用這些庫的方法。所以,非常感謝。 – 2011-05-24 23:06:08
在Mac OS X上,可以使用宏DYLD_INTERPOSE
覆蓋功能(如果需要,也可以使用DYLD_INSERT_LIBRARIES
)。這個答案有一個例子:Ansi C patch using dlsym compiles OK under linux but fails on Mac Os X
對於DYLD_INSERT_LIBRARIES爲+1 – 2013-05-20 00:06:49
對於Windows,有開源替代品Microsoft Detours稱爲EasyHook:
坦率地說,*所有*系統調用是一個許多。最好的做法可能是編寫一個可加載的內核模塊,在該模塊中你可以訪問每一個系統調用。在我看來,只涉及與您的問題相關的系統調用的方法將是一個更明智的舉措。 – 0xC0000022L 2011-05-22 21:39:36