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 的角度来看,您需要使用GetModuleHandleGetModuleInformation函数。这些使您可以按名称查找模块句柄,然后检索信息,包括有关该句柄的基地址。

使用标准 P/Invoke 包装器包装这些 API 应该很简单。

于 2008-11-06T16:19:05.580 回答