2012-03-03 18 views
10

私は少し問題があります。私はDLLをプロセスにロードしています(それは私のものではありません)、私はその中で関数を使用しなければなりません。この関数にはオフセットがあるので、DLLのアドレスを取得して関数に到達するためにそれをオフセットに追加するだけです。 GetModuleHandle()HMODULEという変数を返しますが、実際には私はHMODULEが何であるか分かりません。ロードされたDLLのアドレスか他のマークですか?HMODULEとは

DLLがロードされている場所のアドレスでない場合は、どうすればこのアドレスを取得できますか?私は自分自身を明確にすることを望む。

答えて

8

提案する方法は正常に動作します。

ターゲットプロセスにdllを注入し、dllを注入したプロセスからターゲットプロセス内のそのdll内の関数のアドレスを取得したようです。

ターゲットプロセスにdllを注入したプロセスにdllがロードされていて、ターゲットプロセスにリモートスレッドを作成してターゲットプロセスでターゲット関数を実行させたいと思っています。

あなたが注入したdllは、注入プロセスのときと同じターゲット・プロセスのアドレスにロードされないことがあるので、注入プロセスの関数でGetProcAddressを呼び出すことで得られるアドレスを単純に使用することはできません。

HMODULEはDLLのベースアドレスです(詳細はthis answerを参照)。だから、あなたの注入プロセスでdllのHMODULEを取得し、あなたの関数上でGetProcAddressによって返されたアドレスからそれを引き出すことができます。ターゲットプロセスの注入dllのHMODULEをこのオフセットに追加して、ターゲットプロセスの注入されたdll内のターゲット関数のアドレスを取得することができます。この関数が正しいシグネチャを持っていると仮定すると、スレッド関数として呼び出しに渡してリモートスレッドを作成し、ターゲットプロセスでターゲット関数を実行しています。

詳細はthis answerで説明します。

+0

ありがとうございます。私は別の問題があります。私がこのようにしているとき - > http://wklej.org/id/700802/私は間違った和を得ています。私はそれを好きにしなければならない - > http://wklej.org/id/700803/ ?? – Blood

+0

@Blood:これらのことはどちらも意味をなさない。オフセット(ベースからファンクションへ移動する)を追加しましたが、それを減算するのを忘れました(最初にベースを取得する)。私の答えを見てください。あなたは両方をしなければならないので、彼らはキャンセルするだけで、気にしないかもしれません。 –

+0

David、それが取り消す唯一の時間は、dllが両方のプロセスの同じベースアドレスにロードされている場合です。それ以外の場合は私の答えが働き、あなたのことはありません:)。 –

4

コールGetProcAddress。あなたはそれを(関数に到達するために)追加して(ベースアドレスを得るために)減算する必要があるので、オフセットは打ち消されますので、気にしないかもしれません。

1

これはPOSIX dlopen()関数によって返されたvoid*と似ています(typedefであるかもしれませんが、確かに分かりません)。これを引数としてGetProcAddressに渡します。あなたが完了した場合は、FreeLibraryに渡してDLLをアンロードします。

+0

typedef void * HANDLE; typedef HANDLE HMODULE;だからHMODULEはvoid *です。 – quantum

関連する問題