ReadProcessMemory _out_ bytesread

Программа использует ReadProcessMemory сканировать куски памяти на определенное значение. К сожалению когда я звоню ReadProcessMemory Я получаю ошибку 299.

void update_memblock(MEMBLOCK *mb)
{
//variables
static unsigned char tempbuf[128*1024];
size_t bytes_left;
size_t total_read;
size_t bytes_to_read;
size_t  bytes_read;
size_t sizeMem;
size_t MemoryBase;

bytes_left = mb->size;
total_read = 0;

while (bytes_left)
{

bytes_to_read = (bytes_left > sizeof(tempbuf)) ? sizeof(tempbuf) :  bytes_left;
ReadProcessMemory(mb->hProc ,mb->addr + total_read,mb->buffer, bytes_to_read, (SIZE_T*)&bytes_read);
if (bytes_read != bytes_to_read)break;
memcpy(mb->buffer + total_read, tempbuf,bytes_read);

bytes_left -= bytes_read;
total_read += bytes_read;
}
mb->size = total_read;
}

1

Решение

Код ошибки 299 (0x12B) ERROR_PARTIAL_COPY
«Была выполнена только часть запроса ReadProcessMemory или WriteProcessMemory»

Вы получаете эту ошибку, потому что вы пытаетесь прочитать память со страницы, которая не «выделена».

Вы хотите использовать VirtualQueryEx () на каждой странице памяти, которая дает MEMORY_BASIC_INFORMATION структура, которая содержит 2 переменные заметки:

Состояние: может быть MEM_COMMIT, MEM_FREE или MEM_RESERVE
Защитить: может быть любой из Константы защиты памяти

Вы хотите пройтись по всем страницам памяти, вызвать на них VirtualQueryEx () и пропустить все плохие страницы. Мне нравится пропускать все страницы / регионы в каком состоянии! = MEM_COMMIT и Protect == PAGE_NOACCESS

Вот пример кода psuedo:

MEMORY_BASIC_INFORMATION mbi = { 0 };

while (LoopingThroughTheMemories.bat)
{
if (!VirtualQueryEx(hProc, currentMemoryAddress, &mbi, sizeof(mbi))) continue
if (mbi.State != MEM_COMMIT || mbi.Protect == PAGE_NOACCESS) continue;

//good mem region, do ReadProcessMemory() stuffs
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]