Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2009306
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类: LINUX

2006-04-16 00:00:07

通常黑客在获得系统的root权限后,都要在系统上留下一定的后门,以备再次登陆之便。后门的留法可谓多种多样,但是多数都是采用替换系统配置文件,或者是其它二进制可执行文件的方法来实现。以往的做法是在做完系统后,对系统安全相关的配置文件和可执行文件进行校验,生成校验码,保存下来,在以后的系统检察中,查看文件的校验码是否改变,如果发生改变,则可以认为系统已被攻破,不再可信,需要恢复!这确实能够达到目的,但是这种做法欠实时性,并且效率较为低下。Linux系统的2.6.13以上内核为我们提供了另一种监视文件系统变化的途径,它就是inotify机制!
inotify机制是由著名开源桌面搜索首先引入的,因为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错误理解为一个可执行程序将自己删除和移动,正确的解释应该是加入监视列表中的某个文件或者目录被删除,或者是被移动,并且移动之后这个文件仍在监视范围之内,直到它被删除。
我写了一个简单的示例程序,用来监视系统内重要系统文件改变,详见附件!
附件:

参考链接:
http://www-128.ibm.com/developerworks/linux/library/l-inotify.html


阅读(1120) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~