я ввел мою DLL в процесс, и я пытаюсь сканировать память на адреса с таким же значением, как у меня, но это приводит к падению после того, как я получаю 1-й адрес, это должно быть 10 адресов
for(DWORD i = MEM_START; i< MEM_END ;i++)
{
VirtualQuery((void*)i,pMemInfo,sizeof(MEMORY_BASIC_INFORMATION));
if(pMemInfo->AllocationProtect == PAGE_READONLY || PAGE_EXECUTE_WRITECOPY || PAGE_READWRITE || PAGE_WRITECOMBINE)
{
if(*(DWORD*)i==1337)
{
addresses.push_back(i);
}
}
}
Я считаю, что моя проверка защиты неверна, но не совсем уверен.
сканер виртуальной памяти
MEMORY_BASIC_INFORMATION mbi = {0};
unsigned char *pAddress = NULL,
*pEndRegion = NULL;
DWORD dwFindData = 0xBAADF00D,
dwProtectionMask = PAGE_READONLY | PAGE_EXECUTE_WRITECOPY
| PAGE_READWRITE | PAGE_WRITECOMBINE;
while( sizeof(mbi) == VirtualQuery(pEndRegion, &mbi, sizeof(mbi)) ){
pAddress = pEndRegion;
pEndRegion += mbi.RegionSize;
if ((mbi.AllocationProtect & dwProtectionMask) && (mbi.State & MEM_COMMIT)){
for (pAddress; pAddress < pEndRegion ; pAddress++){
if (*pAddress == dwFindData){
// dostaff
}
}
}
}
Да, несколько ошибок. Вам нужно будет использовать | оператор вместо ||. Значение i
не имеет смысла, вы должны использовать MEMORY_BASIC_INFORMATION.AllocationBase, чтобы найти, где начинается регион. И .RegionSize, чтобы знать, насколько он велик. Следующее значение, которое вы передаете VirtualQuery, должно быть .AllocationBase + .RegionSize, чтобы найти следующий регион.
Это не то, как ||
оператор работает. Вы можете найти более читабельным использовать switch
утверждение вместо.
for (DWORD i = MEM_START; i < MEM_END ;i++)
{
VirtualQuery((void*)i, pMemInfo, sizeof(MEMORY_BASIC_INFORMATION));
switch (pMemInfo->AllocationProtect)
{
case PAGE_READONLY:
case PAGE_EXECUTE_WRITECOPY:
case PAGE_READWRITE:
case PAGE_WRITECOMBINE:
if(*(DWORD*)i==1337)
{
addresses.push_back(i);
}
}
}