对于antirootkit学生项目,我想获取内核模块中给定目录的文件名列表。我知道文件IO在内核空间中通常不是一个好主意,但这是一个特例。
我曾经filp_open
得到struct file
目录的。有了这个我有一个struct dentry
列表d_subdirs
,其中应该包含给定目录中的所有文件。
当我遍历列表,并printk的所有d_iname
的的struct dentry
应该是的短名称struct dentry
,也有非ASCII符号,并在目录中的某些文件丢失。没有运行的rootkit可以隐藏这些文件。dmesg输出如下所示:
<6>Filename: �đ�@�Y�android_module17.ko
<6>Filename: <���
<6>Filename: <�
<6>Filename: <���
<6>Filename: <�����android_module15.ko
<6>Filename: <��ŋ�android_module14.ko
<6>Filename: <���@Nj�android_module13.ko
<6>Filename: <���
<6>Filename: <����ʋ�k
<6>Filename: <��̋�android_module11.ko
<6>Filename: <���@�android_module10.ko
<6>Filename: <���@���android_module9.ko
<6>Filename: <���
<6>Filename: <�����android_module7.ko
<6>Filename: <���android_module6.ko
<6>Filename: <Ċ�@���android_module5.ko
<6>Filename: <Ŋ�
<6>Filename: <Ɗ�����10-__rttest
<6>Filename: <NJ���__rttest
<6>Filename: <Ȋ�@���proctest.ko
<6>Filename: <ʊ�
<6>Filename: <ˊ�����rt.ko
<6>Filename: <̊���android_module4.ko
<6>Filename: <͊�@���anmo.ko
<6>Filename: <���
<6>Filename: ������Z�LOST.DIR
<6>Filename: �҉�@�Z�Android
例如,缺少文件夹DCIM或名为android_module1.ko的文件。这些文件没有特别之处。
这是我的内核模块的代码:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/namei.h>
#include <asm/uaccess.h>
//replace the "" with angular brackets
int init_module(void)
{
struct file * fi;
printk(KERN_INFO "Hello android kernel...\n");
fi = filp_open("/sdcard/", O_RDONLY, 0);
//struct path testpath = fi->f_path;
struct dentry * thedentry;
thedentry = fi->f_dentry;
struct dentry * curdentry;
unsigned char * curname = NULL;
list_for_each_entry(curdentry, &thedentry->d_subdirs, d_subdirs) {
curname = curdentry->d_iname;
printk(KERN_INFO "Filename: %s \n", curname);
}
filp_close(fi, NULL);
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye android kernel...\n");
}
当我遍历列表时尝试访问inode时,android崩溃。我能以这种方式列出所有文件吗?
编辑:
有趣的是,如果我尝试在循环中像这样手动校正curdentry指针:
testchar = (char *)curdentry;
testchar = testchar + 8;
curdentry = (struct dentry *)testchar;
curname = curdentry->d_iname;
testchar = (char *)curdentry;
testchar = testchar - 8;
curdentry = (struct dentry *)testchar;
哇,这看起来很难看,但是随机符号消失了。我只是看不到此指针不匹配的来源。我是否正确使用列表功能?
您正在使用错误的字段,其中包含名称:d_iname
仅是一个缓冲区,用于保存可能无法用于大文件名的分配。实际上,您正在寻找d_name.name
。
另外,您会错误地遍历列表(我想知道如何从中获得任何结果)。d_subdirs
是头列表,并用作第二个参数list_for_each_entry()
,但在第三个参数,你应该把节点,而不是头这情况下d_entry
是d_child
场(d_u.d_child
在老版本的内核)。
这是经过一些磨合后的代码:
struct file * fi;
struct dentry * thedentry;
struct dentry * curdentry;
const char * curname = NULL;
printk(KERN_INFO "Hello android kernel...\n");
fi = filp_open("/root/", O_RDONLY, 0);
thedentry = fi->f_dentry;
list_for_each_entry(curdentry, &thedentry->d_subdirs, d_u.d_child) {
curname = curdentry->d_name.name;
printk(KERN_INFO "Filename: %s \n", curname);
}
filp_close(fi, NULL);
我在香草Linux 3.12上进行了检查。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句