我想從kext中的PID檢索進程的路徑,如下所示:Get name from PID?但是,sys/proc_info.h
和libproc.h
不再可用(afaik)。從OSX 10.10/10.11檢索進程的路徑內核
是否有任何其他方式檢索proc_info
從一個kext進程struct proc *p
?
我想從kext中的PID檢索進程的路徑,如下所示:Get name from PID?但是,sys/proc_info.h
和libproc.h
不再可用(afaik)。從OSX 10.10/10.11檢索進程的路徑內核
是否有任何其他方式檢索proc_info
從一個kext進程struct proc *p
?
不幸的是,查找進程的主要可執行文件vnode
,proc_getexecutablevnode()
的函數位於專用KPI中,該專用KPI僅適用於Apple發佈的kext。
的信息存儲在struct proc
的p_textvp
場,這再一次不是公共ABI的一部分 - 蘋果可以選擇更改其佈局,所以即使你做進口其定義爲你的代碼,你的代碼可能是在未來或舊版本的OS X中不正確。
您可能通過sysctl機制獲取信息,但我看不到明顯的方法。您應該能夠通過系統調用proc_info()
獲取用戶空間中的信息。它沒有被Apple記錄,但是你可以閱讀源代碼。
最後,如果您的kext在引導時加載,您可以通過在KAUTH_SCOPE_FILEOP
中註冊一個KAUTH偵聽器來跟蹤進程的可執行文件。事件KAUTH_FILEOP_EXEC
會告訴你什麼時候一個進程(成功)調用exec()
函數之一,包括有問題的vnode。
最後,請注意,路徑到可執行文件不一定是明確定義的。與Windows不同,正在執行的文件可以被移動或刪除,所以路徑可以改變,或完全消失。而且,文件可以被硬鏈接,在這種情況下,它們有多個路徑。 vnode_t
是標識文件的內核類型,不管其名稱/路徑/等。 - 常規用戶進程將始終具有可執行文件vnode
,但該vnode
可能沒有有效的路徑。確保你的代碼不期望它。
非常感謝@pmdj。我會嘗試'p_textvp'方法。讓你知道它的作品! – Joseph
_「沒有使用p_textvp在Darwin中,proc不是地址空間的根;任務是:任務的地址空間沒有」vnode「的概念,因爲它不一定最初由映射填充[...]「_ [cont](https://lists.apple.com/archives/Darwin-drivers/2005/Dec/msg00026.html) – Joseph
你知道如何訪問'p-> p_textvp' ?由於我得到'struct proc'類型的'不完整的定義,像[here](https://stackoverflow.com/questions/17512950/xnu-incudes-in-kext)。添加'proc_internal.h'會導致很多關於'lck_mtx_t'結構體定義不可見的其他錯誤。 – Joseph