Anonymous
Не могу прочитать аргументы sys_kill из обработчика kprobe
Сообщение
Anonymous » 25 июн 2024, 19:12
Я устанавливаю kprobe на sys_kill и хочу отслеживать PID и сигналы.
Хотя я могу установить kprobe и получить некоторые данные в dmesg, но они либо неверны, либо я не могу понять их смысл.
Ниже приведен код, который у меня есть,
Код: Выделить всё
#include [*]
#include
#include
#include
#include
#include
static struct kprobe kp;
static int handler_pre(struct kprobe *p, struct pt_regs *regs)
{
pid_t pid = (pid_t)regs->di;
int sig = (int)regs->si;
printk(KERN_INFO "kprobe pre_handler: kill syscall - PID: %d, Signal: %d\n", pid, sig);
return 0;
}
static void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags)
{
pid_t pid = (pid_t)regs->di;
int sig = (int)regs->si;
printk(KERN_INFO "kprobe post_handler: kill syscall - PID: %d, Signal: %d\n", pid, sig);
}
static int __init kprobe_init(void)
{
kp.symbol_name = "__x64_sys_kill";
kp.pre_handler = handler_pre;
kp.post_handler = handler_post;
int ret = register_kprobe(&kp);
if (ret < 0) {
printk(KERN_INFO "register_kprobe failed, returned %d\n", ret);
return ret;
}
printk(KERN_INFO "kprobe registered for __x64_sys_kill\n");
return 0;
}
static void __exit kprobe_exit(void)
{
unregister_kprobe(&kp);
printk(KERN_INFO "kprobe unregistered\n");
}
module_init(kprobe_init)
module_exit(kprobe_exit)
MODULE_LICENSE("GPL");
Это дает мне следующий результат:
Код: Выделить всё
kernel: [ 2605.007657] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007658] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007660] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007661] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007662] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007663] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007666] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007667] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007668] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007669] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007671] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007672] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007674] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007675] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007676] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62
kernel: [ 2605.007677] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62
Я пробовал разные подходы,
Попробовал кретпробы, получил тот же результат
Я пытался проверить значение ax, чтобы убедиться, что это системный вызов kill, проверив ax с помощью __NR_kill, оно никогда не проходило мимо условия if.
Код: Выделить всё
long syscall_nr = regs->orig_ax;
// Check if it is the kill syscall (syscall number 62 on x86_64)
if (syscall_nr == __NR_kill) {
// NEVER GOT HERE
}
Поэтому я подумал, что прошу помощи здесь. Я не делаю это как часть проекта, моя цель – изучить программирование ядра и внутреннюю структуру ядра Linux.
Спасибо
Подробнее здесь:
https://stackoverflow.com/questions/786 ... be-handler
1719331928
Anonymous
Я устанавливаю kprobe на sys_kill и хочу отслеживать PID и сигналы. Хотя я могу установить kprobe и получить некоторые данные в dmesg, но они либо неверны, либо я не могу понять их смысл. Ниже приведен код, который у меня есть, [code]#include [*] #include #include #include #include #include static struct kprobe kp; static int handler_pre(struct kprobe *p, struct pt_regs *regs) { pid_t pid = (pid_t)regs->di; int sig = (int)regs->si; printk(KERN_INFO "kprobe pre_handler: kill syscall - PID: %d, Signal: %d\n", pid, sig); return 0; } static void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags) { pid_t pid = (pid_t)regs->di; int sig = (int)regs->si; printk(KERN_INFO "kprobe post_handler: kill syscall - PID: %d, Signal: %d\n", pid, sig); } static int __init kprobe_init(void) { kp.symbol_name = "__x64_sys_kill"; kp.pre_handler = handler_pre; kp.post_handler = handler_post; int ret = register_kprobe(&kp); if (ret < 0) { printk(KERN_INFO "register_kprobe failed, returned %d\n", ret); return ret; } printk(KERN_INFO "kprobe registered for __x64_sys_kill\n"); return 0; } static void __exit kprobe_exit(void) { unregister_kprobe(&kp); printk(KERN_INFO "kprobe unregistered\n"); } module_init(kprobe_init) module_exit(kprobe_exit) MODULE_LICENSE("GPL"); [/code] Это дает мне следующий результат: [code]kernel: [ 2605.007657] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007658] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007660] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007661] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007662] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007663] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007666] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007667] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007668] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007669] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007671] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007672] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007674] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007675] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007676] kprobe pre_handler: kill syscall - PID: 6029144, Signal: 62 kernel: [ 2605.007677] kprobe post_handler: kill syscall - PID: 6029144, Signal: 62 [/code] Я пробовал разные подходы, [list] Попробовал кретпробы, получил тот же результат [*]Я пытался проверить значение ax, чтобы убедиться, что это системный вызов kill, проверив ax с помощью __NR_kill, оно никогда не проходило мимо условия if. [/list] [code]long syscall_nr = regs->orig_ax; // Check if it is the kill syscall (syscall number 62 on x86_64) if (syscall_nr == __NR_kill) { // NEVER GOT HERE } [/code] Поэтому я подумал, что прошу помощи здесь. Я не делаю это как часть проекта, моя цель – изучить программирование ядра и внутреннюю структуру ядра Linux. Спасибо Подробнее здесь: [url]https://stackoverflow.com/questions/78668467/cant-read-sys-kill-arguments-from-a-kprobe-handler[/url]