2011-11-23 121 views
3

我正在嘗試爲Mac OS X編寫kext,在任何進程啓動時都會收到通知。在Mac OS X中獲取進程創建通知

在Windows中,您可以通過調用PsSetLoadImageNotifyRoutine(...)並指定將在進程啓動時調用的回調來執行此操作。這是文檔化的方式,它可以在Win 2k以上的所有Windows上運行。

有什麼類似的Mac?似乎可以使用kauth進程偵聽器來實現,但是進程範圍從未在OS X中實現過。

另一種替代方法是掛鉤SYS_execve和好友,但這是未記錄和不支持的方式。我真的不想這樣。

我不需要取消任何取消 - 只是希望在進程啓動時得到通知,並獲得它的路徑&路徑。

回答

2

那麼,你的問題有點含糊。

當「任何進程啓動時通知」,恕我直言,系統調用fork,而不是execve。不過,我不知道您是否可以通過任何官方API在fork上收到通知。

如果您對execve感興趣,請查看kernel authorization (kauth) API

您可以在KAUTH_SCOPE_VNODE中註冊,並跟蹤KAUTH_VNODE_EXECUTE在execve執行之前被通知(並可能拒絕它通過回調函數返回值);或者在KAUTH_SCOPE_FILEOP中註冊並且跟蹤KAUTH_FILEOP_EXEC在執行execve()之後被通知。

+0

這是一個很好的信息!我只是試過,它的工作原理。但是,這僅適用於進程啓動事件。我如何獲得流程退出事件? –

+0

這種方式將無法正常工作。正如我之前告訴的那樣,最好爲這項任務設置鉤子。 –

0

SYS_execve掛鉤只有在任何進程啓動時纔會被通知。 另外,您可以嘗試使用DTrace和libdtrace來接收進程啓動通知;我一直在嘗試這種方式,但沒有成功。

+0

你好Александр。謝謝回覆。我不認爲掛鉤SYS_execve是一個正確的選擇,因爲我的kext將被大多數殺毒軟件標記爲rootkit。這種方法似乎很不穩定,因爲查找同義表可能會很棘手。此外,使用libdtrace似乎不是一個好主意,主要是因爲接口可能會改變,所以我將不得不重新編譯我的代碼。我想知道,我可以在用戶模式應用程序中收到關於進程開始/結束的通知嗎?我想知道,大多數防病毒軟件在Mac OS上如何操作?掛鉤系統調用? –

+0

您無法在用戶模式應用程序中收到關於進程開始/結束的通知。 Antiviruses掛鉤系統調用。如果時間延遲對您不重要,您可以使用[此信息](http://macosinternals.com/index.php?option=com_content&view=article&id=7:how-to-obtain-processes-list&catid=3: xnu&Itemid = 6) –

1

老問題 - 但 - 說明SYS_execve掛鉤的答案是被通知的唯一方法是不正確和危險的。首先,同意表不會被導出(儘管可以很容易地找到它)。對於兩個,你必須修補內存並確保它是rw。

在kext中,有一種更好的方式是使用MAC框架(這將是強制訪問控制)。這在XNU來源和/ security分支中。 MAC框架專門用於這種操作 - 即通知/掛鉤而不用實際功能或地址覆蓋,但帶有標註。這也在第14章「Mac OS X和iOS內部版本」一書中詳細介紹。