免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1011 | 回复: 0
打印 上一主题 下一主题

利用inotify监视系统文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-16 00:00 |只看该作者 |倒序浏览

               
                通常黑客在获得系统的root权限后,都要在系统上留下一定的后门,以备再次登陆之便。后门的留法可谓多种多样,但是多数都是采用替换系统配置文件,或者是其它二进制可执行文件的方法来实现。以往的做法是在做完系统后,对系统安全相关的配置文件和可执行文件进行校验,生成校验码,保存下来,在以后的系统检察中,查看文件的校验码是否改变,如果发生改变,则可以认为系统已被攻破,不再可信,需要恢复!这确实能够达到目的,但是这种做法欠实时性,并且效率较为低下。Linux系统的2.6.13以上内核为我们提供了另一种监视文件系统变化的途径,它就是inotify机制!
inotify机制是由著名开源桌面搜索
beagle
首先引入的,因为PC环境中较少有文件系统的变化,并且没有必要为每次文件系统的变化都重建索引,那样做效率是及其低下的,事实上,我们只需要重建更改部分的索引就行了。所以inotify就诞生了。inotify以前曾用设备文件的方式实现内核和用户空间的通信,现在改成了系统调用并且被官方内核采纳。
inotify提供的系统调用接口很是简便,总共只有三个:
int inotify_init (void); /*初始化inotify */
int inotify_add_watch (int __fd, const char *__name, uint32_t __mask); /* 将文件__name加入监视列表,成功后返回监视描述符 */
int inotify_rm_watch (int __fd, uint32_t __wd); /* 将__wd所指的文件从监视列表中剔除 */
之后就可以用系统调用read从描述符fd中读取inotify_event结构了。因为它是文件描述符,所以select和poll仍然有效。
/* Structure describing an inotify event.  */
struct inotify_event
{
  int wd;               /* Watch descriptor.  */
  uint32_t mask;        /* Watch mask.  */
  uint32_t cookie;      /* Cookie to synchronize two events.  */
  uint32_t len;         /* Length (including NULs) of name.  */
  char name __flexarr;  /* Name.  */
};
注意:name是个可变长度的数组,最小为零,长度由len给出,包含了结尾符'\n',name只是相对于监视路径的相对文件路径,所以发生在被监视文件上的操作name字段长度为0!
inotify能监视的事件目前有:
#define IN_ACCESS        0x00000001     /* File was accessed.  */
#define IN_MODIFY        0x00000002     /* File was modified.  */
#define IN_ATTRIB        0x00000004     /* Metadata changed.  */
#define IN_CLOSE_WRITE   0x00000008     /* Writtable file was closed.  */
#define IN_CLOSE_NOWRITE 0x00000010     /* Unwrittable file closed.  */
#define IN_CLOSE         (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* Close.  */
#define IN_OPEN          0x00000020     /* File was opened.  */
#define IN_MOVED_FROM    0x00000040     /* File was moved from X.  */
#define IN_MOVED_TO      0x00000080     /* File was moved to Y.  */
#define IN_MOVE          (IN_MOVED_FROM | IN_MOVED_TO) /* Moves.  */
#define IN_CREATE        0x00000100     /* Subfile was created.  */
#define IN_DELETE        0x00000200     /* Subfile was deleted.  */
#define IN_DELETE_SELF   0x00000400     /* Self was deleted.  */
#define IN_MOVE_SELF     0x00000800     /* Self was moved.  */
/* Events sent by the kernel.  */
#define IN_UNMOUNT       0x00002000     /* Backing fs was unmounted.  */
#define IN_Q_OVERFLOW    0x00004000     /* Event queued overflowed.  */
#define IN_IGNORED       0x00008000     /* File was ignored.  */
/* Special flags.  */
#define IN_ISDIR         0x40000000     /* Event occurred against dir.  */
#define IN_ONESHOT       0x80000000     /* Only send event once.  */
有一点需要指名,有的文档将IN_DELETE_SELF和IN_MOVE_SELF错误理解为一个可执行程序将自己删除和移动,正确的解释应该是加入监视列表中的某个文件或者目录被删除,或者是被移动,并且移动之后这个文件仍在监视范围之内,直到它被删除。
我写了一个简单的示例程序,用来监视系统内重要系统文件改变,详见附件!
附件:
inotify
参考链接:
http://www-128.ibm.com/developerworks/linux/library/l-inotify.html
http://soft.yesky.com/os/lin/326/2237826.shtml
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/5251/showart_100448.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP