[学习记录]fanotify
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我们就可以获取目标进程的相关信息。