В среде POSIX как я могу отслеживать файлы, к которым обращается дочерний процесс? - PullRequest
1 голос
/ 14 января 2010

У меня есть собственное приложение POSIX, которое запускает дочерний процесс. Я хочу, чтобы родительский процесс был уведомлен с именами всех файлов, которые дочерний процесс читает или пишет, а также именами файлов любых дочерних процессов, которые порождает дочерний процесс, и любых динамических библиотек, которые он загружает. Точно так же мне нужно отслеживать все дочерние процессы, порожденные дочерними процессами и т. Д.

Как это сделать?

1 Ответ

1 голос
/ 14 января 2010

У меня есть две идеи для этого.

Метод 1 - «Реальный путь».

Я думаю, вы хотите ptrace . Но это не будет легко использовать.

По сути, этот вызов предназначен для написания отладчика. Обратите внимание, что PTRACE_SYSCALL шагает до следующего системного вызова. В этот момент вы можете использовать больше ptrace вызовов для просмотра памяти процесса, чтобы наблюдать, скажем, вызов open().

Метод 2 - Ленивый, хакерский путь.

Вы можете использовать переменную окружения LD_PRELOAD. То есть напишите разделяемую библиотеку с собственной реализацией вызовов, которые вы хотите перехватить (скажем, open(), dlopen()), добавив свой собственный код и отправив его в обычную версию libc. Затем вы указываете переменную среды LD_PRELOAD на эту общую библиотеку, чтобы динамический компоновщик загружал ее при запуске процесса.

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

...