Я пишу LKM, который перехватывает функцию с помощью пользовательской функции. Для этого я изменяю пролог функции с помощью
mov rax, <custom_func_addr> // Intel syntax.
jmp rax
Точный код операции: "\x48\xb8\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe0" // 8 '\x00' are replaced with actual address.
Код работает нормально. Говорят, я подключаю vfs_read (), он работает соответственно.
Я наблюдал один случай, когда перехват не удался:
void foo(char *func) {
unsigned long addr = get_sym_addr(func); // gets the address of function.
DEBUG("function %s addr : %lu\n", func, addr);
hook((void*)addr, &test_func_hooked); // hook it with custom function.
void (*test_func_orig) (int) = addr; // get ptr to the function.
test_func_orig(20); // call through func ptr.
test_func(10); // call function directly.
}
// defined in same file.
void test_func(int a) {
printk("a = %d\n", a);
}
Однако перехват происходит правильно, когда функция вызывается с использованием func ptr. и, если я вызываю функцию напрямую как - test_func (10), ловушка не вызывается.
Что мне здесь не хватает? Я протестировал модуль, подключив vfs_read (), всякий раз, когда «чтение» приходит к любому файлу, вызывается ловушка. Только в этом конкретном случае, когда функция для перехвата находится в том же файле, он не работает.