Считывание памяти процесса (ReadProcessMemory) | C++

206
05 мая 2018, 16:41

Написал небольшую функцию для чтение памяти процесса, но при её срабатывании, программа над которой проводятся опыты вылетает. Что я делаю не так? Код:

DWORD ReadMemory(DWORD address) {
if (!IsBadReadPtr((void*)address, 0x10)) {
    DWORD buffer = 0;
    HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, GetCurrentProcessId());
    if (phandle == NULL) {
        MessageBoxA(NULL, "Error with handle", NULL, MB_OK);
        return NULL;
    }
    ReadProcessMemory(phandle, (void*)address, (LPVOID)&buffer, 4, NULL);
    CloseHandle(phandle);
    return buffer;
}
else {
    MessageBoxA(NULL, "Address wasn't finded", NULL, MB_OK);
    return NULL;
}

}

Answer 1

Судя по тому коду, как вызывается функция чтения:

MessageBoxA(NULL,(LPCSTR)ReadMemory(0x01005194), NULL, MB_OK);

(если она действительно так вызывается), то вылеты вполне возможны (и даже может быть более вероятны, чем нормальное завершение программы), поскольку в функцию MessageBoxA() в качестве второго параметра LPCTSTR lpText (указатель на текстовую строку) передается возвращаемое значение из ReadMemory(), т.е. целое число (DWORD buffer), которое совсем не обязательно является корректным указателем на строку.

Более того, если проверяемая память является нечитаемой (т.е. функция IsBadReadPtr() возвращает TRUE), то функция ReadMemory() возвращает NULL, который по-любому вызовет крах программы при попытке передать его в качестве адреса строки в функцию MessageBoxA().

Если же проверяемая память является читаемой, то функция ReadMemory() считывает 4 байта по проверяемому адресу и возвращает считанное значение как указатель на строку. Вы уверены, что проверяемые Вами адреса всегда содержат корректные указатели на строки? Если это не так, то также получим вылет "Программа обратилась по недопустимому адресу памяти" на вызове MessageBoxA().

READ ALSO
Стиль директивы #include

Стиль директивы #include

Сегодня был спор с коллегамиПредметом стала такая строка:

203
Передача кириллицы чрез cURL (C++)

Передача кириллицы чрез cURL (C++)

В нижеприведённом коде я пытаюсь отправить запрос к GoogleSearchAPI через cURLСтрока запроса (url) содержит кириллические символы, которые при отправке...

219
Необработанное исключение по адресу [требует правки]

Необработанное исключение по адресу [требует правки]

Подскажите, что может выбить такое исключение?

230
Потоки QThread, передача данных,

Потоки QThread, передача данных,

у меня много вопросов по поводу QThread и потоковУ меня есть класс ClassData, который в конструкторе принимает два массива данных, затем передает...

263