1

こんにちは、これを説明するのは難しいかもしれませんが、最善を尽くします。

プログラムに挿入される 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番目のポインターをインクリメントして設定できないため、データにアクセスできることです。

4

2 に答える 2

0

構造体の 2 つのメンバーの間にパディングが存在する可能性があることを認識していますか? これは「どうすれば間違ったやり方をするのか?」の一例です。おそらく、あなたのプログラムがどの問題を解決するかを私たちに伝えたほうがよいでしょう。

0x00BBC9CC + 34が a を指すように適切に配置されていると確信している場合はDWORD *、ポイントに直接ジャンプしてみませんDWORD **some_int = 0x00BBC9CC + 34;か? ..? ところで、このアドレスはどこから取得していますか? 残念ながら、Win32 C プログラマーが実際に C プログラムを作成することはほとんどありません。

于 2013-03-29T03:42:19.580 に答える
0

問題を修正しました。ベース アドレス ポインターを参照し、その値を VARBASE 構造体に渡す必要がありました。

DWORD WINAPI function()
{
    FILE *fp;
    fp = fopen("testaddr.txt", "a+");
    DWORD *ptr = (DWORD*)0x00BBC9CC;
    VARBASE *Stats = (VARBASE*)*ptr;
    //removed debug output to file
    fclose(fp);
    return NULL;
}
于 2013-03-29T20:55:09.547 に答える