Базовый адрес exe?

0
    tibiaWindow = FindWindow( L"TibiaClient", NULL);

    DWORD PID;
    GetWindowThreadProcessId( tibiaWindow, &PID );

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); //Open Process for Read/Write
    short mana = 0;
    void* ptr = (void*)hProcess+0x3C2D00;
    if( !ReadProcessMemory(hProcess, ptr, &mana, 2, 0) ){
        return false;
    }
    else{
        statusBar()->showMessage( QString::number(mana), 3000 );
    }

    return true;

Это должно прочитать ману из игры, которая находится в tibia.exe + 0x3CD2D00. Но это не сработает. Может кто-нибудь мне помочь? Как получить базовый адрес этого окна?

  • 1
    Определите «не работает», в случае, если вы получаете невидимые ошибки, вам нужно проверить коды возврата.
  • 1
    Действителен ли PID? Дескриптор процесса действителен? Ваше смещение действительно? В игре есть античит? Не работает не очень информативно.
Показать ещё 3 комментария
Теги:
winapi

1 ответ

5

Чтобы получить базовый адрес модуля в другом процессе, требуется два шага:

  1. EnumProcessModules модулей, загруженные в процесс, используя EnumProcessModules.
  2. Перейдите по списку ручек модуля и запросите имя модуля, используя либо GetModuleFileNameEx либо GetModuleBaseName пока не найдете совпадение.

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

0x3CD2D00 вами смещение (0x3CD2D00) не может быть частью фактического изображения tibia.exe. Это будет означать, что модуль имеет размер не менее 63 МБ, что звучит не так. Он может находиться в некоторых других статических данных модуля или, возможно, в кучевой памяти, что делает ваш предложенный подход бесполезным.

  • 0
    +1. Хороший ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню