我刚刚进入低级编程(读/写内存之类的东西)并且遇到了一个我找不到答案的问题。
我要读取的信息有一个地址,该地址与内存中加载的 DLL 相关,例如,它位于 mydll.dll + 0x01234567。我遇到的问题是 dll 在内存中移动,但偏移量保持不变。无论如何要找出这个dll在内存中的位置。
我目前正在尝试最好在 c# 中执行此操作,但我将感谢大多数高级语言的帮助。
我刚刚进入低级编程(读/写内存之类的东西)并且遇到了一个我找不到答案的问题。
我要读取的信息有一个地址,该地址与内存中加载的 DLL 相关,例如,它位于 mydll.dll + 0x01234567。我遇到的问题是 dll 在内存中移动,但偏移量保持不变。无论如何要找出这个dll在内存中的位置。
我目前正在尝试最好在 c# 中执行此操作,但我将感谢大多数高级语言的帮助。
我尝试了 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 即可获取值。
希望这可以帮助
从 Win32 的角度来看,您需要使用GetModuleHandle和GetModuleInformation函数。这些使您可以按名称查找模块句柄,然后检索信息,包括有关该句柄的基地址。
使用标准 P/Invoke 包装器包装这些 API 应该很简单。