2015-11-16 62 views

回答

2

不幸的是,查找進程的主要可執行文件vnode,proc_getexecutablevnode()的函數位於專用KPI中,該專用KPI僅適用於Apple發佈的kext。

的信息存儲在struct procp_textvp場,這再一次不是公共ABI的一部分 - 蘋果可以選擇更改其佈局,所以即使你做進口其定義爲你的代碼,你的代碼可能是在未來或舊版本的OS X中不正確。

您可能通過sysctl機制獲取信息,但我看不到明顯的方法。您應該能夠通過系統調用proc_info()獲取用戶空間中的信息。它沒有被Apple記錄,但是你可以閱讀源代碼。

最後,如果您的kext在引導時加載,您可以通過在KAUTH_SCOPE_FILEOP中註冊一個KAUTH偵聽器來跟蹤進程的可執行文件。事件KAUTH_FILEOP_EXEC會告訴你什麼時候一個進程(成功)調用exec()函數之一,包括有問題的vnode。

最後,請注意,路徑到可執行文件不一定是明確定義的。與Windows不同,正在執行的文件可以被移動或刪除,所以路徑可以改變,或完全消失。而且,文件可以被硬鏈接,在這種情況下,它們有多個路徑。 vnode_t是標識文件的內核類型,不管其名稱/路徑/等。 - 常規用戶進程將始終具有可執行文件vnode,但該vnode可能沒有有效的路徑。確保你的代碼不期望它。

+0

非常感謝@pmdj。我會嘗試'p_textvp'方法。讓你知道它的作品! – Joseph

+0

_「沒有使用p_textvp在Darwin中,proc不是地址空間的根;任務是:任務的地址空間沒有」vnode「的概念,因爲它不一定最初由映射填充[...]「_ [cont](https://lists.apple.com/archives/Darwin-drivers/2005/Dec/msg00026.html) – Joseph

+0

你知道如何訪問'p-> p_textvp' ?由於我得到'struct proc'類型的'不完整的定義,像[here](https://stackoverflow.com/questions/17512950/xnu-incudes-in-kext)。添加'proc_internal.h'會導致很多關於'lck_mtx_t'結構體定義不可見的其他錯誤。 – Joseph