3

DEF ファイルを使用してラッパー DLL を作成し、EXPORTS.

元の DLL のエクスポート (dumpbin を使用して生成) から:

EXPORTS
??0FooBar@@QAE@ABV0@@Z @1

私のラッパーDLL用に作成されたDEFファイルから:

EXPORTS
??0FooBar@@QAE@ABV0@@Z=__E__0__ @1

OllyDbg を使用して結果のラッパー DLL を確認すると、エクスポートが実際に次のように変更されていることがわかります。

Names in FooBarDLL, item 0
 Address=0F085685
 Section=.text
 Type=Export
 Name=??0FooBar

@@QAE@ABV0@@Zご覧のとおり、通常、このタイプのクラス/関数/パラメーターの組み合わせに対して Microsoft Visual C++ によって生成される追加の garbledegock ( ) が欠落しています。

これが OllyDbg の使用に関するユーザー エラーではないことを確認するために、元の DLL のエクスポートもチェックしました。

Names in FooBarDLLOriginal, item 1
 Address=1003A800
 Section=.text
 Type=Export
 Name=??0FooBar@@QAE@ABV0@@Z

元の DLL とまったく同じように見えるラッパー DLL が必要なので、この結果は明らかに良くありません。

Visual C++ が DEF エクスポート定義のフラグメントを無視しないようにするにはどうすればよいですか?

多くのコンパイラとリンカのオプションを試してみましたが、目標に近づくことができませんでした。

4

2 に答える 2

1

この質問 (および他の同様の質問) は、Code Project WRAPPITツールを使用してプロキシ DLL を自動的に作成することに関連しています。Till からの観測を使用した解決策は次のとおりです。

先頭の _ と末尾の @0 で装飾されるように、常にラッパー関数を __stdcall として宣言し、それを .def ファイルで使用して、元の関数の装飾 (存在する場合) が保持されるようにします。

(ラッパーを実際の関数に置き換える場合は、呼び出し規則を __stdcall から必要なものに変更し、__declspec(naked) を削除し、引数宣言を追加し、.def ファイル宣言を変更または削除することを忘れないでください。合わせるなど)

ラッパー .cpp スニペット:

// _OriginalFunction@12
extern "C" __declspec(naked) void __stdcall __E__0__()
    {
    __asm
        {
        jmp p[0*4];
        }
    }

.def ファイル:

EXPORTS
_OriginalFunction@12=___E__0__@0 @1
etc.

これを自動的に行うように、自分のバージョンの WRAPPIT ツールを変更しました。

165c165
<                       fprintf(fdef,"%s=%s @%u\r\n",v[i].en,v[i].in,v[i].o);
---
>                       fprintf(fdef,"%s=_%s@0 @%u\r\n",v[i].en,v[i].in,v[i].o);
167c167
<                       fprintf(fdef,"%s=%s @%u NONAME\r\n",v[i].en,v[i].in,v[i].o);
---
>                       fprintf(fdef,"%s=_%s@0 @%u NONAME\r\n",v[i].en,v[i].in,v[i].o);
225c225
<               fprintf(fcpp,"// %s\r\nextern \"C\" __declspec(naked) void %s %s()\r\n",v[i].en,argv[3],v[i].in);
---
>               fprintf(fcpp,"// %s\r\nextern \"C\" __declspec(naked) void %s %s()\r\n",v[i].en,"__stdcall",v[i].in);
于 2015-11-19T00:11:27.547 に答える