У меня есть процесс, который использовался извне и теперь является внутренним, эта программа использует ReadProcessMemory для копирования данных из памяти в Char *.
Ниже приведен код.
char* szMemDump = (char*)malloc(mbi.RegionSize+1);
ReadProcessMemory( NULL, (unsigned long*)dwMemAddr, szMemDump, mbi.RegionSize, NULL );
Сейчас я делаю это изнутри программы, и моя цель — записать эту информацию в один и тот же массив без использования RPM.
Я попытался использовать memcpy, хотя это, похоже, приводит к сбою программы, так как я читаю большие объемы памяти, трудно понять, почему это происходит.
memcpy(szMemDump, (void*)dwMemAddr, mbi.RegionSize);
Альтернатива этой программе, которая использует RPM, не имеет проблем и позволяет точно сканировать данные, поэтому я могу только предположить, что memcpy неверен.
Редактировать: новый код загружается как DLL внутри процесса, это должно позволить значениям для внутреннего чтения.
Изменить код обновления.
if( VirtualQuery((unsigned long*)dwMemAddr, &mbi, sizeof(mbi) ) == sizeof(mbi) )
{
if( (mbi.Protect != PAGE_NOACCESS) && (mbi.State == MEM_COMMIT) )
{
char* szMemDump = (char*)malloc(mbi.RegionSize+1);
//ReadProcessMemory( NULL, (unsigned long*)dwMemAddr, szMemDump, mbi.RegionSize, NULL );
memcpy(szMemDump, (unsigned long*)dwMemAddr, mbi.RegionSize);for( x=0; x<mbi.RegionSize; x++ )
{
//Loop actions
}
free( szMemDump );
}
}
Вы получаете ЛОЖНЫЙ возврат от ReadProcessMemory (), когда вы используете неверный адрес. Тот, который вы не проверяете, поэтому вы просто забываете, что ошиблись.
Это счастливое забвение заканчивается, когда вы используете недопустимый адрес для memcpy (), это kaboom, чтобы более убедительно напомнить вам, что вы ошиблись, это не функция, которая проверяет аргументы, как RPM.
Используйте VirtualQuery (), чтобы обнаружить действительные адреса памяти. И обязательно используйте адрес MEMORY_BASIC_INFORMATION.BaseAddress, а не адрес, который вы запрашивали.
Других решений пока нет …