こんにちは、これを説明するのは難しいかもしれませんが、最善を尽くします。
プログラムに挿入される DLL を作成しています。DLL 内から必要なデータにアクセスするために、別のアドレスへのポインターである「ベース アドレス」にデータをマップしました。そこから、データにアクセスするには、そのアドレスを 0x34 ずつインクリメントする必要があります。構造体を有利に使用できると考えましたが、機能していないようです。問題は、データへの最終ポインタを取得するために 2 番目のアドレスをインクリメントする方法がわからないことです。
私が持っているのはこれです
typedef unsigned char BYTE;
typedef struct
{
DWORD Some_Int;
//big struct of DWORDS simulating what is in the applicaiton.
//shortened for posting
}DATA;
typedef struct
{
BYTE Unknown[0x34];
DATA *p_data;
}VARBASE;
DWORD WINAPI function()
{
VARBASE *Stats = (VARBASE*)0x00BBC9CC;
char lol[1000];
sprintf(lol, "stats pointer: %p | DATA pointer: %p", Stats, Stats->p_data);
SomeFunction(lol); //wrapper for MessageBoxA()
return NULL;
}
Stats は正しいアドレスを指していますが、データ セットへの 2 番目のポインターを取得するために 0x34 バイトのデータを読み取る (またはポインター 0x34 をインクリメントする) ことができません。この現在のコードを使用すると、p_data は 0A0* * * の範囲内にあるはずの 0000155A などに設定され、読み取り時に segfault が発生します。CheatEngine のようなメモリ マッパーでアプリケーションを開いたので、数学が正しいことはわかっています。具体的には、ベース ポインタ -> アドレス + 0x34 -> CheatEngine 内からのデータを追加できます。
基本構造を使用してデータを指すよりも、これを行う簡単な方法はありますか? 基本的にそのポインター - >ポインター + 0x34 - >データと私が直面している問題は、2番目のポインターをインクリメントして設定できないため、データにアクセスできることです。