Я пытаюсь найти правильный системный вызов используется для получения данных, отображаемых в выводе таких команд, как stat filename или stat dir.
Сначала я попробовал __x64_sys_stat, но мои обработчики не получают называется. Затем я попробовал __do_sys_stat, __x64_sys_newstat, но ни один из обработчиков не был вызван.
Ниже приведены выходные данные /proc/kallsyms,
Код: Выделить всё
user@xubun2204:~$ cat /proc/kallsyms | grep newstat
0000000000000000 t __do_sys_newstat
0000000000000000 T __x64_sys_newstat
0000000000000000 T __ia32_sys_newstat
0000000000000000 t __do_compat_sys_newstat
0000000000000000 T __ia32_compat_sys_newstat
0000000000000000 T __x64_compat_sys_newstat
0000000000000000 d event_exit__newstat
0000000000000000 d event_enter__newstat
0000000000000000 d __syscall_meta__newstat
0000000000000000 d args__newstat
0000000000000000 d types__newstat
0000000000000000 d __event_exit__newstat
0000000000000000 d __event_enter__newstat
0000000000000000 d __p_syscall_meta__newstat
0000000000000000 d _eil_addr___x64_compat_sys_newstat
0000000000000000 d _eil_addr___ia32_compat_sys_newstat
0000000000000000 d _eil_addr___ia32_sys_newstat
0000000000000000 d _eil_addr___x64_sys_newstat
user@xubun2204:~$ cat /proc/kallsyms | grep do_stat
0000000000000000 T proc_do_static_key
0000000000000000 T do_statx
0000000000000000 t do_statfs_native
0000000000000000 t do_statfs64
user@xubun2204:~$ cat /proc/kallsyms | grep sys_stat
0000000000000000 t __do_sys_stat
0000000000000000 T __x64_sys_stat
0000000000000000 T __ia32_sys_stat
0000000000000000 T __x64_sys_statx
0000000000000000 T __ia32_sys_statx
0000000000000000 t __do_sys_statfs
0000000000000000 T __x64_sys_statfs
0000000000000000 T __ia32_sys_statfs
0000000000000000 t __do_sys_statfs64
0000000000000000 T __x64_sys_statfs64
0000000000000000 T __ia32_sys_statfs64
0000000000000000 t __do_compat_sys_statfs
0000000000000000 T __ia32_compat_sys_statfs
0000000000000000 T __x64_compat_sys_statfs
0000000000000000 T kcompat_sys_statfs64
0000000000000000 T __ia32_compat_sys_statfs64
0000000000000000 T __x64_compat_sys_statfs64
0000000000000000 d _eil_addr___ia32_sys_statx
0000000000000000 d _eil_addr___x64_sys_statx
0000000000000000 d _eil_addr___ia32_sys_stat
0000000000000000 d _eil_addr___x64_sys_stat
0000000000000000 d _eil_addr___x64_compat_sys_statfs64
0000000000000000 d _eil_addr___ia32_compat_sys_statfs64
0000000000000000 d _eil_addr___x64_compat_sys_statfs
0000000000000000 d _eil_addr___ia32_compat_sys_statfs
0000000000000000 d _eil_addr___ia32_sys_statfs64
0000000000000000 d _eil_addr___x64_sys_statfs64
0000000000000000 d _eil_addr___ia32_sys_statfs
0000000000000000 d _eil_addr___x64_sys_statfs
Как я понял разницу между sys_stat и sys_statfs — это sys_stat, используемый для получения информации о файлах и каталогах, а sys_statfs — для получения информации о файловой системе.
Но в данном случае нет независимо от того, что я использую в командной строке stat (файловая система или конкретный файл или каталог), вызывается __x64_sys_statfs!
Проблема начинается, когда я хочу прочитать то, что возвращается этим системным вызовом, следует ли мне ожидать struct kstat или struct statfs?
Вот код, с помощью которого мне удается запустить обработчик kretprobe,< /p>
Код: Выделить всё
#include [*]
#include
#include
#include
#include
#include
static struct kretprobe my_kretprobe;
static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
printk("entry_handler\n");
return 0;
}
static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
printk("ret_handler\n");
return 0;
}
static int __init my_module_init(void)
{
int ret;
my_kretprobe.kp.symbol_name = "__x64_sys_statfs";
my_kretprobe.entry_handler = entry_handler;
my_kretprobe.handler = ret_handler;
my_kretprobe.maxactive = 20;
ret = register_kretprobe(&my_kretprobe);
if (ret < 0) {
printk(KERN_INFO "register_kretprobe failed, returned %d\n", ret);
return ret;
}
printk(KERN_INFO "Kretprobe registered for __x64_sys_statfs\n");
return 0;
}
static void __exit my_module_exit(void)
{
unregister_kretprobe(&my_kretprobe);
printk(KERN_INFO "Kretprobe unregistered\n");
}
module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("jelal");
MODULE_DESCRIPTION("simple kret lkm");
Код: Выделить всё
obj-m += statdata.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
В чем разница между sys_stat, sys_statfs, sys_newstat и sys_statx?
[*]Как узнать, какой системный вызов подходит для установки зонда?
[*]Какова причина того, что sys_stat не используется?
< /ul>
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/787 ... call-works