Aner Izraeli Ответов: 2

Зацепите процесс и получите файлы, которые он создал\удалил\переименовал


Я создал программу на c#, которая получает новый загруженный процесс
startWatch.EventArrived += new ventArrivedEventHandler(startWatch_EventArrived);

и делать всякие вещи, когда стреляет eventHandler.

после этого я использую:
foreach (var runningProcess in Process.GetProcessesByName(ShortProcessName))

чтобы получить запущенный процесс.Данные MainModule для текущего процесса и после него
foreach (System.Diagnostics.ProcessModule module in MYPROCESS.Modules)

чтобы получить список дочерних процессов и модулей.

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

Что я уже пробовал:

Я пробовал копаться в конструкции и модулях "процесса", но ничего для этого не нашел. также пробовал использовать filewatcher, но и здесь не может получить родительский процесс, ответственный за изменения файлов. я думаю, что это не может быть сделано с помощью языка высокого уровня, такого как c#, но ниже.

К сожалению, я не знаком с нижними. в конце концов, я хочу, чтобы service \ watcher подключил процесс в режиме реального времени и создал выходной файл (файл), с которым он возился.

Suvendu Shekhar Giri

Рассмотрим еще один очень простой подход,
если у вас уже есть место (путь к папке), где создаются новые файлы, то вы можете получить всю информацию о файле, созданном/измененном/удаленном.

Или я упускаю что-то очевидное?

Aner Izraeli

подумайте о вредоносном коде ,
вы не можете знать, в какой папке вредоносная программа будет создавать\удалять\переименовывать файлы.
если бы я знал путь к папке, то мог бы легко использовать filewatcher. :)

Kornfeld Eliyahu Peter

Вы говорите о какой-то истории доступа к файлам?

Aner Izraeli

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

2 Ответов

Рейтинг:
2

Wendelius

Если я правильно понял вопрос, вы могли бы использовать эту идею из Список Использованных Файлов[^]

Другим вариантом может быть использование такой утилиты, как handle.exe. Видеть https://technet.microsoft.com/en-us/sysinternals/handle.aspx[^]


Aner Izraeli

Спасибо! проверьте эти два предложения.
это решение для текущих обработанных файлов\модулей.
я ищу предыдущий обработанный файл процессом.
например:
1. процесс helloworld.exe загружен.
2. Процесс создания файла - " testfile. bat"

Я хочу знать этот тестовый файл.летучая мышь была создана helloworld.exe.

надеюсь, я буду более ясен.
Спасибо :)

Wendelius

Насколько я знаю, информация о том, какая программа создала или изменила файл, недоступна в Windows после того, как процесс закрыл файл. Единственный способ - делать наблюдения, когда файл открыт процессом.

Рейтинг:
0

Kornfeld Eliyahu Peter

Я не думаю, что вы можете сказать, почему процесс открыл файл, но можете сказать, какие файлы процесс в данный момент держит открытыми...
Прежде всего вам нужно покопаться в старом WIN32 API
NtQuerySystemInformation[^]
Эта функция не очень хорошо документирована, и страница справки не будет содержать SystemHandleInformation перечисленное значение (16) для первого параметра, но все равно придется его использовать...
Вам придется вызвать его дважды: один раз последний параметр в качестве возвращаемого значения необходимого размера буферов и второй раз с нулем в последнем параметре, чтобы фактически получить значения...
Результатом этой функции является список всех дескрипторов (всех типов) для всех процессов...Вы должны перечислить их и проверить тип и процесс, которому принадлежит дескриптор...
С помощью NtQueryObject[^] в цикле (используя ObjectNameInformation в качестве второго параметра), предоставит вам имя устройства на основе файла, который содержит дескриптор...
Чтобы найти удобное для пользователя имя, вы должны использовать QueryDosDevice[^] функция-она будет сопоставлять устройство с буквой...
Две вещи:
1. Вы должны продублировать дескриптор в свой процесс, прежде чем использовать его. Сделайте это с помощью Для открытия процесса[^] с PROCESS_DUP_HANDLE, и DuplicateHandle[^] после этого.
2. NtQueryObject будет висеть, если дескриптор указывает на именованный канал (ошибка), поэтому вы должны сначала попробовать запустить его в новом потоке, чтобы проверить его, и только если поток не будет вручную идти дальше и использовать его в основном потоке...
---
И...
Есть несколько готовых решений с исходным кодом:
Методические указания: перечислите ручки - утилиты Sysinternals форумов[^]
Изучите информацию о примитивах системного уровня Windows NT[^]


Wendelius

Комментарий ОП, скорее всего, предназначался и вам, так что если у вас есть идеи, пожалуйста, прокомментируйте.

Спасибо! проверьте эти два предложения.
это решение для текущих обработанных файлов\модулей.
я ищу предыдущий обработанный файл процессом.
например:
1. процесс helloworld.exe загружен.
2. Процесс создания файла - " testfile. bat"

Я хочу знать этот тестовый файл.летучая мышь была создана helloworld.exe.

надеюсь, я буду более ясен.
Спасибо :)

Aner Izraeli

Шалом Элиягу, спасибо за ответ :)
да, вы можете связать файл с его процессом.
великий Process explorer (sysinternal tool) может это сделать, так что это возможно.
это то, что я ищу, какой-то инструмент командной строки, который может зацепить процесс и сказать, какие файлы были созданы им.
я даже покупаю его, если найду.

Kornfeld Eliyahu Peter

Мне кажется, ты что-то упустил... Весь Process explorer от sysinternals говорит вам, что существует активный дескриптор к файлу, но не упоминает, какова цель дескриптора (новый файл, удаление, редактирование)...
И даже эта связь исчезла, когда ручка закрылась...
После того как дескриптор исчез, нет никакого способа сказать, какой процесс имел файл...

Aner Izraeli

Хммм, на самом деле это упоминание о пуппозе, например, таблица выглядит так:
Имя процесса | PID / операция | путь
someprocess.exe | 123 / CreateFile | c:\tempfolder\newcreatedfile.bat

жаль,что я не могу добавить скриншот...

Kornfeld Eliyahu Peter

Теперь я понимаю... Вы сказали Process explorer, но имели в виду process monitor...
Чтобы сделать что-то подобное, нужно поговорить с Марком...
Но серьезно... Речь идет об очень низком уровне доступа...
Речь идет о написании драйвера файловой системы (virtual one-VxD) и через этот драйвер присоединении к цепочке событий файловой системы...
Я никогда этого не делал, так что ничем не могу вам помочь...
http://www.decuslib.com/decus/vmslt00a/nt/filemon.htm