10

MS-Office DLLを少し覗いてみましたが、一部のDLLにはエクスポートされた関数がないことに気付きました。私がよく理解していないのは、アプリケーションが関数をエクスポートせずにこれらのDLLをどのように使用できるかということです。

つまり、dllmain()はLoadLibrary()で実行されますが、ポイントは何ですか?なぜ誰かがエクスポートされた関数なしでDLLを作成するのでしょうか?

ありがとう!:-)

4

5 に答える 5

3

問題のDLLは調べていません。しかし、MSOfficeのようなものでは、Microsoftがこれを行ってDLLを難読化し、デバッグ/リバースエンジニアリングをより困難にする可能性があります。

しかし、あなたが尋ねると、そのようなDLLをどのように使用しますか?アプリケーションがDLLのレイアウトを知っている場合は、既知の関数のアドレスを使用して関数ポインターを作成し、それを呼び出すことができます。

本当にさらに掘り下げたい場合は、DLLをobjdumpして、標準のC / C ++ ABI関数プロローグとエピローグを探し、関数がどこから始まるかを調べることができます。

于 2011-07-05T20:10:47.543 に答える
3

異なる言語向けのプログラムのバージョンを処理する1つの方法は、すべてのリソースを言語DLLに入れることです。DLLにはコードは含まれていません。ターゲット言語に翻訳されたリソースのみが含まれています。メインプログラムが起動したら、適切な言語のDLLをロードするだけです。

于 2011-07-05T20:15:49.850 に答える
2

LoadLibraryを呼び出すと、DLLはそのDllMainの呼び出しを取得します。それがDLLエントリポイントです。プロセスアタッチとスレッドアタッチで呼び出されます。したがって、エントリポイントがあります。

少なくとも1つのエントリポイントがあるとすぐに、いくつかのインターフェイス(たとえば、ファクトリ)のインスタンスを作成し、他のモジュールがそれらを取得するTLS変数などに設定できます。

そのため、アプリケーション以外に外部に公開されていないCOMと同様のインターフェイスシステムを使用できます。そのようなもの-多くのオーバーバリエーションが可能です。

于 2011-07-05T20:26:39.187 に答える
2

資力

DLLには、文字列テーブル、画像、アイコンなど、Officeの他の部分で使用されるリソースが含まれている可能性があります。

于 2011-07-05T20:41:05.763 に答える
1

それらがCインターフェースとしてエクスポートされない可能性は常にあります。DLLは魔法ではなく、単なるビットとバイトであり、Windowsに要求しないと、DLLからコードを取得できないということは何もありません。.NETはこのアプローチを採用していると思います。通常のGetProcAddressアプローチで.NET関数を使用できるようにする代わりに、メタデータをDLLに保存してCLRに何が含まれているかを通知します。あなたが明示的にそれを求めない限り。

于 2011-07-05T20:18:26.820 に答える