はい、可能です
ほとんどのゲームでどのように行われるかを少し説明します(GTAを元に戻したことはありませんが、とにかくこのようなものだと思います)。
構造の静的および動的割り当てについて説明します。
静的な方法:
GlobalGameInfo g_info; // ... g_info.some_data = 1;
これは、IDAの静的オフセットになります。
lea eax、 [g_info + 0xAABB]; 0xAABBが 'some_data' mov [eax]、1のオフセットであると仮定します;
g_info
は常に同じオフセットに留まるので、見つけたら、 g_info + offset
を使用してデータを取得できます。
動的な方法:
Player *プレーヤー; // Player *プレーヤー[<count>]またはPlayer **プレーヤーとして定義できます。 //同じです// ... player = new Player [players_count]; // ... player [1] .alive = false;
結果は次のようになります:
;これは静的な場所であり、実際には「プレーヤー」変数です。 ;のメモリ内のオフセットを指すアドレスが含まれています。実際のプレーヤーstructuredword_xxxxdd?
したがって、たとえば、 Cheat Engine、新しいアドレスを追加
し、 Pointer
をチェックし、 dword_xxxx
の xxxx
部分を追加し、オフセットします、必要なオフセットを入力します。たとえば、 alive
がオフセット上にある players [1] .alive
を取得します。 0x100の場合、次のように計算します。
value_stored_in_dword_xxxx + sizeof(Player)* player_id + 0x100
したがって、 dword_xxxx
-> 0xAABBCCDD
、 sizeof(Player)
-> 0x204
、 player_id
-> 8
、および offset
-> 0x100
の場合、計算は次のようになります。
0xAABBCCDD +(0x204 * 8)+ 0x100 // ^ base ^ size ^ id ^ offset
例
mov [esi + 0x2F]を指定したので、dl
:
-
esi
は構造体へのポインターです。上を見てください(逆アセンブリ内)。 -
mov esi、dword ptr [dword_xxxx]
(おそらく)は、ポインタを逆参照していることを意味します。つまり、構造が動的に割り当てられます。 -
mov esi、offset dword_xxxx
(おそらく)は、アドレス( xxxx
部分)を esi
に割り当てているだけであることを意味します。これは静的アドレスです。
使用法
チートエンジン
Cheat Engineでは、ポインタとオフセットを入力するだけで簡単です。
ご覧のとおり、 0x5CCB138
は dword_xxxx
の場合、 dword_xxxx
内の値は 0x09021A00
であり、+ 0x142
(私のオフセット)は、ゲーム内の名前。
C
プログラムで実行する場合は、Cで次のように実行できます。
PCHAR my_name = PCHAR(* PDWORD(0x5CCB138)+ 0x142); ^アドレスを保存| | ^取得するderef |オフセットを追加| ^キャスト| 0x09021A00 | // ->注意してください、最大長を超えないでください!// ->は、最後に「あなたの名前」の長さ+ 1 \ x00バイト//があることも覚えておいてください!charnew_name [] = "newName"; strncpy (my_name、new_name、sizeof(new_name)); //繰り返しますが、長さに注意してください!
ただし、適切な方法は、次のように構造体全体を逆にすることです。
struct player_data {int ID;文字名[15]; int some_data; ...;}; //各アイテムの順序/サイズが正しいことを確認してください!//単一のエラーが構造体全体を台無しにする可能性があります//ポインタを理解していると仮定しますplayer_data * data = *(player_data ** )0x5CCB138; //変更を行います//もう一度、長さに注意してください!//また、char * char new_name [] = "new name!"; strncpy(data->name)を使用するとsizeof()が機能しないことに注意してください、new_name、sizeof(new_name));