1

コードを変更できないdllを使用しています。使用しているクラスを公開するパブリック インターフェイスがありますSurface

dll のコードには、次のようなものが含まれています。

static Texture  staticTexture[MAXTEXTURECOUNT];
static Texture *staticTextureCurrent = NULL;
static Texture *staticGetTextureById(int id);

class Texture
{
public:
    int     _id;

...
    void   *_dib;
...
};

void Surface::DrawSetTexture(int id)
{
    Texture *texture = staticGetTextureById(id);
    staticTextureCurrent = texture;
}

Texture クラスは、パブリック ヘッダー ファイルによって公開されることはありません。Texture::_dib が指すメモリにアクセスする必要があります。staticGetTextureById理想的には、どこからでも電話できるようにしたいのですが、私が求めているのはメモリです。ただし、Texture クラスがどのように見えるかは多かれ少なかれ知っています。

DrawSetTexture の呼び出し後に CPU レジスタをいじって、テクスチャ ポインタを回復できるかどうかを確認しようとしましたが、まったくうまくいきませんでした。

このポインターを取得する方法はありますか? クラッシュせず、ある程度確実に機能する限り、どんなにハックであっても、どんな解決策でもうれしいです。与えられたものよりも、その記憶に引き寄せるより速い方法が必要です。

4

1 に答える 1

0

私の理解では、クラスは、設定方法に関して C の構造体と同様に動作します。したがって、おそらく ptrToClassObject+offset を実行することでうまくいくかもしれません。クラスメンバーのオフセットを取得する方法がありますが、それがどのように設定されているかについては何も知りません。

于 2013-09-07T16:38:14.493 に答える