C# 在内存中查找DLL的地址

C# 在内存中查找DLL的地址,c#,dll,addressing,C#,Dll,Addressing,我刚刚进入低级编程(读/写内存之类的东西),遇到了一个我找不到答案的问题 我想从中读取的信息有一个相对于内存中加载的DLL的地址,例如,它位于mydll.DLL+0x01234567。我遇到的问题是dll在内存中移动,但偏移量保持不变。是否仍要查找此dll在内存中的位置 我目前正在尝试最好用c语言来实现这一点,但如果能在大多数高级语言中得到帮助,我将不胜感激。从Win32的角度来看,您需要使用和函数。这些允许您按名称查找模块句柄,然后检索信息,包括关于该句柄的基址 使用标准的p/Invoke包装

我刚刚进入低级编程(读/写内存之类的东西),遇到了一个我找不到答案的问题

我想从中读取的信息有一个相对于内存中加载的DLL的地址,例如,它位于mydll.DLL+0x01234567。我遇到的问题是dll在内存中移动,但偏移量保持不变。是否仍要查找此dll在内存中的位置


我目前正在尝试最好用c语言来实现这一点,但如果能在大多数高级语言中得到帮助,我将不胜感激。

从Win32的角度来看,您需要使用和函数。这些允许您按名称查找模块句柄,然后检索信息,包括关于该句柄的基址


使用标准的p/Invoke包装器包装这些API应该是直截了当的。

我尝试了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;
                }
        }
现在您有了这个模块,只需执行dllbaseAndressiwant.BaseAddress即可获得该值

希望这有帮助