0

クラス プロシージャのメモリ アドレスが必要な DLL ファイルがあります。DLL ファイルのハンドルを取得していますが、GetProcAddress を使用すると、プロシージャのアドレスを取得できません。プロセス名パラメーターに次の文字列を試しました。

"ProcName"
"ProcClass.ProcName"
"ProcClass::ProcName"
"ProcInterface::ProcName"
"ProcInterface.ProcName"

いずれの場合も、プロシージャのメモリ アドレスを取得できませんでした。手順が公開されていることはほぼ確実です。

これを行うための文字列形式は何ですか? 外部プロシージャを指す関数を宣言し、後でアドレスを取得する方が簡単でしょうか? このような:

procedure ProcName(); stdcall; far; external 'Example.DLL';

ProcPointer := @ProcName;
4

3 に答える 3

5

GetProcAddressエクスポートされた関数のアドレスのみを提供します。あなたの DLL はクラスのメソッドをエクスポートしません!

エクスプローラーを使用しPEて、エクスポートされた名前を探します。たとえば、 GExpertsPEで利用可能なエクスプローラーを使用します。GExperts メニューの下に「PE 情報」メニュー エントリがあります。

于 2011-03-18T13:53:46.500 に答える
1

ここでリバース エンジニアリングの領域に入ります。

私があなたなら、目的のメソッドの呼び出しに続いて、デバッガーの CPU ビューをステップスルーし、エントリ ポイントのアドレスを見つけると思います。DLL のベース アドレスからそれを引くと、それがオフセットになります。次に、実行時にアドレスを計算するには、その時点でメモリ内の DLL のベース アドレスにオフセットを追加するだけです。LoadLibrary または GetModuleHandle を呼び出すと、ベース アドレスを見つけることができます。

オフセットをハードコーディングする理由 DLL を変更することはできないので、それほど制限されているようには見えません。オフセットのハード コーディングが実行できない場合は、エントリ ポイントを特定する他の方法がありますが、私はそれに関する世界最高の専門家ではないことを認めなければなりません。

最後に、replacement メソッドを実装するときは、Self の代わりになる最初のパラメーターである追加のパラメーターを持つグローバル関数/プロシージャーに置き換える必要があります。

于 2011-03-18T14:00:45.530 に答える
0

これは私の読み方が悪いのかもしれません。しかし、あなたがDLLを書いたようです。

どのクラスのメンバーでもない関数を作成し、それを DLL からエクスポートする必要があります。その関数内で、クラス メソッドを呼び出します。

DLL を作成していない場合でも、DLL がエクスポートする関数を見つける必要があります。少なくとも Pascal では、それらのいずれかがクラス メソッドである可能性はほとんどありません。

誰かが C++ で dll を作成し、そのメソッドをエクスポートした場合、C++ の名前修飾規則を調査する必要があります。

于 2011-03-19T02:55:44.227 に答える