Отслеживание определенных системных вызовов, выполняемых процессом в Windows
Я хотел бы иметь возможность отслеживать определенные системные вызовы, сделанные процессом, в первую очередь вызовы файлового ввода-вывода. В Linux я, вероятно, могу обойтись без использования strace с подходящими параметрами, но как я могу это сделать в Windows?
В первую очередь меня интересует запуск процесса и выяснение того, какие файлы он прочитал и записал.
РЕДАКТИРОВАТЬ: Я хочу сделать это программно из другого процесса. Я знаю о ProcessMonitor, но я хотел бы получить данные в форме, которую я могу импортировать в другую программу для дальнейшего анализа.
РЕДАКТИРОВАТЬ: Если я сузить свои требования еще больше, вероятно, достаточно будет иметь возможность отслеживать вызовы CreateFile(). Меня действительно интересует только то, какие файлы открываются и открываются ли они для чтения / записи или просто для чтения. Еще одно требование, которое я на самом деле не утверждал, это то, что скорость очень важна; Я планировал сделать это для таких вещей, как компиляция C++-файла, и создание полного графического интерфейса, который генерирует 20-мегабайтный лог-файл, будет иметь чрезмерные накладные расходы.
РЕДАКТИРОВАТЬ: Было бы также хорошо, если бы это не требует административных привилегий.
7 ответов
Есть несколько вариантов в Windows.
Windows Performance Toolkit можно использовать для включения отслеживания различных системных событий, включая файловый ввод-вывод, и включает в себя инструменты для обработки и просмотра этих событий. Вы можете использовать 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. Пример кода здесь.
В Windows вы можете использовать монитор процессов для мониторинга активности процессов (io и реестр). Я думаю, что это соответствует вашим потребностям, если вы не хотите знать системные вызовы.
И вы можете использовать winapioverride32 для мониторинга вызовов API.
API Monitor от rohitab очень хорош для системных вызовов
Еще один инструмент трассировки Windows API: logexts.dll
(часть средств отладки для Windows), которую можно запустить изнутри WinDbg/ntsd/cdb или через автономный logger.exe
программа.
Другой способ - использовать Deviare API Hook для перехвата всех системных вызовов в пользовательском режиме. Используя эту платформу, вы можете кодировать универсальный обработчик для всех вызовов, так как параметры могут быть прочитаны с использованием интерфейсов COM (например: каждый параметр является INktParam, и вы можете получить значение, используя INktParam.Value).
Другая альтернатива, но это будет стоить немного денег, это использовать SpyStudio от той же компании. Этот продукт имеет параметр командной строки, который полезен для сбора журналов без графического интерфейса.
Как никто не упомянул 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 (флаги FD_CLOEXEC) getdents64(3, /* 18 записей */, 4096) = 496 getdents64(3, /* 0 записей */, 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