C ReadProcessMemory - как проверить область памяти, связанную с процессом - PullRequest
1 голос
/ 25 февраля 2010

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

а) как мне работать, от базового указателя до конца) общая область, которую я могу прочитать б) каков наилучший способ / самый безопасный перебрать эту область памяти и распечатать его в) как распечатать его, если я не знаю, какие значения он будет содержать, чтобы я мог посмотреть на него?

Я также хотел бы иметь возможность включать фактическое местоположение каждого фрагмента данных из памяти в мой вывод.

Спасибо Р.

Ответы [ 4 ]

5 голосов
/ 25 февраля 2010

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

#define PAGESIZE 4096
char *base = (char *)0;
do {

    char buffer[PAGESIZE];

    if (ReadProcessMemory(handle, base, buffer, PAGESIZE, NULL) != 0)
    {
        // buffer is valid

        // the address of buffer[X] is base+X
    }

    base += PAGESIZE;

// keep looping going until we wrap back around to 0
} while (base != 0);   
4 голосов
/ 25 февраля 2010

Начните с VirtualQueryEx , чтобы определить, какие части адресного пространства процесса имеют страницы для их резервного копирования, а затем, когда вы знаете, что находится, вы можете использовать ReadProcessMemory , чтобы посмотреть на фактическую данные.

1 голос
/ 25 февраля 2010

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

Чтобы найти такие вещи, как расположение отдельных переменных, вам обычно нужно использовать API отладки - в частности, символьную часть - SymInitialize, SymGetSymFromName и, возможно, SymEnumerateSymbols, чтобы вы получили достойное начало. Есть еще несколько, хотя ...

0 голосов
/ 13 июля 2012

Спасибо, Джерри Коффин. Это просто я искал в winnt.h:

typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
DWORD RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

в winbase.h:

VirtualQueryEx(
HANDLE hProcess,
LPCVOID lpAddress,
PMEMORY_BASIC_INFORMATION lpBuffer,
DWORD dwLength
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...