3

Вопрос по c++ – Получение базового адреса процесса

Я пытаюсь создать программу, которая считывает значение таймера из Minesweeper. (ОС Windows 7 64bit)

Используя чит-движок, я нашел базовый адрес переменной, но он меняется каждый раз, когда я запускаю Minesweeper.

Что мне нужно сделать, чтобы автоматически определить базовый адрес?

Это как-то связано с исполняемым базовым адресом?

Вот мой код:

#include <windows.h>
#include <iostream>
using namespace std;



int main()
{
    DWORD baseAddress = 0xFF1DAA38;//always changing
    DWORD offset1 = 0x18;
    DWORD offset2 = 0x20;
    DWORD pAddress1;
    DWORD pAddress2;

    float value = 0;
    DWORD pid;
    HWND hwnd;

    hwnd = FindWindow(NULL,"Minesweeper");
    if(!hwnd)//didn't find the window
    {
        cout <<"Window not found!\n";
        cin.get();
    }
    else
    {
        GetWindowThreadProcessId(hwnd,&pid);
        HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,pid);//get permission to read
        if(!phandle)//failed to get permission
        {
            cout <<"Could not get handle!\n";
            cin.get();
        }
        else
        {
            ReadProcessMemory(phandle,(void*)(baseAddress),&pAddress1,sizeof(pAddress1),0);
            ReadProcessMemory(phandle,(void*)(pAddress1 + offset1),&pAddress2,sizeof(pAddress2),0);
            while(1)
            {
                ReadProcessMemory(phandle,(void*)(pAddress2 + offset2),&value,sizeof(value),0);
                cout << value << "\n";
                Sleep(1000);
            }
        }
    }
}
  • Я добавил строку и программа компилируется. Но это дает мне эту ошибку:Run-Time Check Failure #3 - The variable 'hModules' is being used without being initialized., с последующимUnhandled exception at 0x770215de in Minesweeper Timer.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0034f8f8.. а такжеUnhandled exception at 0x770215de in Minesweeper Timer.exe: 0x00000000: The operation completed successfully.

    от yoni0505
  • Я включил & lt; TlHelp32.h & gt; и & lt; Psapi.h & gt; и попытался использовать это так:GetModuleBase(phandle, (string)"Minesweeper.exe");   Но я получаю эту ошибку:error LNK2019: unresolved external symbol [email protected] referenced in function "unsigned long __cdecl GetModuleBase...  а такжеerror LNK2019: unresolved external symbol [email protected] referenced in function "unsigned long __cdecl GetModuleBase..., Возможно, вы можете привести рабочий пример?

    от yoni0505
  • @ yoni0505 добавить #pragma комментарий (lib, & quot; psapi & quot;)

    от
  • 6

    Code:

    #pragma comment( lib, "psapi" )
    
    DWORD GetModuleBase(HANDLE hProc, string &sModuleName) 
    { 
       HMODULE *hModules; 
       char szBuf[50]; 
       DWORD cModules; 
       DWORD dwBase = -1; 
       //------ 
    
       EnumProcessModules(hProc, hModules, 0, &cModules); 
       hModules = new HMODULE[cModules/sizeof(HMODULE)]; 
    
       if(EnumProcessModules(hProc, hModules, cModules/sizeof(HMODULE), &cModules)) { 
          for(int i = 0; i < cModules/sizeof(HMODULE); i++) { 
             if(GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) { 
                if(sModuleName.compare(szBuf) == 0) { 
                   dwBase = (DWORD)hModules[i]; 
                   break; 
                } 
             } 
          } 
       } 
    
       delete[] hModules; 
    
       return dwBase; 
    }