fanotify是一個挺好用的文件監控系統,它會檢測當前文件系統下的事件,並允許做出回應。
官方文檔https://www.man7.org/linux/man-pages/man7/fanotify.7.html
Fanotify主要有兩個函數,fanotify_init()和fanotify_mark(),
fanotify_init()會初始化一個新的fanotify組並返回一個與組關聯的事件隊列描述符fd,fanotify_init(unsigned int flags, unsigned int event_f_flags)函數接收兩個參數,第一個參數為flags,規定了哪些類型的事件會被記錄,這里使用FAN_CLASS_CONTENT,該參數也是官方手冊上推薦的應用於惡意軟件掃描的參數,第二個參數為event_f_flags,用來修飾描述符fd。
Fanotify_mark(int fanotify_fd, unsigned int flags,uint64_t mask, int dirfd, const char *pathname)函數會進一步對fanotify組進行修飾,第一個參數為init創建的fd,第二個參數flags描述了執行修改行為的方式以及被監視的文件系統類型,第三個參數mask為監聽的事件類型,這里我們監聽FAN_OPEN_PERM類型,該類型事件在目標進程獲取權限時發生,並且允許我們對其做出回應。最后兩個參數為相關的文件路徑,當參數五有效時,參數四一般不起作用。后續處理中,我們不斷讀取fd中的內容,放入fanotify_event_metadata類型的變量里,該類型結構如下
其中pid就是執行此次操作的進程pid。通過pid我們就可以獲取目標進程的相關信息。