3

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

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

私は現在、できればC#でこれをやろうとしていますが、ほとんどの高級言語で助けていただければ幸いです。

4

2 に答える 2

2

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

ただし、私にとってはうまくいく解決策を発見したので、ここに示します。

タイプ 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 を実行して値を取得できます。

お役に立てれば

于 2008-11-11T14:05:39.063 に答える
1

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

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

于 2008-11-06T16:19:05.580 に答える