2013-07-31 2 views
5

WinAPI의 ReadProcessMemory()을 사용하여 게임에서 "숨겨진"정보를 읽습니다.".exe"+ 오프셋에서 메모리를 읽으시겠습니까?

나는 치트 엔진을 사용하여 정적 포인터를 찾았지만 그것들을 읽는 법을 모르겠습니다. 내가 ReadProcessMemory() 읽을 수있는 주소로 "mygame.exe"+1C50 변환 어떻게 내가 WinAPI를 정말 새로운 해요 "mygame.exe"+1C50

: 치트 엔진은 나에게 이런 일에 대한 포인터를 제공?

편집 : 문제를 단순화하려고 시도했지만 처음부터 전체 코드를 입력해야했습니다. 정적 주소와 다중 레벨 포인터를 사용하고 있지만 기본 주소 나 w/e를 얻는 데 여전히 어려움이 있습니다.

이 여기에 전체 코드와 a picture of my cheat engine address입니다 :

#include <iostream> 
#include <windows.h> 
#include <tlhelp32.h> 

using namespace std; 

HANDLE GetProcessHandle(const char *procName); 

int main() 
{ 
    const char *procName = "prism3d.exe"; 
    HANDLE hProc = GetProcessHandle(procName); 
    if (hProc) { 

    /* This works if I use the dynamic address (f.e. 0x02C2C4DC), 
     but it changes every time I restart the game. 
     I need to use the static address (prism3d.exe+A1C) to get 
     the dynamic address for my "nuke". 
     */ 
     float nuke; 
     ReadProcessMemory(hProc, (void*)0x02C2C4DC, &nuke, 4, 0); 
     cout << nuke; 

    } 
    CloseHandle(hProc); 
    return 0; 
} 

HANDLE GetProcessHandle(const char *procName) 
{ 
    HANDLE hProc = NULL; 
    PROCESSENTRY32 pe32; 
    pe32.dwSize = sizeof(PROCESSENTRY32); 
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if (Process32First(hSnapshot, &pe32)) { 
     do { 
      if (!strcmp(pe32.szExeFile, procName)) { 
       hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); 
       break; 
      } 
     } while (Process32Next(hSnapshot, &pe32)); 
    } 
    CloseHandle(hSnapshot); 
    return hProc; 
} 

편집 2 : 여기 내 핵의 값을 읽는 시도하는 방법은, 그러나, 임의의 숫자 나는 게임을 다시 시작 다른 모든 시간을 나에게 준다 (때때로) ... 등, 때로는 0, 324324324입니다 :

if (hProc) [ 

    DWORD baseAddr = (DWORD)GetModuleHandle(procName) + 0xA1C50; // also tried this with GetModuleHandle(NULL) 
    DWORD mainAddr; 
    ReadProcessMemory(hProc, (void*)(baseAddr + 0x111C), &mainAddr, 4, 0); 

    // Nuke 
    float nuke; 
    DWORD nukeAddr; 
    ReadProcessMemory(hProc, (void*)(mainAddr + 0x48), &nukeAddr, 4, 0); 
    ReadProcessMemory(hProc, (void*)nukeAddr, &nuke, 4, 0); 
    cout << nuke; 
} 
+0

"game.dll"의 기본 주소를 찾은 다음 1C50을 추가해야합니다. –

답변

6

오프셋 기지 일반적으로 메모리 모듈의 시작, 당신이 얻을 수 GetModuleHandle (이 주소가 반환하는 주소는 메모리에있는 PE의 시작입니다). 일부 규칙은 코드 섹션의 시작에 대한 기준을 정의하기 때문에 일반적으로 말합니다. 그러면 코드 섹션에서 PE에서 읽어야합니다.

UINT_PTR addr = (UINT_PTR)GetModuleHandle("game.dll") + 0x1C50; 
ReadProcessMemory(hProc,(void*)addr,pBuffer,nSize,&BytesRead); 

이 과정은, (DLL 인젝션을 통해) 대상으로하는 원격을 통해이 작업을 수행의 주소 공간에서 실행하는 경우 위에만 작동 : 당신이 다음과 같은 일을 할 수

프로세스 (예제에서 볼 수 있듯이)를 사용하면 관심있는 모듈에 대한 유효한 핸들을 얻기 위해 모듈을 처리하도록 열거해야합니다.

MSDN의 예제는 here이며 약간 리팩토링합니다. 이름과 대조하여 일치하면 HMODULE을 반환하고 이것을 캐스팅하면 그는 모듈 기본 주소입니다.

+0

작동하지 않는다. 올바른 주소가 아니라 엉뚱한 엉덩이 번호를주고있다./질문을 편집했다. 정적 포인터가 이미있다. .exe –

+0

@SkamahOne 주소 CE 보고서가 파일 상대인지 코드 섹션인지 확인 했습니까? 상대적인? 정확히 "별난"숫자는 무엇입니까? – Necrolis

+0

아니, 어떻게 확인합니까 ...? 나는 다른 주소를 가리키는''mygame.exe "+ 1C50' 값을 가진 포인터를 가지고 있는데, 나는"다른 주소 "를 얻으려고합니다. 그리고 단지 거대한 정수인'17512325403' 등이 있습니다. –

관련 문제