Помогите мне сделать так, чтобы этот код идентифицировал правильный processid и имя процесса
У меня есть блок кода, где я звоню третьей стороне handle.exe (получено из Sysinternals) для того, чтобы идентифицировать процесс, у которого открыты файлы в определенной папке. Когда я использую блокнот для внесения изменений в файлы в папке, мой код может выводить идентификатор процесса и имя процесса Блокнота. Проблема возникает, когда я пробую тест с небольшим приложением, которое я сделал, чтобы действовать как угроза, изменяя файлы. Вместо того, чтобы моя программа идентифицировала процесс угрозы, она указывает на себя. Интересно, в чем проблема? handle.exe или мой код. Пожалуйста, помогите мне.
Что я уже пробовал:
class FileMonitor { //The watcher class FileSystemWatcher sysWatcher; //directory to monitor string directoryPath = "C:\\AAAA"; //An output label and listBox Label outputLabel; ListBox operationView; //process id int processId; string processNm; //Threat details List<object> threatDetails; //constructor function public FileMonitor() { sysWatcher = new FileSystemWatcher(this.directoryPath); sysWatcher.IncludeSubdirectories = true; sysWatcher.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.FileName | NotifyFilters.LastWrite; //register event handlers sysWatcher.Changed += new FileSystemEventHandler(onChanged); sysWatcher.Deleted += new FileSystemEventHandler(onChanged); sysWatcher.Created += new FileSystemEventHandler(onChanged); sysWatcher.Renamed += new RenamedEventHandler(onRenamed); sysWatcher.EnableRaisingEvents = true; } public void setOutputComponents(Label myLable, ListBox myListBox) { this.outputLabel = myLable; this.operationView = myListBox; } private void onRenamed(object sender, RenamedEventArgs e) { this.doWork(); } private void onChanged(object sender, FileSystemEventArgs e) { this.doWork(); } // i believe this has some sort of bug. Need help here private void callProcessChecker() { ProcessStartInfo sInfo = new ProcessStartInfo(@"C:\handle64.exe"); sInfo.Arguments = this.directoryPath + " /accepteula"; sInfo.UseShellExecute = false; sInfo.RedirectStandardOutput = true; sInfo.CreateNoWindow = true; Process pingHandle = Process.Start(sInfo); pingHandle.WaitForExit(); string myOutput = pingHandle.StandardOutput.ReadToEnd(); string matchPattern = @"(?<=\s+pid:\s+)\b(\d+)\b(?=\s+)"; foreach (Match match in Regex.Matches(myOutput, matchPattern)) { this.processId = int.Parse(match.Value); } } //a list to contain information about the process private void processDetails() { Process myprocess = Process.GetProcessById(this.processId); this.processNm = myprocess.ProcessName; this.threatDetails = new List<object>(); this.threatDetails.Add(this.processNm); this.threatDetails.Add(this.processId); this.threatDetails.Add(1); } //display items in a listBox private void displayInfoListBox() { if (this.operationView.InvokeRequired) { this.operationView.Invoke(new MethodInvoker( () => { this.operationView.Items.Add("Threat:" + this.processNm + "| Pid:" + this.processId + "| Status: "); } )); } else { this.operationView.Items.Add("Threat:" + this.processNm + "| Pid:" + this.processId + "| Status: "); } } private void doWork() { this.callProcessChecker(); this.processDetails(); this.displayInfoListBox(); } }
Richard MacCutchan
Где возникает проблема и какие именно детали?
Member 12882397
Программа не выводит процесс, который отвечает за изменение файлов в этой папке. Когда я делаю изменения с помощью блокнота и сохраняю файл, моя программа может вывести имя процесса в виде блокнота и его идентификатор процесса. Если мое вредоносное тестовое приложение изменяет файл, мое приложение не может захватить процесс даже при вызове handle.exe в моем коде.
Это шаги, которые делает мое приложение
1.Прислушивается к изменениям в c:\aaaa папку с помощью класса filesystemwatcher
2. если обнаружено изменение handle.exe вызывается с помощью метода callProcessChecker и выходного считывания, из которого регулярное выражение используется для получения соответствующих идентификаторов процессов.
3. полученный идентификатор процесса выводится в поле списка с соответствующим именем процесса.
Шаги, выполняемые вредоносным тестовым приложением
1. ReadsAllBytes в текстовом файле в папке C:\AAAA
2. шифрует массив байтов и записывает поток в файл, а затем добавляет новое расширение.
3.Удалить оригинальный файл.
Вопрос, который я имею в виду, заключается в том, может ли быть так, что fileSystemWatcher обнаруживает изменения только после завершения вредоносного процесса, и поэтому вызов handle в этот момент бесполезен?
Jason Gleim
Делает ли вредоносное приложение изменение, а затем завершает работу или оно продолжает работать, как блокнот? FileSystemWatcher не будет срабатывать до тех пор, пока изменения не будут зафиксированы, так что да... если приложение вносит изменения, записывает их, а затем завершает работу, то нет никакого дескриптора для отчета.
Member 12882397
Теперь я понимаю логику. : -). Действительно ли возможно захватить вредоносное приложение (используя c#) сразу же, как оно откроет файл, или это потребует от меня вызова win32API в мой код?