2011-05-20 3 views
3

Моя цель - создать метод, который будет обрабатывать дескриптор процесса и возвращать массив байтов, представляющий память этого процесса. Вот что у меня есть:Получить образ памяти процесса

[DllImport("Kernel32.dll")] 
    public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, UInt32 nSize, ref UInt32 lpNumberOfBytesRead); 

    public static byte[] MemRead(IntPtr handle, IntPtr address, UInt32 size, ref UInt32 bytes) 
    { 
     byte[] buffer = new byte[size]; 
     ReadProcessMemory(handle, address, buffer, size, ref bytes); 
     return buffer; 
    } 

Я не знаю, что передать методу обертки в качестве аргументов. Я могу найти handle, а bytes - выходная переменная, но как насчет address и size? Откуда я могу получить эти данные?

+1

Почему вы хотите прочитать память процесса? – svick

+0

@svick А почему бы и нет? –

ответ

0

Используйте VirtualQuery, чтобы узнать, действительно ли был выделен адрес до вызова MemRead. Начните с нуля в качестве адреса и 64K в качестве размера страницы, а затем просто увеличивайте указатель на 64K на каждой итерации до тех пор, пока не достигнете максимального объема памяти в вашей системе.

+0

Если система 64-разрядная, это займет очень много времени. – svick

+0

Кроме того, 'VirtualQuery()' проверяет, имеет ли * текущий процесс * выделенную память, 'VirtualQueryEx()' проверяет адресное пространство другого процесса. – svick

Смежные вопросы