質問

低レベルのプログラミング(メモリへの読み書き)を始めたばかりで、答えが見つからない問題に遭遇しました。

読み取りたい情報には、メモリにロードされたDLLに関連するアドレスがあります。たとえば、mydll.dll + 0x01234567です。持っている問題は、dllがメモリ内を移動しますが、オフセットは同じままであるということです。とにかく、メモリ内のこのdllの場所を見つける方法はありますか。

私は現在、できればこれをc#で実行しようとしていますが、ほとんどの高級言語で助けてくれて感謝しています。

役に立ちましたか?

解決

私はRob Walkerが提案した方法を試してみましたが、動作しませんでした(dllが別の実行可能ファイルの一部としてロードされたため、簡単に見つからなかったため動作しなかったと思います)。

しかし、私に合った解決策を見つけたので、ここにあります:

iはProcessタイプのオブジェクトを作成しました

String appToHookTo = "applicationthatloadedthedll";
Process[] foundProcesses = Process.GetProcessesByName(appToHookTo)
ProcessModuleCollection modules = foundProcesses[0].Modules;
ProcessModule dllBaseAdressIWant = null;
foreach (ProcessModule i in modules) {
if (i.ModuleName == "nameofdlliwantbaseadressof") {
                    dllBaseAdressIWant = i;
                }
        }

これで、dllbaseAdressIWant.BaseAddressを実行して値を取得できるモジュールができました。

これが役立つことを願って

他のヒント

Win32の観点からは、 GetModuleHandleを使用する必要があります。 および GetModuleInformation 関数。これにより、モジュールハンドルを名前で検索し、そのハンドルに関するベースアドレスなどの情報を取得できます。

標準のP / Invokeラッパーを使用してこれらのAPIをラップするのは簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top