2015-01-17 4 views
11

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

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_map_files_readdir] (http://lxr.free-electrons.com/source/fs/proc/base.c#L1841) напрямую. Конечно, если злоумышленник имеет доступ на запись к ядру, он тоже может это изменить. – zch

+0

@zch Не могли бы вы рассказать мне, как я могу получить доступ к этой функции? Его нет в sysmap. – AlexSee

+0

Правильно, это статическая функция, поэтому я не уверен, что этот символ будет присутствовать в результирующем ядре. Вы можете попробовать установить второй 'procfs' и, возможно, там вы сможете обнаружить некоторые простые атаки такого рода. – zch

ответ

1

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

0

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

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

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

+0

Я боюсь, что это не так просто, когда вы копируете функцию дословно, есть еще много других вещей, которые нужна этой функции и которые она не может найти в адресное пространство модуля. Возможно, это возможно, но мне не удалось его скомпилировать. – AlexSee