winapi — включение базовых адресов памяти в переполнение стека

Базовый адрес, который я нашел для области памяти в приложении, был в синтаксисе "application_name.exe" + 0007856 (<- или любой другой номер, это только пример). У меня вопрос, как мне найти адрес для "application_name.exe" в С ++? Я не уверен, но этот метод я использовал:

HANDLE proc_handle = OpenProcess(//parameters go here to open the process);
void * base_add = (void*)proc_handle;    //to store the address of the process

Если этот метод верен, ответ на первый вопрос о том, как получить адрес приложения, приводит меня ко второму вопросу: поскольку базовый адрес для конкретной области памяти был "application_name.exe" + 0007856Могу я просто сделать это?

DWORD specific_memory_base_add = (DWORD)base_add + 0x0007856

Могу ли я использовать адрес, который я нашел из "application_name.exe" и добавить его в 0x0007856 с помощью +? Я попробовал это, и это не сработало. Если это не правильно, каков правильный метод?

0

Решение

Получение базового адреса модуля в другом процессе требует перечисления модулей процесса и извлечения имен модулей, чтобы найти совпадение.

Перечислить модули, загруженные в вызов процесса EnumProcessModules. Как только у вас есть список модулей, позвоните GetModuleBaseName для каждого модуля найти тот, который вы ищете (application_name.exe). HMODULE для этого модуля указатель (в адресном пространстве целевого процесса) на начало модуля, его базовый адрес. Вы можете использовать это, чтобы добавить свое смещение.

2

Другие решения

Предполагая, что вы говорите о Windows (если вы пометили winapi?) вы можете получить базовый адрес загруженного модуля с GetModuleHandle(). У модуля нет базового адреса, пока он не загружен (хотя компоновщик может указать предпочтительный базовый адрес, загрузчик не должен использовать / соблюдать это).

0