Модуль ядра Linux: перехват итерационной функции виртуальной файловой системы

Популярным способом скрытия процессов от пользователя является захват итерационной функции для каталога /proc. Это можно сделать следующим образом:

struct file *filep = filp_open("/proc", O_RDONLY, 0));
filep->f_op->iterate = p // We swap the pointer with our hacked iterate

Я работаю над методом обнаружения, где я хотел бы восстановить исходную функцию итерации (предположив, что она уже была захвачена). Есть ли способ найти исходную функцию итерации, которая используется для каталога/proc?

Ответ 1

Вы можете попробовать эвристический подход. Адрес исходной функции будет в той же общей области, что и другие функции proc, в то время как адрес функции угонщика будет заметно отличаться. Затем вы разбираете машинный код функции угонщика. Перед тем, как он вернется, функция захватчика должна будет перейти к исходной функции, поэтому вы увидите все инструкции ветвления и проверьте, какой из них будет соответствовать другим исходным адресам.

Ответ 2

Я предполагаю, что вы знаете, какую версию ядра вы используете?

Просто скопируйте эту версию функции в свой модуль и переопределите указатель итерации с адресом своей копии.

Это должно быть функционально эквивалентным, хотя не известно, какие другие зла может быть выпущен модуль rouge.