0


ちょっと...私は、逆アセンブルされてから逆コンパイルされたコードから唯一の単一関数CreateInterfaceをエクスポートするDLLを持っています:

int __cdecl CreateInterface(const char *a1, int a2)
{
//many crazy things
}

ここでは戻り値の型が int になっていますが、実際には何らかの構造体へのポインターです。メインのexeから、このlibがロードされ、そのように使用されます:

int (__stdcall *__cdecl Sys_GetFactory(int (__stdcall *hModule)()))()
{
  int (__stdcall *result)(); // eax@1

  result = hModule;
  if ( hModule )
    result = GetProcAddress(hModule, "CreateInterface");
  return result;
}

void some_funct()
{
    FARPROC net_interface =  Sys_GetFactory(pModule);
    int s_pClientNet = ((int (__cdecl *)(_DWORD, _DWORD))net_interface)("INetClient_003", 0);
}

初期化された後、そのように使用されました:

 int result = (*(int (__stdcall **)(int, int, int, int))(*(_DWORD *)s_pClientNet + 60))(
                 login,
                 password,
                 mw_account_struct,
                 mw_account_struct_size);

そう..構造体に戻ります。とにかくそれを復元するには、必要な関数を非常にクレイジーな方法で呼び出すのではなく? つまり、(s_pClientNet + 60)

PS 確かに、dll ソース、def ファイルなどを持っておらず、ターゲット クラス/構造体にどの関数を含めることができるかさえわかりません...私が知っている唯一のことは、いくつかの呼び出しですそのような関数に s_pClientNet + 60

4

3 に答える 3

3

うーん、これは C++ クラスのようです。余分なレベルの間接性があり、それは vtable であるに違いありません。s_pClientNet は間違いなくポインターですが、+60 は逆参照後に発生します。通常、vpointers はクラスの最初の要素であるため、それがより多くの証拠になります。本当に幸運でない限り、同じレイアウトにコンパイルされる C++ クラスを再作成することは基本的に不可能です。ただし、一部の部分は手動で管理できます。

typedef int(*login_fcn_t)(int, int, int, int);

struct ClientInterfaceVtable
{
    _DWORD reserved[60];
    login_fcn_t login_fcn;
};

struct ClientInterface
{
    ClientInterfaceVtable *vpointer;
    /// other fields
};

これで、 を にキャストs_pClientNetした後ClientInterface *、次の方法でログイン メソッドを呼び出すことができるはずです。s_pClientNet->vpointer->login_fcn(login, etc.);

さらにいくつかのフィールドを発見したら、いつでもポリモーフィック C++ クラスを作成して、一致するまで定義をプッシュできるかどうかを確認できますが、移植性はありません。

編集:

うーん、コードがthisポインターを渡していないことに気付きました。私が vtable について完全に間違っていなければ、これは静的メソッド、おそらく何らかのファクトリ メソッドであることを示唆しています。

于 2012-06-12T17:07:16.137 に答える
1

構造体を自動的に識別する方法はわかりませんが、IDA を使用している場合は、IDA 内で構造体を定義してから、呼び出しシグネチャを変更して明示的に使用できる可能性があります (戻り値をその構造体に変更します)。タイプし、再分析を強制します)。

これは、構造を迅速に分析し、プログラムの動作を理解するのに役立ちますが、最終的にはほとんど手動で分析することになります。

これに役立つIDA/OllyDbg用のスクリプトがいくつかあるかもしれないので、http: //www.openrce.org/downloads/を一瞥する価値があるかもしれません

于 2012-06-12T16:48:11.070 に答える
1

構造体のレイアウトと配置に関する保証はありません。そのため、各コンパイラは構造体を異なる方法でレイアウトする可能性があります。同じコンパイラでも、修飾子やコンパイラ オプションによってデータのレイアウトが異なる場合があります。

于 2012-06-12T16:09:17.020 に答える