Способ перехвата активности файловой системы дочернего процесса

StackOverflow https://stackoverflow.com/questions/1030849

Вопрос

У меня есть небольшое приложение командной строки, написанное на C, которое действует как оболочка / средство запуска для других программ (думаю: xargs). Приложение написано для компиляции в FreeBSD / Linux (через fork () / exec ()) и Windows (CreateProcess ()). Помимо возможности перехватывать, вводить или иным образом манипулировать аргументами командной строки для дочернего приложения, мне было интересно, существует ли простой способ перехватить активность файловой системы дочерней программы (или ее дочерних элементов и т. Д.). В основном меня интересуют только имена файлов, доступные для чтения или записи, но не содержимое указанных файлов, и я хотел бы, чтобы перехват был максимально легким.

При поиске некоторых релевантных ключевых слов сверху, кажется, есть много способов сделать это в Win32. От драйверов фильтров файловой системы до несанкционированного доступа к заголовкам таблицы импорта PE. Ничто из этого не кажется тривиальным или что-то, что я мог бы содержать в исполняемом файле моей программы-оболочки (например, большинству потребовались бы дополнительные библиотеки DLL или файлы драйверов вместе с основным исполняемым файлом). Кроме того, я бы хотел, чтобы это работало в Windows XP до 7, если это возможно , без необходимости взломать UAC или другие дельты платформы. Это мой дочерний процесс, поэтому я считаю, что должен иметь возможность безопасно контролировать его активность:)

В Linux есть inotify (), но он контролирует общий доступ к файловой системе без учета ТОЛЬКО моего дочернего процесса / процессов. То же самое относится и к kqueue () во FreeBSD. Они также ломаются в случаях SMP, когда несколько экземпляров оболочки могут запускать разные программы, и каждый из них должен устранять неоднозначность действий своей дочерней файловой системы по отношению друг к другу.

Я, безусловно, буду благодарен за любые предложения, которые может предложить сообщество SO.

Это было полезно?

Решение

Напишите " вставку " библиотека, которая перехватывает ваш fopen и устанавливает переменную окружения LD_PRELOAD для всех дочерних процессов. Это работает с динамически связанными библиотеками.

Пример того, как это сделать, можно найти здесь: http: // developers. sun.com/solaris/articles/lib_interposers.html и http://lists.debian.org/debian-powerpc/2004/11/msg00039.html показывает частичную реализацию для fopen () interposer ..

Другие советы

Единственное, что я хотел бы сделать, это использовать strace (системные вызовы и сигналы трассировки), хотя это скорее инструмент отладки, который влияет на производительность отслеживаемого процесса

strace -f -e trace=file -o <output-file> <cmd-line>

-f - follow forks
-e trace=file - will output system calls related to the file-system
-o <output-file>

ИМХО - если вы знакомы с strace , это всегда полезный инструмент в арсенале.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top