Написал небольшую функцию для чтение памяти процесса, но при её срабатывании, программа над которой проводятся опыты вылетает. Что я делаю не так? Код:
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;
}
}
Судя по тому коду, как вызывается функция чтения:
MessageBoxA(NULL,(LPCSTR)ReadMemory(0x01005194), NULL, MB_OK);
(если она действительно так вызывается), то вылеты вполне возможны (и даже может быть более вероятны, чем нормальное завершение программы), поскольку в функцию MessageBoxA() в качестве второго параметра LPCTSTR lpText (указатель на текстовую строку) передается возвращаемое значение из ReadMemory(), т.е. целое число (DWORD buffer), которое совсем не обязательно является корректным указателем на строку.
Более того, если проверяемая память является нечитаемой (т.е. функция IsBadReadPtr() возвращает TRUE), то функция ReadMemory() возвращает NULL, который по-любому вызовет крах программы при попытке передать его в качестве адреса строки в функцию MessageBoxA().
Если же проверяемая память является читаемой, то функция ReadMemory() считывает 4 байта по проверяемому адресу и возвращает считанное значение как указатель на строку. Вы уверены, что проверяемые Вами адреса всегда содержат корректные указатели на строки? Если это не так, то также получим вылет "Программа обратилась по недопустимому адресу памяти" на вызове MessageBoxA().
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В нижеприведённом коде я пытаюсь отправить запрос к GoogleSearchAPI через cURLСтрока запроса (url) содержит кириллические символы, которые при отправке...
Подскажите, что может выбить такое исключение?
у меня много вопросов по поводу QThread и потоковУ меня есть класс ClassData, который в конструкторе принимает два массива данных, затем передает...