在内存中找到DLL的地址

时间:2008-11-06 16:09:48

标签: c# dll addressing

我刚刚进入低级编程(读取/写入内存那种东西)并遇到了一个我无法找到答案的问题。

我要读取的信息有一个地址,相对于内存中加载的DLL e,g,它位于mydll.dll + 0x01234567。我遇到的问题是dll在内存中移动但偏移量保持不变。无论如何都要在内存中找到这个dll的位置。

我目前正在尝试用c#做这个,但我很感激大多数高级语言的帮助。

2 个答案:

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

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