Member 12882397 Ответов: 0

Помогите мне сделать так, чтобы этот код идентифицировал правильный 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 в мой код?

0 Ответов