2


1

Win32 Cでエクスポートされていない関数を呼び出す方法について教えてください。

3 Answer


6


コードと同じモジュール(DLL / EXE)で定義されている未エクスポート関数を呼び出すのは簡単です。他のC関数と同じようにそれらを呼び出します。 明らかにこれはあなたが求めているものではありません。 別のモジュールで未エクスポートの関数を呼び出したい場合は、どういうわけかそれらのアドレスを見つける必要があります。

これを行う1つの方法は、最初のモジュールが2番目のモジュールのエクスポートされた関数を呼び出して、関数ポインターを返すようにすることです。 (または、関数ポインタを含む構造体、クラスのインスタンスへのポインタなど)ファクトリパターンを考えてください。

もう1つの方法は、登録関数を最初のモジュールからエクスポートし、2番目のモジュールの初期化コードにそれを呼び出してもらって、それをある種の識別情報とともに未エクスポート関数へのポインタに渡すことです。 (2番目のモジュールがアンロードされる前に呼び出される対応する登録解除関数もあります。)

さらに別の方法は `dbghelp.dll`を使ってデバッグシンボルを調べることです。 デバッグシンボルを配布する必要があり、極端に複雑であることは言うまでもありませんが、実際のアプリケーションにはお勧めできません。


3


bk1eの答えに加えて、さらに別の方法があります(同様にお勧めできません)。

  1. DLL内のその関数の相対アドレスを取得します(例: 分解によって)。 これは手動でそしてコンパイルの前にされなければなりません。

  2. プログラムでは、メモリ内のdllの開始アドレスを取得する必要があります(たとえば、エクスポートされた関数といくつかの計算を使用して)。

  3. これで、関数の相対アドレスを使用して、エクスポートした関数の開始アドレスとしてその関数を直接呼び出すことができます。

私はこれをお勧めしません。 それはそのdllの1つの定義されたバージョンでのみ動作します。 再コンパイルやアドレスが変わる可能性があります。 あるいは、その機能はこれ以上必要とされなくなり、削除されます。 この関数がエクスポートされないのには理由があるはずです。 一般的に - あなたは図書館の作者が意図的にあなたにしたくない何かをアーカイブしようとします、そしてそれはほとんどの場合「悪」です。

'' '' '

あなたはida-nameを言った。 この名前には開始アドレスが含まれます。


0


2つの方法はありません。スタックにプッシュされる内容と、その型を決定するためにどのように使用されるかを理解するために、逆アセンブリを調べる必要があります。