簡體   English   中英

在 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_new_client()
  • 粒度事件類型訂閱模型(例如ES_EVENT_TYPE_NOTIFY_EXECES_EVENT_TYPE_NOTIFY_FORKES_EVENT_TYPE_NOTIFY_EXIT通過es_subscribe()
  • 豐富的事件上下文,包括piduid等等(例如,進程創建的事件消息( es_event_exec_t )包括一個es_process_t字段,其中包含進程詳細信息,包括可執行路徑)
  • 可以根據源(父)進程(例如es_mute_process() )“靜音”(屏蔽)事件,以幫助處理信號與噪聲和性能影響。

一段時間以來,Apple 一直在推動開發人員采用這種新框架,以支持以前的監控 API(如KAUTHMACOpenBSM ( /dev/auditpipe )),因此這是我可以推薦投資的唯一解決方案。

有一些關於該主題的 WWDC 會議和示例項目: https : //developer.apple.com/documentation/endpointsecurity/monitoring_system_events_with_endpoint_security

SYS_execve 掛鈎是在任何進程啟動時收到通知的唯一方式。 此外,您可以嘗試使用 DTrace 和 libdtrace 來接收進程啟動通知; 我一直在嘗試這種方式,但沒有成功。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM