Использование Module32First для получения модуля modBaseAddr ничего не возвращает - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу получить базовый адрес модуля процесса, чтобы я мог начать поиск в его памяти определенных значений.Я использую Module32First, чтобы получить первый модуль, а затем печатаю baseaddr из MODULEENTRY32, но ничего не появляется.

Я нацеливаюсь на другой процесс, который я написал, он просто распечатывает несколько вещей.Я могу успешно получить ручку к нему так же как ручку снимка.Оба процесса являются 32-битными.Я попытался распечатать другие члены MODULEENTRY32, такие как th32ProcessID и modBaseSize, которые все возвращают значения.Только modBaseAddr является пустым.

Я просматривал документацию, и это должно быть что-то не так с моим кодом.Вот соответствующий фрагмент:

std::cout << "Modules Base Address: " << modStruc.modBaseAddr << std::endl;

Я ожидаю распечатать базовый адрес первого модуля, но фактический вывод будет пустым (так как ничего не отображается).Насколько я понимаю, Module32First копирует первую запись модуля в мой MODULEENTRY32 modStruc, и после этого я распечатываю его член modBaseAddr.

Обновление для всех с похожими проблемами: я не нашел решения дляМоя конкретная дилемма, но с тех пор я перешел на использование GetModuleInformation, которая также дает адрес загрузки модуля, точку входа и размер.

1 Ответ

0 голосов
/ 03 февраля 2019

MODULEENTRY32::modBaseAddr - это BYTE*, что на самом деле unsigned char*.

std::cout::operator<< имеет перегрузку для unsigned char*, которая попытается напечатать его в виде строки.

Чтобы напечатать фактический адрес, вам нужно привести его к целочисленному типу, например:

std::cout << "Modules Base Address: " << reinterpret_cast<DWORD_PTR>(modStruc.modBaseAddr) << std::endl;

Пример этого можно увидеть в действии здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...