我想创建一个程序来收集有关用户击键的信息(键码,按下和释放时间),并将它们用作生物识别用于持续验证用户。我的方法是使用内核模块收集键击(因为你不能只是杀死内核模块),而内核模块会将信息发送到另一个进程来分析内核模块收集的数据,它会保存它到数据库并将返回内核的答案(用户是否经过身份验证),如果用户未经过身份验证,内核将锁定计算机。整个模块不会分发。
我的问题是: 1.如何从内核调用进程并向他发送数据? 2.如何从进程中向内核返回消息?
答案 0 :(得分:2)
@ basile-starynkevitch的回答和他的论点尽管是你可以采取的一种方法,这是完全正确的,并且技术上允许的是linux内核。
使用内核模块中的内核调用register_keyboard_notifier()
注册键盘通知程序回调函数。事实上,它正是为此而设计的!
你的通知程序回调函数将类似于:
int keysniffer_callback(struct notifier_block *notifier_block,
unsigned long scancode,
void *param)
{
// do something with the scancode
return NOTIFY_OK;
}
首先看https://www.kernel.org/doc/Documentation/input/notifier.txt。
答案 1 :(得分:0)
我想创建一个程序来收集有关用户击键的信息
这应该在您的display server中实践,您没有提及(Xorg,Wayland,MIR,......?)。细节很重要!
我的方法是使用内核模块
收集击键
我坚信这是一种错误的方法,你不需要任何内核模块。
我想创建一个收集有关用户击键数据的程序
然后使用普通的Unix机器。键盘有一些character device(你可以有几个键盘,或者没有键盘,或者一些虚拟键盘......)你可以read(2)。如果您想对keylogger进行编码,请明确说明。
(请注意,在未经许可且未经许可的情况下使用键盘记录程序或任何其他网络间谍活动可能是非法的;在大多数国家/地区,可能会将您送入监狱:在法国,Article 323-1 du Code Pénal惩罚至少2年的监禁;以及大多数其他国家都有类似的法律)
内核模块会将信息发送到另一个进程[....],它会将其保存到数据库
这实际上非常难以获得(你看起来很困惑)。数据库位于用户区(例如,某些RDBMS,如PostGresSQL,或某些库访问文件,如sqlite)。请注意,内核驱动程序无法(轻松可靠地)访问文件。
Linux上的所有应用程序(以及大多数守护进程和服务器)都是以execve(2)启动的(例如,通过某些unix shell进程或某些守护进程等...),我看到没有你出庭的原因。但是,一些程序(主要是init
,还有一些其他程序,例如/sbin/hotplug
)由内核启动,但这是例外(应该避免,你不需要)。
- 如何从内核调用进程
醇>
你不应该这样做。我认为您的计划没有理由避免execve
从其他进程(可能是您的init
,例如systemd)开始。
并向他发送数据?
您的流程与所有其他流程一样,通过system calls(syscalls(2)中列出)与内核进行交互。因此,您的应用程序可以使用read(2),write(2),poll(2)等。请注意netlink(7)。
- 如何从进程中向内核返回消息?
醇>
你没有。使用由应用程序代码启动的系统调用。
如果用户未经过身份验证,内核将锁定计算机。
这没有任何意义。 Screen locking是一个GUI工件(因为不是由内核代码完成,而是由ad-hoc守护程序进程完成)。当然,启用锁定时,某些进程会继续运行。许多进程是daemons或servers,它们不属于“该”用户(并且在“计算机被锁定”时继续运行)。从本质上讲,Linux& POSIX是multi-user和multi-tasking操作系统。即使在单个自然人使用的桌面Linux系统上,您也有数十个用户(即uid - 其中许多用户专门针对特定功能,请查看您的/etc/passwd
文件,请参阅{{3 }}和超过一百个进程(每个进程都有passwd(5)),使用pid或top(1)作为ps auxw
列出它们。
我相信你有错误的方法。从应用程序的角度来看,需要几天或几周才能了解有关Linux的更多信息。所以阅读一些关于Linux编程的书,例如: ps(1)或更新的东西。另请阅读:ALP
请注意,在实践中,大多数Operating Systems: Three Easy Pieces的Linux系统正在使用某些desktop environment。因此(物理)键盘由display server或X11服务器处理。您需要阅读有关显示服务器的更多信息(使用X11,Wayland之类的内容)。
因此,您需要更加具体。您可能需要与显示服务器进行交互,而不是直接与内核进行交互。
最后,一条经验法则是避免使用额外且无用的驱动程序代码使内核膨胀。你很可能完全可以在用户区做你的事。
因此,花费一周或更多阅读关于操作系统& Linux编码单行代码之前。避免内核模块,他们会咬你,你可能不需要它们(但你可能需要破解你的显示服务器或只是你的EWMH;当然,细节与X11和Wayland不同)。另请阅读window manager Linux系统。
最后,大多数Linux发行版由multiseat组成,您可以学习其源代码。因此,请花时间查看相关软件的源代码,以了解(定义不明确的)目标。还可以使用free software来了解命令和进程动态完成的系统调用。