WinAPI ReadProcessMemoryは常に同じアドレスです
-
12-12-2019 - |
質問
WinAPI関数ReadProcessMemory
を使用してプロセス(アドレス:0x58F03C)からデータを読みます。
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
を使用して値をスキャンして、変更値の変更を実行します。
ありがとう。
解決
動的メモリ割り当てに遭遇しています。 The The The The The The The The The The The The The The The The FalteEngineの世界
uint32_t
'Dのメモリ内の一部のデータ(DWORD
/ malloc
)を検討してください。データのアドレスが見つかった場合は、次回プロセスを起動したときに、アドレスが同じになるという保証はありません。これは、malloc
によって返されたメモリがメモリ内の異なる点に基づく可能性があるためです。
動的メモリ割り当てを倒すために使用されるトリックは、興味のある値のアドレスをリードすることができる静的ヒープアドレスを見つけることです。チュートエンジンチュートリアルでは、これがどのように行われるかを示します。マルチレベルのポインタについても同様です。より高いレベルでは、これは動的に割り当てられたメモリに対応しており、その他の動的に割り当てられたメモリなどのポインタを保持します。
ポインタを取得するためのhaltEngineで使用される方法は、次のように働きます。
- アクセスハードウェアブレークポイントを設定するに興味があるデータ値のアドレスに設定
- コードがアクセスすると、ハードウェアブレークポイントはコードがどのように見えるかを表示します
コードは通常このようなものを見るでしょう:
.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でDWORD
(64ビットの場合はQWORD
)を読み込み、0x85を値に追加します。これにより、HP値のアドレスが表示されます。
他のヒント
アドレスが、事前割り当て変数がLive(ヒープとスタックには適していない)の実行可能ファイルの実行可能ファイルにある場合は機能します。
MSDN の例「プロセスのためのすべてのモジュールの列挙」。
EnumProcessModules()モジュールハンドルを取得するには、。それらはイメージベースアドレスです。
実行可能ファイルのイメージベースアドレスを入手でき、アドレスを調整できます。