3

WINAPI関数を使用してプロセス(アドレス:0x58F03C)からいくつかのデータを読み取りましたReadProcessMemory

DWORD proc_id;
GetWindowThreadProcessId(hwnd, &proc_id);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
int value=0;

while (1)
{
    ReadProcessMemory(hProcess, (LPVOID)0x58F03C, &value, sizeof(value), 0);
    cout << "val: " << value << endl;
}

プロセスを再開するたびにアドレスが変わるので、常に同じアドレスを取得する方法があるのだろうかと思いました。それができる「トレーナープログラム」がたくさんあるので、あるに違いありません。読み取り/書き込みに適したアドレス値をどのように取得しますか?

現在、で値をスキャンして取得し、CheatEngine変更された値を次のスキャンで実行しています。

ありがとう。

4

2 に答える 2

2

動的メモリ割り当てが発生しています。CheatEngineの世界では、これらは「ポインタ」と呼ばれます。

'dであったメモリ内のいくつかのデータ(たとえば、uint32_t/ )を考えてみましょう。データのアドレスが見つかった場合、次にプロセスを起動したときにアドレスが同じになるという保証はありません。これは、によって返されるメモリがメモリ内の別のポイントに基づいている可能性があるためです。DWORDmallocmalloc

動的メモリ割り当てを無効にするために使用されるトリックは、関心のある値のアドレスにつながる静的ヒープアドレスを見つけることです。CheatEngineチュートリアルでは、これがどのように行われるかを示します。同じことがマルチレベルポインタにも当てはまります。より高いレベルでは、これは動的に割り当てられたメモリに対応し、他の動的に割り当てられたメモリへのポインタなどを保持します。

ポインタを取得するためにCheatEngineで使用されるメソッドは、ほぼ次のように機能します。

  • 関心のあるデータ値のアドレスにアクセスハードウェアブレークポイントを設定します
  • コードがそれにアクセスすると、ハードウェアブレークポイントはコードがどのように見えるかを示します

コードは通常、次のようになります。

mov eax, 0x1234ABCD 
dec dword ptr ds:[eax+0x85]

これは、敵に当たったときにHPを減少させるコードに対応している可能性があります。この場合、0x1234ABCDはポインターであり、0x85はオフセットです。Cコードでは、これが発生した可能性があります。

struct some_struct* blah = malloc(...);
...
blah->HP--;

0x1234ABCDはのアドレスになりますblah。HP値は、が指すブロック内のどこかに存在しblahます。メモリブロックへのオフセットは0x85です。次に、トレーナーを作成している場合は、0x1234ABCDでDWORDQWORD64ビットの場合)を読み取り、値に0x85を追加します。これにより、HP値のアドレスがわかります。

于 2012-05-20T01:42:47.520 に答える
0

これは、アドレスが、事前に割り当てられた変数が存在するデータセクションの実行可能ファイルの部分にある場合に機能します(ヒープとスタックには適していません)...

MSDNの「プロセスのすべてのモジュールの列挙」の例を見てください。

EnumProcessModules()を使用してモジュールハンドルを取得します。これらはイメージベースアドレスです。

実行可能ファイルのイメージベースアドレスを取得し、それによってアドレスを調整できます。

于 2012-05-20T00:23:06.933 に答える