Я использую 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
Я также пытался использовать следующее имя_символа: __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
Мобильная версия