2012-04-07 37 views
3

Minesweeper에서 타이머 값을 읽는 프로그램을 만들려고합니다. (OS는 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); 
      } 
     } 
    } 
} 

답변

6
#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; 
} 
+0

: 여기

내 코드의 'GetModuleBase (pHandle에, (문자열) "Minesweeper.exe"); ' 그러나 나는이 오류가 : '오류 LNK2019 : "를 부호없는 긴 __cdecl GetModuleBase 기능에서 참조 16 @되지 않은 외부 기호 _GetModuleBaseNameA을 ...' ,및 '오류 LNK2019 : "unsigned long __cdecl GetModuleBase ..."함수에서 참조 된 해결되지 않은 외부 기호 _EnumProcessModules @ 16. 아마도 실례를 줄 수 있습니까? – yoni0505

+1

@ yoni0505 #pragma comment (lib, "psapi")를 추가하십시오. –

+2

줄을 추가하고 프로그램을 컴파일합니다. 하지만 'Run-Time Check Failure # 3 -'hModules '변수가 초기화되지 않고 사용되었습니다 .' 다음에'Minesweeper Timer.exe의 0x770215de에서 처리되지 않은 예외가 발생했습니다. Microsoft C++ 예외 : std :: 메모리 위치 0x0034f8f8에서의 bad_alloc과'Minesweeper Timer.exe에서의 처리되지 않은 예외 0x770215de : 0x00000000 : 작업이 성공적으로 완료되었습니다 .' – yoni0505