Przeszukiwanie pamieci

dział ogólny

Przeszukiwanie pamieci

Nowy postprzez sawcioo » niedziela, 11 lipca 2010, 00:57

Witam. Czy istnieje jakiś szybi sposób na przeszukanie pamieci. Konkretniej chodzi mi o to ze chce sprawdzic czy dana komorka pamieci przyjmuje np. wartosc 1 w danej aplikacji. Póki co mam taki kod, z tym ze nie wiem czy dobrze sie do tego zabrałem:

Kod: Zaznacz cały
int licz;
DWORD addr = 0x00000000;
while(addr != 0x7FFFFFFF){

    ReadProcessMemory(hProcess, (const void*)addr, &licz, 4, NULL);
    if(licz == 1)
    cout << hex << addr << endl;

    addr++;
}


To co chce osiągnąć znajduje sie w programie Cheat Engine, jednak tam trwa to dużo krócej.
Avatar użytkownika
sawcioo
Bladawiec
Bladawiec
 
Posty: 8
Dołączył(a): piątek, 16 października 2009, 18:42
Podziękował : 0
Otrzymał podziękowań: 0
    Windows 7Firefox

Re: Przeszukiwanie pamieci

Nowy postprzez polymorphism » niedziela, 11 lipca 2010, 11:44

Co ty, 2GB pamięci przeszukujesz, czytając po 4 bajty?! :shock: Najsensowniej byłoby przeszukiwać tylko te obszary pamięci, które są w danej chwili wykorzystywane przez proces, a nie jego całą możliwą przestrzeń adresową (choć przyjąłeś bardzo naiwne założenie odnośnie jej początku i końca).

Skrobnąłem kod, który wylicza (chyba) wszystkie bloki pamięci, które są w użyciu przez aplikację, wliczając w to pamięć sterty, stosu, zmiennych statycznych i kodu:
Kod: Zaznacz cały
SYSTEM_INFO    sys_info;

GetSystemInfo(&sys_info);

DWORD procID = ????; //<--- tu wiadomo, id procesu, który Cię interesuje
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION PROCESS_VM_READ,TRUE,procID);
if(
hProcess)
{
    const void* p = sys_info.lpMinimumApplicationAddress;
    MEMORY_BASIC_INFORMATION mem_info;

    while(VirtualQueryEx(hProcess,p,&mem_info,sizeof(MEMORY_BASIC_INFORMATION)) == sizeof(MEMORY_BASIC_INFORMATION))
    {
        /* tylko blok, który jest zmapowany na fizyczną pamięć lub plik */
        if(mem_info.State == MEM_COMMIT)
        {
                cout << p << " size = " << mem_info.RegionSize << '\n';
        }

        p = (char*)mem_info.BaseAddress + mem_info.RegionSize;
        if(>= sys_info.lpMaximumApplicationAddress)break;
    }

    CloseHandle(hProcess);
}
 
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 8 gości

cron