2013-08-29 56 views
0

是否可以創建一個系統範圍的運行時庫,以使所有系統運行進程都可以使用某些運行時類集合?這些類應該是可用的,從任何Cocoa進程的類名調用NSClassFromString將返回一個有效的類。全局系統範圍的Cocoa運行時庫

注意:因爲我沒有訪問某些進程的代碼,我無法加載使用NSBundle庫。更具體地說,我正在嘗試爲Apple的「Interface Builder Cocoa Touch Tool」過程提供一些類。有關我需要此功能的詳細信息,請參閱this post

+0

聽起來像* dylib注入*,我看不出你如何很早就掛鉤它(即在'launchd'本身)。 – trojanfoe

+0

我實際上並不需要提前將其掛鉤。是否可以監視,直到「Interface Builder Cocoa Touch Tool」進程被加載,然後注入dylib? – Tarek

+0

你可以在Xcode的調用上掛鉤它。正如@ ipmcc的答案所涵蓋的那樣;這將是「就在你的機器上」的解決方案。 – trojanfoe

回答

1

總之,沒有。我會看到兩個向量來實現這一點:強制每個進程以某種方式對框架進行操作,或者修補現有的每個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的插件接口是不公開的,所以你已經在不支持的,可能對換出,從-不足你在這裏領土。

+0

謝謝@ipmcc。爲什麼這隻限於我的機器?我不能創建一個可執行文件,直到我的目標進程已經被加載,然後執行你的上面的腳本(從我的可執行文件中)來注入框架? – Tarek

+0

當然,你可以這樣做,但是,將會出現各種權限問題,並且可能需要啓動作業來監視新進程。總之,這對於試圖使用它的人來說不會是一個很好的軟件體驗。我當然不會將軟件作爲一種產品來推銷這樣的產品(它肯定會永遠不會被允許在App Store上使用,因爲使用私有API會成爲更重要的進攻)。 – ipmcc

+0

再次感謝@ ipmcc,我可能會接受你的建議並尋找另一種解決方案。 – Tarek