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, мы также отбрасываем эту память. Этот простой метод приведет к сканированию только надлежащей памяти, что приведет к быстрому сканированию. После того, как вы прочитали каждый раздел в локальный буфер, вы можете запустить свой код сканирования шаблона для этого. Наконец, просто разрешите смещение от начала области до абсолютного адреса в целевом процессе.