2013-10-07 57 views
0

我已經寫了一個在Mac(山獅子)取景器插件,它完美的作品,但我必須與sudo運行捆綁。然後我做一個軟件包(Packagemaker)來運行這個軟件包,它失敗了(正確安裝,如果我通過點擊桌面圖標運行它失敗,如果通過命令行使用sudo運行它,它會工作)。 有沒有人知道如何解決這個問題就像安裝dropbox(然後同步圖標顯示)如何mach_inject沒有sudo

回答

3

你面臨的問題是,在內部,mach_inject調用函數task_for_pid。

該函數返回內核任務ID爲給定的進程PID,並且由於安全方面的原因,蘋果現在需要使用此功能只能採取從那些要麼procmod組中的用戶。這解釋了爲什麼運行sudo適合你。

如果你只是發展這個只是自己使用,最簡單的方法是將自己添加到procmod組。但是,如果要分發應用程序,則需要確保任何安裝程序安裝程序以作爲root或procmod組的成員運行。

一種可能是您的應用程序分爲兩個部分,其中第二個註冊到使用SMJobBless提升的權限運行。如果你不用Objective-C編程,不要擔心,因爲SMJobBless的實際部分只需要C函數調用;尋找AuthorizationCopyRightsSMJobBlessgiven example code

或者,如果應用程序代碼簽名,應該工作過,但它不是我嘗試過自己。你可以read about that here


隨着OS X 10.11(酋長)的,task_for_pid是有資格的函數調用,只有其證書在特定權限提供給軟件,並且不再提供給第三方開發者。

這打破mach_inject,使其難以檢索另一個進程的馬赫任務,而SIP(System Integrity Projection)已啓用。

+0

我已經檢查的Dropbox,盒和谷歌驅動器,我發現盒子可能使用你所提到的(分成兩個部分),我想這一點,但我仍然不知道Dropbox和谷歌驅動器如何解決此工作的方法?你可以告訴這兩個也使用mach_inject,儘管代碼逆向工程。但似乎他們不使用任何提升的特權技能? – Jet

+1

我已驗證您提到的方法(將應用程序分爲兩部分)。有用。謝謝。 – Jet