[C++] Szukanie w pamięci

0

Witam,
Jaka jest najlepsza metoda na znajdywanie pewnych wartości w pamięci?
Nie moge otworzyć procesu i wykorzystać ReadProcessMemory, ponieważ proces ten jest mocno chroniony.

Poniższy kod działa, ale bardzo wolno, poza tym czasem lubi się wysypać nie wiem dlaczego. Tak jakby pamięć w pewnych miejscach była niedostępna.
Próbowałem, naprawić poniższy kod z IsBadReadPtr, oraz z VirtualProtect, ale nadal się wykrzaczał.

DWORD dwStart = 0x00400000;        
DWORD dwEnd = 0x7FFFFFFF;
DWORD dwOffset  = dwStart;

int value = 45;

while (true)
{
        DWORD dwBuffer;                
        memcpy(&dwBuffer, (void*)dwOffset, 4);        
        if (dwBuffer == value) 
        {
                printf ("Offset: 0x00%X Content: %d\n", dwOffset,dwBuffer);                
        }
        dwOffset++;
        if (dwOffset >=dwEnd) break;
}

Proszę o pomoc.

0

W ktorym miejscu Ty otwierasz jakis proces, bo ja jakos tego nie widze... Chyba, ze chcesz przeszukiwac wlasny proces, ale po co?
Co do szybkosci - kopiuj pamiec wiekszymi partiami.

0

Ani tak ani tak.
Funkcja szukająca jest w DLL, którą dorzuczam do innego procesu.
Natomiast dlaczego program się wysypuje zanim dojdzie do końca?

0

Chyba nie myślisz, że każdy program ma dostęp do tych prawie dwóch gigabajtów co to je adresujesz? Dostępne (widoczne) są tylko niewielkie fragmenty tej przestrzeni - VirtualQuery żeby sprawdzić czy dana strona w pamięci jest zdatna do odczytu. Poczytaj o stronnicowaniu (może być wiki) i o zarządzaniu pamięcią pod Windows (MSDN - rozdział znajdziesz chociażby podlinkowany w opisie VirtualQuery).

0

Temat wznowiłem, ale nadal bez większych rezultatów.

PMEMORY_BASIC_INFORMATION lpBuffer;

	for (unsigned int i = 0; i<0xFFFFFFFF;)
	{	
			 if (VirtualQuery(LPCVOID(i), lpBuffer, sizeof(_MEMORY_BASIC_INFORMATION)) == 0)
			 {
				 printf("Error: %d\n", GetLastError());
				break;
			 }
			 printf("RegionSize: %i\n", lpBuffer->RegionSize);
			 printf("RegionProt: %x\n", lpBuffer->Protect);	
			 printf("i: %x\n", i);	

			 i+=lpBuffer->RegionSize;			 
			
	}

	printf("Done\n");

Ten kod działa dla normalnego procesu.
W przypadku mojej aplikacji funkcja VirtualQuery zwraca error ERROR_NOACCESS
998 (0x3E6) - Invalid access to memory location.

Czy jest jakaś inna funkcja, która pozwoli mi na sprawdzenie czy w danym regione mogę odczytać wartość z pamięci?

1 użytkowników online, w tym zalogowanych: 0, gości: 1