Я работаю над программным обеспечением, которое требует от меня знать, к каким файлам и ресурсам обращается тот или иной запущенный процесс.
Я не собираюсь отслеживать, к чему обращается каждый скрипт, приложение и демон, а только определенный процесс, запущенный пользователем.
Есть ли способ сделать это на Python (или на любом другом языке, если на то пошло)? Я собираюсь провести собственное исследование, просто подумал, что спрошу здесь, вдруг есть знающие пользователи, которые разбираются в таких вещах и могут дать немного больше объяснений.
решение1
Вы можете проследитьсистемные вызовычто делает программа. Это обычный метод узнать, к каким файлам она обращается. Инструмент, который это делает, называетсяtruss
во многих системах Unix,dtruss
на OSX,strace
на Linux. Я опишу использование Linux здесь; для других систем смотрите руководство.
Самая простая форма —
strace myprogram arg1 arg2
Это выведет журнал всех системных вызовов, выполненных myprogram
. (Пример.) Чтобы сохранить журнал в файле, используйте параметр -o
. Чтобы также регистрировать вызовы, выполненные подпроцессами, используйте параметр -f
. Чтобы выбрать, какие системные вызовы регистрировать, используйте параметр -e
. Подробную информацию о том, что можно использовать в качестве аргумента для , см. в руководстве -e
. Например, следующий вызов регистрирует системные вызовы, связанные с файлами (открытие и закрытие, листинг каталогов и т. д.), за исключением read
и write
.
strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2
решение2
решение3
Единственный полностью надежный способ сделать это — отследить системные вызовы. Программа strace
(упомянутая @gowenfawr) делает это правильно и реализована в терминах ptrace(2)
системного вызова. Однако следует отметить, что ptrace
вызов трудно использовать правильно; если вы не можете использовать его strace -e open
напрямую, рассмотрите второй способ:
Для большинства процессов вы можете вместо этого перехватывать вызовы open
функции библиотеки C через LD_PRELOAD
. ЭтотривиальныйОднако для вредоносной программы на языке C это можно обойти; но если вы уверены, что программа сама не будет выполнять системные вызовы, это реализовать проще, чем программно ptrace
.
Для процесса, который, как вы знаете, написан на языке более высокого уровня, таком как Python, вы можете вместо этого перехватывать высокоуровневые open
вызовы, но это, вероятно, будет сложнее, чем перехват вызовов уровня C, если только язык не был разработан с поддержкой такого перехвата (Python не поддерживает).
Наконец - все вышеприведенные параграфы предполагают, что файлы открываются с помощью open
. Это не всегда верно, есть также openat
, open64
, recvmsg
вспомогательные данные и унаследованные дескрипторы файлов от родителя.