2013-07-31 10 views
5

私はWinAPIのReadProcessMemory()を使用して、ゲームからいくつかの「隠された」情報を読み取っています。".exe" +オフセットからメモリを読み込んでいますか?

私は、静的ポインタを見つけるためにチートエンジンを使用しましたが、私はそれらから読み込む方法がわかりません。私は私がReadProcessMemory()で読むことができますアドレスに"mygame.exe"+1C50を変換しないか、WinAPIのには本当に新しいです"mygame.exe"+1C50

: チートエンジンはこのような何かに私にポインタを与えますか?

編集:私は問題を単純化しようとしましたが、私は最初に完全なコードを与えておくべきだったと思います。 私はここで静的アドレスとマルチレベルポインタで作業していますが、まだベースアドレスまたはw/eを取得することに固執しています。

#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:ここでは

は完全なコードとa picture of my cheat engine addressです ここで私は(ゲームを再起動するたびに、私は私の核兵器の値を読み取るしようとした方法ですが、それは私に乱数を与え、異なります時にはそれが)...など、時々0324324324です:

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から読み込む必要があります。

あなたは次のような何かを行うことができます:あなたは、リモート経由でこれを行うには、(DLLインジェクション経由)ターゲットとしているプロセスのアドレス空間で実行されている場合

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

上記のみ動作しますあなたの興味のあるモジュールへの有効なハンドルを得るためにモジュールを処理するように列挙する必要があります。

MSDNにはhereの例があります。少しリファクタリングします。名前と照合して一致する場合はHMODULEを返します。これをキャスティングすると、彼はモジュールのベースアドレスです。

+0

正しいアドレスではなく、ちょっと変わったお尻の番号を与えるだけです:/私は質問を編集しました。私はすでに '.exe'静的ポインタを持っています –

+0

@SkamahOneアドレスCEレポートがファイル相対かコードセクション相対? 「奇妙な」数字は正確に何ですか? – Necrolis

+0

いいえ、どうすれば確認できますか?私は '' mygame.exe "+ 1C50'の値を持つポインタを他のアドレスを指しています。私は"他のアドレス "を取得しようとしています。そしてちょうどいくつかの巨大な整数、 '17512325403'など –

関連する問題