Не могу прочитать аргументы sys_kill из обработчика kprobeLinux

Ответить
Anonymous
 Не могу прочитать аргументы sys_kill из обработчика kprobe

Сообщение Anonymous »

Я устанавливаю 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
Ответить

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

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

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

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

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