是否可以創建一個系統範圍的運行時庫,以使所有系統運行進程都可以使用某些運行時類集合?這些類應該是可用的,從任何Cocoa進程的類名調用NSClassFromString
將返回一個有效的類。全局系統範圍的Cocoa運行時庫
注意:因爲我沒有訪問某些進程的代碼,我無法加載使用NSBundle
庫。更具體地說,我正在嘗試爲Apple的「Interface Builder Cocoa Touch Tool」過程提供一些類。有關我需要此功能的詳細信息,請參閱this post。
是否可以創建一個系統範圍的運行時庫,以使所有系統運行進程都可以使用某些運行時類集合?這些類應該是可用的,從任何Cocoa進程的類名調用NSClassFromString
將返回一個有效的類。全局系統範圍的Cocoa運行時庫
注意:因爲我沒有訪問某些進程的代碼,我無法加載使用NSBundle
庫。更具體地說,我正在嘗試爲Apple的「Interface Builder Cocoa Touch Tool」過程提供一些類。有關我需要此功能的詳細信息,請參閱this post。
總之,沒有。我會看到兩個向量來實現這一點:強制每個進程以某種方式對框架進行操作,或者修補現有的每個Cocoa進程將加載的系統庫以包含類。這些解決方案對於「僅在您的機器上」以外的任何其他解決方案都不會有用。
如果你想要一個「就在你的機器上」的解決方案,那麼更容易的方法就是編寫一個腳本,該腳本可以引發GDB/LLDB附加到進程,導致你的庫被加載,然後分離。這將比上述任何一種假設方法容易得多。這樣的過程可能是這樣的:
your-machine:~ you$ lldb
(lldb) attach Finder
Process 331 stopped
Executable module set to "/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder".
Architecture set to: x86_64-apple-macosx.
(lldb) expr (char)[[NSBundle bundleWithPath:@"/Path/To/Your/Framework.framework"] load]
(char) $0 = '\x01'
(lldb) detach
Detaching from process 331
Process 331 detached
(lldb) quit
your-machine:~ you$
您一定已經知道,Xcode的插件接口是不公開的,所以你已經在不支持的,可能對換出,從-不足你在這裏領土。
聽起來像* dylib注入*,我看不出你如何很早就掛鉤它(即在'launchd'本身)。 – trojanfoe
我實際上並不需要提前將其掛鉤。是否可以監視,直到「Interface Builder Cocoa Touch Tool」進程被加載,然後注入dylib? – Tarek
你可以在Xcode的調用上掛鉤它。正如@ ipmcc的答案所涵蓋的那樣;這將是「就在你的機器上」的解決方案。 – trojanfoe