ソースコードに基づいて既知の変数を持つWin32アプリから変数にアクセスしようとしています。
Foo foo; // Class foo
foo.mystring = "All your base are belong to us"; // where this is defined as: 'string mystring'
今、逆アセンブラを使用してPEを逆アセンブルしようとしましたが、これが見つかりました
.rdata:00446074 aAllYourBaseAre db 'all your base are belong to us',0
これで、必要なクラス変数を持つ以前のwin32アプリのイメージベースアドレスを取得する別のwin32プロセスができました。
このコードでプロセスアドレスを取得します:
HMODULE parent = ::GetModuleHandle(NULL);
if (parent) {
const BYTE* imageBase = reinterpret_cast<const BYTE*> ( parent );
const char* strMemberValue = *reinterpret_cast<const char**>((unsigned char*)imageBase + 0x00446074);
std::cout << "Value=" << strMemberValue;
}
親は、私がアクセスしようとしているプロセスです。また、親が正しいプロセスであることをテストしました。問題は、ベースアドレス+オフセットをキャストして文字列を取得しようとすると、何も取得できないことです。
編集:
私は自分の主張を逃した。すでに本番環境にあるターゲットWin32アプリを再コンパイルする方法はありません。ただし、その実行可能ファイルのいくつかの変数にアクセスする必要があります。ここにあるコードは、単なる概念実証**です。
また、「DLLインジェクション」を行っています
デバッグ:
クラスはメソッドを持つ構造体であるため、IDAProを使用して掘ったこのコードは次のクラス定義であると想定しています。Foo
00000000 ; ---------------------------------------------------------------------------
00000000
00000000 ; (Class Informer)
00000000 type_info struc ; (sizeof=0x8, variable size)
00000000 vftable dd ? ; offset (00000000)
00000004 _m_data dd ?
00000008 _m_d_name db 0 dup(?) ; string(C)
00000008 type_info ends
00000008
00000000 ; ---------------------------------------------------------------------------
しかし、私はまだこれについて確信が持てません。