- 论坛徽章:
- 0
|
10可用积分
环境Redhat9.0 kernel2.4.20-8 VM虚拟机
源码如下:
#include <linux/sched.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/file.h>
char *aim = "/mnt/usb/a"; ---------->这里一定a要是一个文件,是不是缺乏通用性 ???
MODULE_AUTHOR("petsatan@sohu");
MODULE_DESCRIPTION("Get the kernel function address ");
MODULE_LICENSE("GPL");
typedef ssize_t (*read_t)(struct file *, char *, size_t, loff_t *);
read_t orig_aim_read = NULL;
ssize_t encry_read(struct file *fp , char *buf , size_t count , loff_t *ppos)
{
ssize_t encryfile;
printk("<0> Congratulation! \n");
encryfile = orig_aim_read(fp ,buf ,count ,ppos);
return encryfile;
}
int switch_read(const char *p , read_t *orig_read , read_t new_read)
{
struct file *filep;
filep = filp_open(p , O_RDONLY , 0);
if(IS_ERR(filep))
return -1;
if(orig_read)
*orig_read = filep->f_op->read;
printk("read operation address:------- %p ------\n", filep->f_op->read);
filep->f_op->read = new_read;
filp_close(filep,0);
return 0;
}
int unswitch_read(const char *p, read_t orig_read)
{
struct file *filep;
filep = filp_open(p , O_RDONLY , 0);
if(IS_ERR(filep))
return -1;
filep->f_op->read = orig_read;
filp_close(filep,0);
return 0;
}
static int encryfile_init(void)
{
switch_read(aim , &orig_aim_read , encry_read);
printk(" <1>read() has switch!\n");
return 0;
}
static void encryfile_cleanup(void)
{
unswitch_read(aim, orig_aim_read);
printk("<2>read() has unswitch! \n");
}
module_init(encryfile_init);
module_exit(encryfile_cleanup);
输出如下:
Dec 4 21:19:36 localhost kernel: --------cc95fc68--------
Dec 4 21:19:36 localhost kernel: read() has switch!
Dec 4 21:19:47 localhost kernel: Congratulation! Get the function address !
看程序中标出的 :
现在的问题是一定要 vi /mnt/usb/a 才会执行 printk("<0> Congratulation! \n")
那是不是对/mnt/usb/中其他文件的读写没有截获到呢? 那怎么才能截获到呢?
是不是因为对ext3系统的读写是通过 generic_file_read操作的,而此函数是被导出的,是固定的地址 所以在ext3文件系统操作正常,而usb的操作对应的函数没有被导出? |
最佳答案
查看完整内容
file->f_op是在open时,从inode->i_fop赋值的; 而inode->i_fop,是在ext3_read_inode时, 从ext3_file_operations赋值的。 file只代表一个打开文件,改写它只影响该文件。 如果更改file->dentry->inode->i_fop,就不会这样了。
|