1. ホーム
  2. c++

[解決済み] HMODULEとは?

2022-02-18 02:02:32

質問事項

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

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

解決方法は?

ご指摘の方法で問題ありません。

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

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

注入した dll が注入元プロセスと同じアドレスにロードされているとは限らないので、注入元プロセスの関数で GetProcAddress を呼び出して得られるアドレスをそのまま使用することはできません。

HMODULE は、DLL のベースアドレスに過ぎません ( この回答 をご覧ください)。したがって、注入するプロセスのDLLのHMODULEを取り、あなたの関数のGetProcAddressが返すアドレスからそれを引くことができます。次に、ターゲットプロセス内の注入されたDLLのHMODULEをこのオフセットに追加すると、ターゲットプロセス内の注入されたDLLのターゲット関数のアドレスが得られます。この関数が正しいシグネチャを持っていると仮定して、リモートスレッドを作成する呼び出しにスレッド関数としてこれを渡すと、ターゲットプロセスでターゲット関数が実行されることになります。

で詳しく説明しています。 この回答 .