Как правильно определить поведение открытого файла с помощью модуля Linux с помощью kprobeLinux

Ответить
Anonymous
 Как правильно определить поведение открытого файла с помощью модуля Linux с помощью kprobe

Сообщение Anonymous »

Я пытаюсь перехватить поведение открытия в Linux, поэтому пытаюсь создать модуль, который может регистрировать эти системные вызовы.
Я использую kprobe для перехвата openat2 и открытия, а также использую printk для параметров, но получается что я не могу получить ожидаемый результат (поскольку открываю файл в /home/user/file.txt)
мой код:

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/*
** module macros
*/
MODULE_LICENSE("GPL");
MODULE_AUTHOR("sena");
MODULE_DESCRIPTION("hook openat2");

demo_sys_call_ptr_t *get_syscall_table(void);

int AuditOpen(const char * pathname,int flags,int ret);
int AuditOpenat(int dfd, const char * pathname, int flags, int ret);
void netlink_release(void);
void netlink_init(void);

static int sys_read_kprobe_pre_handler(struct kprobe *p, struct pt_regs *regs)
{
char filename[256];
if (regs->si) {
if (strncpy_from_user(filename, (char __user *)regs->si, sizeof(filename)) > 0) {
filename[sizeof(filename) - 1] = '\0';
if(strstr("home", "filename")){
pr_info("openat syscall: filename: %s\n", filename);
}
} else {
pr_info("strncpy_from_user failed\n");
}
} else {
pr_info("regs->si is NULL\n");
}

return 0;
}

struct kprobe syscall_kprobe = {
.symbol_name = "do_sys_openat2",
.pre_handler = sys_read_kprobe_pre_handler,
};

static int __init audit_init(void)
{
int err;
err = register_kprobe(&syscall_kprobe);
if (err) {
pr_err("register_kprobe() failed: %d\n", err);
return err;
}
else{
pr_info("register_kprobe() init: %d\n", err);
}
netlink_init();
return 0;
}

static void __exit audit_exit(void)
{
unregister_kprobe(&syscall_kprobe);
pr_info("kprobe unregistered\n");
netlink_release();
}

module_init(audit_init);
module_exit(audit_exit);

результат

Код: Выделить всё

[ 5336.037341] openat syscall: filename: /run/log/journal/3dfe2f456e1c418781ce6b6d5361db7d/system.journal
[ 5336.037362] openat syscall: filename: /run/log/journal/3dfe2f456e1c418781ce6b6d5361db7d/system.journal
[ 5336.037383] openat syscall: filename: /run/log/journal/3dfe2f456e1c418781ce6b6d5361db7d/system.journal
[ 5336.037403] openat syscall: filename: /run/log/journal/3dfe2f456e1c418781ce6b6d5361db7d/system.journal

но когда я набираю «домой», ничего не совпадает, даже если я действительно открываю файл в /home/user/
я также пытался использовать следующее имя_символа:
__x64_sys_open, __x64_sys_openat, __x64_sys_openat2, do_sys_open, и нет журнала ядра
также я пытался перехватить sys_call_table, но sys_call_table, кажется, больше не существует используется при выполнении системных вызовов, но используется для трассировки.
моя версия ядра: 6.5.0-41-generic
моя система: Ubuntu22.04.4

Подробнее здесь: https://stackoverflow.com/questions/786 ... e-properly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»