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

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

Сообщение Anonymous »

Я пытаюсь перехватить поведение открытия в Linux, поэтому пытаюсь создать модуль, который может регистрировать эти системные вызовы.
Я использую kprobe для перехвата openat2 и open, и используйте 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
но когда я набираю «домой», ничего не совпадает, даже если O действительно открывает файл в /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.
Моя система: Ubuntu 22.04.4.

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

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

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

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

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

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