【问题标题】:Find the address of a DLL in memory在内存中查找 DLL 的地址
【发布时间】:2008-11-06 16:09:47
【问题描述】:

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

我要读取的信息有一个地址,该地址与内存中加载的 DLL 相关,例如,它位于 mydll.dll + 0x01234567。我遇到的问题是 dll 在内存中移动,但偏移量保持不变。有没有办法找出这个dll在内存中的位置。

我目前正在尝试最好在 c# 中执行此操作,但我会感谢大多数高级语言的帮助。

【问题讨论】:

    标签: c# dll addressing


    【解决方案1】:

    我尝试了 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 即可获取值。

    希望对你有帮助

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 2012-07-02
        • 2018-09-17
        • 2014-02-18
        • 2017-02-24
        • 1970-01-01
        • 2014-08-27
        相关资源
        最近更新 更多