Как я могу прочитать память процесса порциями и отсканировать точный адрес значений? - PullRequest
0 голосов
/ 19 апреля 2020

Я написал простой сканер памяти на C ++, но он медленный, и кто-то сказал, что чтение фрагментов памяти ускорит его, но как мне получить каждый правильный адрес?

Вот пример исходный код:

#include <iostream>
#include <Windows.h>
#include <string>

#define CHUNK_SIZE 0x80000
#define MAX_ADDRESS 0x7ffffff

using namespace std;

int main()
{
    DWORD pid;
    char buffer[CHUNK_SIZE];
    std::cin >> pid;
    int something;
    int someValue = 0;
    HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    SIZE_T numberRead;
    if (process)
        printf("opened process.\n");
    else
        printf("could not open process.\n");

    for (DWORD i = 0; i < MAX_ADDRESS; i += CHUNK_SIZE) {
        if (ReadProcessMemory(process, (void*)i, &buffer, sizeof(buffer), 
   &numberRead)) {

        for (int j = 0; j < sizeof(buffer); j++)
        {
                someValue = (int)buffer[i];
                if (someValue == 220)
                {
                    printf("found value %d at 0x%x.\n", someValue, i + j);
                }
            }

        }
    }

}

1 Ответ

0 голосов
/ 22 апреля 2020

Лучше всего использовать VirtualQueryEx для l oop через всю допустимую память и избегать вызова ReadProcessMemory для недействительной памяти

while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
{

    if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
    {
        delete[] buffer;
        buffer = new char[mbi.RegionSize];

        ReadProcessMemory(hProc, mbi.BaseAddress, buffer, mbi.RegionSize, &bytesRead);

        for (int j = 0; j < bytesRead; j++)
        {
                if ((int)buffer[j] == 220)
                {
                    printf("found value %d at 0x%x.\n", someValue, mbi.BaseAddress + j);
                }
            }
        }
    }
    addr += mbi.RegionSize;
}

return match;

Имейте в виду, что это возвратит области памяти, где части двух переменных при объединении имеют те же биты, что и ваше значение в целочисленном представлении. Это означает, что вы можете получить ложные срабатывания

...