我刚刚进入低级编程(读取/写入内存那种东西)并遇到了一个我无法找到答案的问题。
我要读取的信息有一个地址,相对于内存中加载的DLL e,g,它位于mydll.dll + 0x01234567。我遇到的问题是dll在内存中移动但偏移量保持不变。无论如何都要在内存中找到这个dll的位置。
我目前正在尝试用c#做这个,但我很感激大多数高级语言的帮助。
答案 0 :(得分: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来获取值。
希望这有帮助
答案 1 :(得分:1)
从Win32的角度来看,您需要使用GetModuleHandle和GetModuleInformation函数。这些允许您按名称查看模块句柄,然后检索信息,包括有关该句柄的基址。
使用标准P / Invoke包装器包装这些API应该是直截了当的。