我试图找到像.pdf,.doc,.docx等文件的文件类型,但是以编程方式不使用shell命令。实际上我必须创建一个阻止访问特定扩展名文件的应用程序。我已经在LKM中挂了sys_call_table,现在我希望在触发打开/读取系统调用时,我的LKM会检查文件类型。
我知道我们有一个当前指针可以访问当前的进程结构,我们可以使用它来查找存储在dentry结构中的文件名,在Linux中,文件类型由存储在起始字节中的幻数标识文件。但我不知道如何找到文件类型及其存储的确切位置?
答案 0 :(得分:6)
Linux没有“存储”其文件的文件类型(与Mac OS'resource fork不同,我认为这是最知名的平台)。文件只是命名的字节流,它们没有操作系统隐含的结构。
你要么告诉程序要使用哪个文件(然后它就是你说的话),要么程序使用更高级别的功能来解决它。
有些程序会重新发明这个特定的轮子(我负责one of those),但你也可以使用例如file(1)
。当然,这需要你的程序解析并“理解”你将获得的文本输出,这在某种意义上只会解决问题。
但是,我不认为从内核空间调用file
是非常明智的,因此最好为所需的任何类型集重新创建测试,以保持它的小。
换句话说,我的意思是你应该简单地重新实现所需的测试。这一般来说非常复杂,所以如果你真的需要尽可能多地使用它,那可能不是一个好主意。 :/
答案 1 :(得分:2)
实际上我必须创建一个阻止访问特定扩展名文件的应用程序。
这是一个有缺陷的要求。如果您通过文件扩展名检查,那么您将错过不使用扩展的文件,这在Linux中非常常见,因为它不使用文件扩展名。
在Linux中检测文件类型的官方认可方式是他们的神奇数字。 shell命令file
基本上只是libmagic的包装器,因此您可以选择链接到该库