![](/img/trans.png)
[英]How to get the PID of a process by giving the process name in Mac OS X ?
[英]Get process creation notification in Mac OS X
我正在嘗試為 Mac OS X 編寫 kext,它會在任何進程啟動時收到通知。
在 Windows 中,您可以通過調用 PsSetLoadImageNotifyRoutine(...) 並指定將在進程啟動時調用的回調來完成此操作。 這是記錄的方式,它適用於從 Win 2k 開始的所有 Windows。
Mac 上有類似的嗎? 使用 kauth 進程偵聽器似乎可以實現這一點,但是 OS X 中從未實現過進程范圍。
另一種選擇是掛鈎 SYS_execve 和朋友,但這是未記錄且不受支持的方式。 我真的不想走這條路。
我不需要任何取消 - 只想在進程啟動時收到通知,並獲取它的 pid 和路徑。
嗯,你的問題有點模棱兩可。
被“在任何進程啟動時通知”恕我直言意味着fork
系統調用,而不是execve
。 但是,我不知道您是否可以通過任何官方 API 在fork
上收到通知。
如果您對execve
感興趣,請查看內核授權 (kauth) API 。
您可以在KAUTH_SCOPE_VNODE
中注冊並跟蹤在 execve 執行之前通知KAUTH_VNODE_EXECUTE
(並且可能通過回調的返回值拒絕它成功); 或在KAUTH_SCOPE_FILEOP
注冊並跟蹤在執行execve()
后要通知的KAUTH_FILEOP_EXEC
。
老問題 - 但是 - 說明 SYS_execve hooking 是唯一得到通知的方法的答案是不正確和危險的。 一方面,sysent 表沒有導出(盡管可以說它很容易找到)。 對於兩個,您必須修補內存並確保它是 rw。
在 kext 中,更好的方法是使用 MAC 框架(即強制訪問控制)。 這是在 XNU 源代碼中的 /security 分支中。 MAC 框架正是為這種操作而設計的——即沒有實際功能或地址覆蓋的通知/掛鈎,但帶有標注。 這也在一本名為“Mac OS X and iOS Internals”的書的第 14 章中有詳細介紹。
對於 2019 年后發現此問題的任何人:
Apple 有一個相對較新的 (macOS 10.15+) C
框架,稱為Endpoint Security ,它提供進程生命周期事件(除其他外)並且可以由用戶模式守護程序或新的“系統擴展”(“內核擴展”的后繼者)使用) 前提是從 Apple 獲得了適當的代碼簽名權利。 一些顯着的特點是:
ES_EVENT_TYPE_NOTIFY_EXEC
、 ES_EVENT_TYPE_NOTIFY_FORK
、 ES_EVENT_TYPE_NOTIFY_EXIT
通過es_subscribe() )pid
、 uid
等等(例如,進程創建的事件消息( es_event_exec_t )包括一個es_process_t字段,其中包含進程詳細信息,包括可執行路徑) 一段時間以來,Apple 一直在推動開發人員采用這種新框架,以支持以前的監控 API(如KAUTH
、 MAC
和OpenBSM
( /dev/auditpipe
)),因此這是我可以推薦投資的唯一解決方案。
有一些關於該主題的 WWDC 會議和示例項目: https : //developer.apple.com/documentation/endpointsecurity/monitoring_system_events_with_endpoint_security
這是使用 MAC 和 KAUTH 的示例。
https://www.synack.com/2015/11/17/monitoring-process-creation-via-the-kernel-part-i/
SYS_execve 掛鈎是在任何進程啟動時收到通知的唯一方式。 此外,您可以嘗試使用 DTrace 和 libdtrace 來接收進程啟動通知; 我一直在嘗試這種方式,但沒有成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.