Ok、私はターゲットプロセスのアドレス空間に注入されたDLLを持っています。ターゲットプロセスが使用しているDLLによって提供される関数のリストを返すにはどうすればいいですか? user32.dllには(int test1(str 1、str 2))という関数が含まれていると言います(私はそうではないことを知っています)。別のプロセスのアドレス空間で、dllの関数を呼び出す方法
ありがとうございました。
Ok、私はターゲットプロセスのアドレス空間に注入されたDLLを持っています。ターゲットプロセスが使用しているDLLによって提供される関数のリストを返すにはどうすればいいですか? user32.dllには(int test1(str 1、str 2))という関数が含まれていると言います(私はそうではないことを知っています)。別のプロセスのアドレス空間で、dllの関数を呼び出す方法
ありがとうございました。
本当にあなたが書いたすべてのものを行う必要がありますか?エクスポートされた関数のリストをdllで取得することは自明ではありません。メモリ内のモジュールアドレスを取得した後、PE形式のいくつかのデータ構造を歩かなければなりません。手作業では簡単ではありませんが(DbgHelp functionsはほとんどのプロセスを自動化します) 。一方
、あなただけのDLLがロードされているかどうかを確認し、作業が簡単になり、その機能のいずれかを呼び出したい場合。 DLLをロードする必要がある場合は、あなたが気にしない場合は
、ちょうどLoadLibrary
を呼び出し、モジュールハンドルを取得します。続行したい場合はそうでない場合、あなたがしているので、その呼び出しLoadLibrary
(LoadLibrary
は、DLLの参照カウントをインクリメントした後、それがない場合は、NULL
をロードされている場合は、あなたのモジュールへのハンドルを提供する最初のGetModuleHandle
を呼び出し、 DLLがアンロードされないことを確認してください)。
その後、を使用し、必要な手順が存在するかどうかを確認し、そのアドレスを取得します。通常、WindowsのdllによってエクスポートされたもののようなC関数は、その名前によってのみエクスポートされます(Cオーバーロードは存在しません)。装飾された名前でエクスポートされたC++プロシージャを呼び出す場合は、変更された名前を指定する必要があります。
GetProcAddress
は、あなたがあなたの関数の正しいシグネチャを持つ関数ポインタにキャストする必要がありますことを、あなたにポインタを返します。これで関数が呼び出されました。FreeLibrary
に電話して、dllへの参照カウンタを減らすことを忘れないでください。すべてのこのようなものは、あなたの注入された機能のDllMain
の内部から安全に行うことができない
お知らせ。 hereを参照してください。
最初の方法は、DependencyWalkerを使用することです。プロセス内の各dllのすべてのインポートを取得します。 もちろん、このアプローチでは、LoadLibrary/GetProcAddressを使用した動的呼び出しは扱いませんが、LdrLoadDll/GetProcAddressをフックして、プロセス/ DLLが使用している関数を正確に取得する必要があります。 大きな問題ではありませんが、時間がかかります。
あなたの質問に答えるには、はい。私は行っていると私はどのくらい私が得るかを教えてくれる:) – flavour404
@ flavour404:まあ、あなたは本当にDbgHelp関数を勉強する必要があります。その作業を手作業で行うことは不可能ではありませんが、間違いやすいです。 –