Подтвердить что ты не робот

Мониторинг определенных системных вызовов, выполняемых процессом в Windows

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

Мне в первую очередь интересно запустить процесс и выяснить, какие файлы он прочитал и написал.

EDIT: Я хочу сделать это программно из другого процесса. Я знаю ProcessMonitor, но я хотел бы получить данные в форме, которую я могу импортировать в другую программу для дальнейшего анализа.

EDIT: если я еще больше сужу свои требования, возможно, достаточно иметь возможность контролировать вызовы CreateFile(). Меня действительно интересуют только те файлы, которые открыты, и если они открыты для чтения/записи или просто прочитаны. Еще одно требование, о котором я действительно не говорил, - это то, что скорость довольно важна; Я планировал сделать это для таких вещей, как компиляция С++ файла, и вытащить полный графический интерфейс, который генерирует 20-мегабайтный лог файл, будет иметь непосильные накладные расходы.

EDIT: Было бы неплохо, если бы он не требовал административных привилегий.

4b9b3361

Ответ 1

В Windows существует несколько опций.

Инструментарий производительности Windows можно использовать для включения трассировки различных системных событий, включая ввод-вывод файлов, и включает в себя инструменты для обработки и просмотра этих Мероприятия. Вы можете использовать xperf для начала трассировки различных классов событий и сохранения в файл ETL, который позже можно обработать или просмотреть с помощью тех же инструментов.

Process Monitor от SysInternals - это еще один, очень простой в использовании вариант и позволяет быстро увидеть, как все файлы и реестры получают доступ к любому процессу на система делает. http://blogs.msdn.com/carloc/archive/2008/10/31/how-to-automate-process-monitor.aspx также показывает, как запустить Process Monitor автоматическим способом.

Если вы хотите сделать это полностью программно, вы можете использовать функции ETW (StartTrace, EnableTrace и т.д.) для обмена событиями ввода-вывода файлов и сохранения в файл ETL. Пример кода здесь.

Ответ 2

В окнах вы можете использовать монитор процесса для мониторинга активности процесса (io и реестра). Я думаю, это соответствует вашим потребностям, если вы действительно не хотите знать системные вызовы.

И вы можете использовать winapioverride32 для отслеживания вызовов api.

Ответ 4

Возможно FileMon?

Существует также NtTrace, похожее на strace.

Ответ 6

Другим способом является использование Deviare API Hook перехвата всех системных вызовов пользовательского режима, которые вы хотите. Используя эту структуру, вы можете закодировать общий обработчик для всех вызовов, поскольку параметры могут быть прочитаны с использованием COM-интерфейсов (например: каждый параметр является INktParam, и вы можете получить значение с помощью INktParam.Value).

Другая альтернатива, но это будет стоить немного денег, чтобы использовать SpyStudio от той же компании. Этот продукт имеет параметр командной строки, который полезен для сбора журналов без GUI.

Ответ 7

Как никто не упоминал strace? Пример вывода:

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl64(3, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)
getdents64(3, /* 18 entries */, 4096)   = 496
getdents64(3, /* 0 entries */, 4096)    = 0
close(3)                                = 0
fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f2c000
write(1, "autofs\nbackups\ncache\nflexlm\ngames"..., 86autofsA