Какой самый быстрый способ чтения ReadProcessMemory? - PullRequest
2 голосов
/ 18 августа 2011

Я пытаюсь найти все экземпляры строки с нулевым символом в конце в памяти процесса. Я перечислил все выделенные области памяти с помощью VirtualQueryEx, затем прочитал их с помощью ReadProcessMemory в байтовый массив и произвел поиск по этому алгоритму (который я нашел здесь, и автор утверждает, что он самый быстрый)

    public static unsafe List<long> IndexesOf(byte[] Haystack, byte[] Needle) {
        List<long> Indexes = new List<long>();
        fixed (byte* H = Haystack) fixed (byte* N = Needle) {
            long i = 0;
            for (byte* hNext = H, hEnd = H + Haystack.LongLength; hNext < hEnd; i++, hNext++) {
                bool Found = true;
                for (byte* hInc = hNext, nInc = N, nEnd = N + Needle.LongLength; Found && nInc < nEnd; Found = *nInc == *hInc, nInc++, hInc++) ;
                if (Found) Indexes.Add(i);
            }
            return Indexes;
        }
    }

Это работает, но это слишком медленно. Есть ли способ отобразить в памяти процесс или как-то быстрее выполнить поиск в его памяти?

1 Ответ

3 голосов
/ 18 августа 2011

Из внешнего процесса у вас есть правильный подход.Однако, если вы ищете строку, вам, вероятно, нет дела до определенных областей (например, исполняемой памяти), поэтому вы можете исключить их из области поиска.Скорее всего, вас действительно интересуют только PAGE_READONLY и PAGE_READWRITE.

. Вы должны читать память как можно большими блоками с помощью ReadProcessMemory ().Основным узким местом будет дисковый ввод-вывод (от подкачки), и с этим мало что можно поделать.Многопоточность ускоряет его, потому что тогда вы будете «буферизировать чтение», обрабатывая предыдущее чтение.

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

В вашем алгоритме поиска вы также можете делать маленькие хитрости.Например, если вы знаете, что строка всегда размещается в 4-байтовом выравнивании, вы можете просто искать их.Наибольшее ускорение вы получите от многопоточности и / или внедрения DLL.

...