1

練習のために、特定のメモリアドレスが指しているアドレスを取得しようとしています。どのような結果を得る必要があるかを示すツールがあります。私の場合は次のとおりです。

"clientApp.exe"+0x11F9B08 -> 0E4C5F90

したがって、これは基本的に次の意味であると想定しています:("The base address of the .exe" + 0x11F9B08)そして、それはアドレスを指しています0x0E4C5F90

clientApp.exe のベース アドレスは既に取得しています。EnumProcessModulesそのためにandを使いGetModuleFileNameExました。

小さなスニペット

if ( GetModuleFileNameEx( hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR)))
{
    if(gameName.compare(szModName))
    {
        dwClientBase = (DWORD)hMods[i]; //base address
        break;
    }
}

その後、指定されたアドレスを取得しようとしています。しかし、次の結果はまったく別の結果になります。

DWORD result = (DWORD)(dwClientBase + 0x11F9B08);

これにより、次のことがわかります23042824。そして、私は探しています: 0x0E4C5F90. 近いと思いますが、次に何を試すことができるかわかりません。

ツールが私に与えているのと同じ結果を得るために私が何をすべきか知っている人はいますか?

4

2 に答える 2

1

どんなタイプdwClientBaseですか?それがaの場合は、DWORDにキャストしてからBYTE *算術演算を実行し、ポインタを逆参照して、そのアドレスが指す値を返すようにしてください。

DWORD result = *(DWORD *)( (BYTE *)dwClientBase + 0x11F9B08);

ポインターに数値を追加する場合、コンパイラーは、その数値にポインター型のサイズを掛けたものに等しいバイト数を追加します。これが最初に変換する理由であり、正確にバイトBYTE *を追加します。0x11F9B08

于 2013-01-27T19:16:02.837 に答える
1

You do not dereference the pointer. Try either

DWORD result = *(DWORD*)(dwClientBase + 0x11F9B08);

or

DWORD result = *(DWORD*)(0x11F9B08);

The cast to DWORD* says the compiler to treat the number as a pointer, then dereferencing * it causes read the actual number.

于 2013-01-27T19:10:26.893 に答える