программа для мониторинга чтения / записи PATH программы? - PullRequest
1 голос
/ 02 апреля 2011

Я пытался создать программу для проекта колледжа, но я застрял в этом:

Как вы будете контролировать программу относительно того, какие файлы она записывает или читает? Я хочу, чтобы у них были имена путей.

Чтобы прояснить проблему, вот пример:

Рассмотрим программу, которую мы хотим отслеживать, a.exe, и a.exe сначала открывает файл с именем «a1», находящийся в той же папке, что и a.exe, а затем открывает другой файл с именем «a2».

Программа должна указать относительный или абсолютный путь к файлам "a1" и "a2", независимо от того, открыты ли они для чтения / записи.

Как мне реализовать это в C ++?

РЕДАКТИРОВАТЬ: можно ли перенаправить вызовы для файлов a1 и a2 на другой путь ?? EDIT2: хорошо, позвольте мне сказать это так: я переместил firefox.exe из C: \ program files в D: \, теперь, когда я запускаю firefox.exe, он не работает, потому что он работает со многими файлами, которые есть в C : \ program files, firefox.exe будет использовать относительные пути для доступа к файлам. Я собираюсь перехватить вызовы файлов, над которыми работает firefox.exe, а затем направить вызов в папку программных файлов. Пожалуйста, дайте мне знать, если я ясно дал понять ..

Ответы [ 2 ]

1 голос
/ 02 апреля 2011

В linux вы можете использовать 'strace', который выводит различные системные вызовы, выполняемые вашим приложением. Если вам нужно реализовать программу, которая выполняет тот же тип вывода, что и strace, быстрая реализация может состоять в простой программе оболочки, которая обрабатывает вывод strace. В противном случае изучение кода strace является хорошим началом.

В Windows вам может помочь «Монитор процессов» из пакета Sysinternals.

0 голосов
/ 03 апреля 2011

Если вы хотите изменить аргументы на open(2), creat(2), truncate(2) и т. Д., То вы можете использовать Linux ptrace (2) возможность перехватывать системные вызовы и заменять строки имени файла перед выполнением вызова.

ptrace(2) - это темная магия, поэтому, если это не продвинутый курс, это может быть не тем, что задумал ваш профессор. (Если следующая лекция посвящена написанию отладчика, подобного gdb(1), то это точно , что задумал ваш профессор.)

Другой механизм, который вы можете использовать, и, возможно, гораздо более переносимый, - это библиотека или функция вставка - вы можете написать небольшие обертки вокруг определенных функций в библиотеке и загрузить библиотеку с помощью LD_PRELOAD Переменная окружения (см. справочную страницу ld.so(8) для получения подробной информации о переменных окружения, которые влияют на загрузку библиотеки), ваши функции будут вызываться вместо стандартных функций.

Библиотечная вставка - серая магия; это лучше задокументировано, чем ptrace(2), но все же довольно легко испортить.

...