³ÏÒâÇë½ÌÒ»¸öfilp_openµÄÎÊÌâ¡£
³ÏÒâÇë½ÌÒ»¸öfilp_openµÄÎÊÌâ¡£´ó¼ÒÓ¦¸Ã¶¼ÖªµÀfilp_open(const char * filename, int flags, int mode)ÊÇ´ò¿ªÎļþÓõġ£µ«ÎÒÊǸö²ËÄñ£¬Óö¼û¸öÎÊÌ⣬Èç¹ûfilename£½NULLʱ´ò¿ªµÄÊÇÄĸöÎļþ£¬ÊÇpwdÏÔʾµÄµ±Ç°Ä¿Â¼Âð,»¹ÊÇÁíÓиßÉÒ壿Çë¸ßÊÖ²»ÁßÖ¸½Ì£¡
лÏÈ£¡
ÆäʵÎÒÔÚ¿´ÏÂÃæµÄ´úÂ룬ͨ¹ývfs²ãÀ´½Ù³Öϵͳµ÷Óᣵ«²»ÖªµÀÕâ¸öopt_fsΪʲôΪNULL£¬ÎªÊ²Ã´Òª¶ÔNULLµÄÎļþ½Ø»ñreaddirÕâ¸öº¯Êý£¿£¿£¿
Íû²»Áߴͽ̣¡£¡£¡
MODULE_AUTHOR("xunil@BMY");
MODULE_DESCRIPTION("By utilizing the VFS filesystem, this module can capture
system calls.");
MODULE_LICENSE("GPL");
char *opt_fs=NULL; // <---------×¢ÒâÕâÀïÊÇNULL
typedef int (*readdir_t)(struct file *,void *,filldir_t);
readdir_t orig_opt_readdir=NULL;
int myreaddir(struct file *fp,void *buf,filldir_t filldir)
{
int r;
printk("<1>You got me partner!\n");
r=orig_opt_readdir(fp,buf,filldir);
return r;
}
int patch_vfs(const char *p,readdir_t *orig_readdir,readdir_t new_readdir)
{
struct file *filep;
filep=filp_open(p,O_RDONLY,0);//<---------ÔÚÕâÀï´ò¿ªÁËfilenameΪNULLµÄÎļþ£¬£¿£¿£¿£¿Ê²Ã´Òâ˼£¿£¿£¿
if(IS_ERR(filep))
return -1;
if(orig_readdir)
*orig_readdir=filep->f_op->readdir;
filep->f_op->readdir=new_readdir;
filp_close(filep,0);
return 0;
}
int unpatch_vfs(const char *p,readdir_t orig_readdir)
{
struct file *filep;
filep=filp_open(p,O_RDONLY,0);
if(IS_ERR(filep))
return -1;
filep->f_op->readdir=orig_readdir;
filp_close(filep,0);
return 0;
}
static int patch_init(void)
{
patch_vfs(opt_fs,&orig_opt_readdir,myreaddir);
printk("<1>VFS is patched!\n");
return 0;
}
static void patch_cleanup(void)
{
unpatch_vfs(opt_fs,orig_opt_readdir);
printk("<1>VFS is unpatched!\n");
}
module_init(patch_init);
module_exit(patch_cleanup);
×Ô¼ºÏȶ¥Ò»¸ö£¡£¡
×Ô¼ºÏȶ¥Ò»¸ö£¡£¡Ò³:
[1]