Перехват sys_execve () в Linux 3.x - PullRequest
       23

Перехват sys_execve () в Linux 3.x

5 голосов
/ 04 декабря 2011

Я пытаюсь подключить функцию sys_execve() в ядре Linux 3.x, изменив таблицу системных вызовов.Проблема в том, что sys_execve() должен возвращать код ошибки только в случае неудачного выполнения.С помощью функции-оболочки, которую я использую (см. Ниже), когда sys_execve() вызывается на допустимом исполняемом файле, он работает нормально, и все работает.Однако, когда он вызывается для несуществующего файла или чего-то еще, что вызывает состояние ошибки, вызывающая программа вылетает с:

segfault at 3b ip 000000000000003b...

Использование strace для проверки возвращаемого значения из перехваченных sys_execve() показов-1 или ENOSYS вместо правильного кода ошибки, что смущает меня, так как я проверил сборку своей функции-оболочки и исходный код Linux для sys_execve().Любые предложения о том, почему мой упаковщик неправильно передает код ошибки?

asmlinkage long new_execve(const char* name, const char const** argv, const char const** envp, struct pt_regs* regs) {
    return orig_func(name, argv, envp, regs);
}

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

Вы не можете перехватить execve, изменив таблицу системных вызовов таким образом, как при x86_64 sys_execve вызывается из stub_execve. Итак, цепочка вызовов sys_call_table[NR_execve] -> stub_execve -> sys_execve -> do_execve ... Взгляните на stub_execve на LXR.

0 голосов
/ 07 ноября 2016

В прошлом перехват системных вызовов в ядре Linux был более простой задачей, однако в более новых ядрах к системным вызовам добавлялись заглушки сборок.Чтобы решить эту проблему, я исправляю память ядра на лету.

Мое полное решение для перехвата sys_execve можно посмотреть здесь: https://github.com/kfiros/execmon

...