linux内核模拟按键,基于Linux内核的键盘模拟实现

底层tty驱动调用receive_buf()这个函数用来发送硬件设备接收处理的字符。参见/usr/src/linux/drivers/char/n_tty.c:本文引用地址:http://www.eepw.com.cn/article/202221.htm

static void n_tty_receive_buf(struct tty_struct *tty, const

unsigned char *cp, char *fp, int count)

参数cp是一个指向设备接收的输入字符的buffer的指针。参数fp是一个指向一个标记字节指针的指针。在具体的实现中,先保存原始的tty receive_buf()函数,然后重置ldisc.receive_buf到自定义的new_receive_buf()函数来记录用户的输入。

例如:要记录在终端tty1设备上的输入。

int fd = open(/dev/tty1, O_RDONLY, 0);

struct file *file = fget(fd);

struct tty_struct *tty = file->private_data;

//保存原始的receive_buf()函数

old_receive_buf = tty->ldisc.receive_buf;

//替换成新的new_receive_buf函数

tty->ldisc.receive_buf = new_receive_buf;

//新的new_receive_buf函数

void new_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)

{

logging(tty, cp, count);

//纪录用户击键

/* 调用回原来的receive_buf */

(*old_receive_buf)(tty, cp, fp, count);

}

4.4 tty_read函数

当一个进程需要通过sys_read()函数来读取一个tty终端的输入字符时,tty_read函数就会被调用。参见文件/usr/src/linux/drives/char/tty_io.c:

static ssize_t tty_read(struct file * file, char * buf, size_t count,

loff_t *ppos)

5 结束语

目前,利用勾子函数实现基于Linux内核的键盘模拟

484dc35274441c590344ec8d77e559ac.gif的这种方法使用非常灵活,同时也可以跨平台进行移植,可通过tty和pts来记录下本地和远程会话的所有击键动作,并且也支持一些特殊的按键。当然,要使键盘模拟

484dc35274441c590344ec8d77e559ac.gif更灵活,下一步还需要更多的改进,例如增加多种不同日志记录模式的支持等。

更多计算机与外设信息请关注:21ic计算机与外设频道

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值