Как я могу создать процесс в Windows и посмотреть, какие файлы он использует? - PullRequest
2 голосов
/ 09 сентября 2010

Я хотел бы написать функцию C ++ в Microsoft Windows, которая порождает процесс и возвращает, в дополнение к состоянию завершения процесса, список всех файлов, прочитанных или записанных процессом. Он не должен требовать какого-либо сотрудничества с порожденным приложением.

Например, если порожденная программа является компилятором Visual Studio C ++, функция выдаст список, содержащий исходный файл, открытый компилятором, все прочитанные им заголовочные файлы и созданный файл .OBJ. Если бы она также содержала такие вещи, как .DLL файлы, содержащиеся в программе, это было бы хорошо. Но опять же, он должен работать независимо от порожденной программы; компилятор только пример.

Подсказка: если процесс создает подпроцессы, мне нужно также контролировать их доступ к файлам.

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

Я знаю, что это звучит как ингредиент для какого-то ужасного клуджа. Но если я смогу заставить это работать, конечный результат будет действительно крутым.

1 Ответ

1 голос
/ 09 сентября 2010

Второй поворот: если процесс пытается открыть файл, я хотел бы иметь возможность подождать, пока я не смогу создать этот файл, и только затем позволить ему возобновить работу и открыть файл

Вы просто поставили себя в Hack City с этим требованием - вы правы, что ETW был бы гораздо более простым решением, но у него также нет возможности заблокировать вызов файла.

В основномвот что вам нужно сделать:

  1. Создать приостановленный процесс
  2. Создать два именованных канала в противоположных направлениях, имена которых хорошо известны (возможно, содержат PID
  3. Подключите LoadModule, и обработчик будет следить за загрузкой Kernel32
  4. Когда Kernel32 загружается, подключайте CreateFileW и CreateFileA - также подключайте CreateProcessEx и ShellExecute
  5. Когда вашХук хита CreateFile, вы записываете имя в один из именованных каналов, затем выполняете ReadFile в другом, пока родительский процесс не подаст вам сигнал на продолжение.
  6. WПри попадании в хук CreateProcessEx вы можете снова и снова выполнять один и тот же процесс изнутри текущего процесса (помните, что родительский процесс не может выполнить CreateProcess, поскольку он испортит унаследованные дескрипторы).
  7. Запустите дочерний процесс.

Имейте в виду, что вы будете вводить код и делать исправления для изображения в памяти, которое может отличаться от вашего (например, ваше приложение 64-bit, но он запускает 32-битный процесс), так что для вставки вам потребуется версия xim и amd64 для кода x86 и amd64.Надеюсь, что, написав эту длинную диатрибу, вы сами убедились, что это действительно ужасная идея, которую очень трудно понять, и что люди, перехватывающие функции Win32, огорчают разработчиков ОС Windows.

...