Читать всю память процесса в буфер на C ++ - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу приостановить и прочитать всю память процессов в байтовый буфер.Как я могу это сделать?Также как рассчитать объем памяти?Я думаю использовать ReadProcessMemory

Спасибо

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Вы можете легко найти решение в Google, как я нашел несколько месяцев назад.Но вкратце вы можете добиться этого с помощью EnumProcesses, функций GetProcessMemoryInfo и GetProcessImageFileName.

список идентификаторов процессов, который вы можете получить следующим образом:

DWORD adwProcesses[1024], dwNeeded, dwProcesses;
if (!EnumProcesses(adwProcesses, sizeof(adwProcesses), &dwNeeded)) { return 1; }

, где вы получаете все идентификаторы процессов.Так что вам нужно знать точное число, сколько процессов было возвращено

dwProcesses = dwNeeded / sizeof(DWORD);

распечатать или сохранить использование памяти столько раз, сколько процессов у вас есть

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, adwProcesses[k]);
PROCESS_MEMORY_COUNTERS pmc;
//Get process memory info and path to process
GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc));
GetProcessImageFileName(hProcess, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));

, чтобы вы получили данныедля пути процесса:

strProcessName.Format(_T("PATH: %s"), szProcessName);

использование памяти файла подкачки:

strProcessPFMemory.Format(_T("%u K"), (pmc.PagefileUsage / 1024));

пиковое использование памяти файла подкачки:

strProcessPPFMemory.Format(_T("%u K"), (pmc.PeakPagefileUsage / 1024));

и т. д.

0 голосов
/ 07 февраля 2019

Звучит так, будто вы ищете MiniDumpWriteDump и соответствующие функции.Не изобретайте колесо самостоятельно.

0 голосов
/ 07 февраля 2019

Виртуальная память не часто является смежной.(В этом-то и дело.) Таким образом, на самом деле не имеет смысла, а может быть, и вовсе невозможно скопировать все пространство виртуальной памяти процесса в один непрерывный буфер.В виртуальной памяти будут пробелы, которые должны быть заполнены некоторым значением в буфере.Эти промежутки могут быть большими, а буфер может быть огромным.

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

Windows

Сначала вы можете использовать VirtualQueryEx для обнаружения диапазонов виртуальной памяти целевого процесса.

См. Этот вопрос: Перечисление страниц в диапазоне памяти

Затем используйте ReadProcessMemory, чтобы скопировать данные из виртуальной памяти удаленного процесса в буфер вваш локальный процесс.

Конечно, ни одно из этих действий не является атомарным.Если целевой процесс запущен, пространство виртуальной памяти может измениться во время работы.

Также доступны API-интерфейсы «помощи инструментам»: Создание снимка и просмотр процессов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...