ReadProcessMemory против MiniDumpWriteDump

Я заметил, что если я пытаюсь прочитать весь процесс с помощью ReadProcessMemory, это займет ОЧЕНЬ много времени. Однако при выполнении MiniDumpWriteDump это происходит примерно за 1 секунду.

Также по какой-то причине байтовый массив становится поврежденным при попытке сохранить весь процесс, тогда как выполнение ReadProcessMemory не выполняется, а MiniDumpWriteDump - нет.

Единственная проблема заключается в том, что при выполнении MiniDumpWriteDump я не могу сопоставить адреса / значения в чем-то вроде Cheat Engine. Как, например, поиск байтового массива возвращает другой адрес.

MiniDumpWriteDump(pHandle, procID, fsToDump.SafeFileHandle.DangerousGetHandle(), 0x00000002, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);

ReadProcessMemory(pHandle, (UIntPtr)0, test, (UIntPtr)procs.PrivateMemorySize, IntPtr.Zero);

Длина ReadProcessMemory = 597577728

Длина отвала = 372053153

0 ответов

если я попытаюсь прочитать весь процесс с помощью ReadProcessMemory, это займет ОЧЕНЬ много времени.

MiniDumpWriteDump работает быстро, потому что это высокооптимизированная функция, написанная самими Microsoft.

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

Это код C++, но логика будет такой же в C#.

#include <iostream>
#include <windows.h>

int main()
{
    MEMORY_BASIC_INFORMATION meminfo;
    char* addr = 0;

    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());

    MEMORY_BASIC_INFORMATION mbi;

    char buffer[0x1000];

    while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
    {
        if (mbi.State != MEM_COMMIT || mbi.Protect == PAGE_NOACCESS)
        {
            char* buffer = new char[mbi.RegionSize];

            ReadProcessMemory(hProc, addr, buffer, mbi.RegionSize, nullptr);
        }
        addr += mbi.RegionSize;
    }

    CloseHandle(hProc);
}

Обратите внимание, мы проверяем MEM_COMMIT, если память не зафиксирована, значит, она недействительна. Точно так же, если защита PAGE_NOACCESS, мы также отбрасываем эту память. Этот простой метод приведет к сканированию только надлежащей памяти, что приведет к быстрому сканированию. После того, как вы прочитали каждый раздел в локальный буфер, вы можете запустить свой код сканирования шаблона для этого. Наконец, просто разрешите смещение от начала области до абсолютного адреса в целевом процессе.

Другие вопросы по тегам