【问题标题】:How to find minimal and maximal address of dll如何找到dll的最小和最大地址
【发布时间】:2021-10-03 09:03:02
【问题描述】:

我通过注入 dll 扫描进程内存并读取它的内存。 问题是我还读取了 dll 的内存。有人知道该怎么做吗?

【问题讨论】:

    标签: c memory dll


    【解决方案1】:

    使用GetModuleInformation,它可以接受HPROCESS 用于您的远程进程,也可以接受HMODULE 用于您注入的DLL,并在MODULEINFO 结构中返回以下信息:

    typedef struct _MODULEINFO {
      LPVOID lpBaseOfDll;
      DWORD  SizeOfImage;
      LPVOID EntryPoint;
    } MODULEINFO, *LPMODULEINFO;
    

    因此您可以通过lpBaseOfDll 字段知道注入的DLL 的起始地址,通过lpBaseOfDll + SizeOfImage 知道结束地址。


    这也适用于您当前进程中的 DLL,使用 GetCurrentProcess 和例如GetModuleHandle.

    【讨论】:

    • 但是会返回注入进程的起始地址还是dll?
    • 它会返回DLL的起始地址
    • 它适用于全局参数,我需要它适用于本地参数。
    • @GUYYankovitch 本地参数位于堆栈上,位于 DLL 的地址空间之外。这样做比较棘手 - 一种方法是在您的 DLLMain 中编写代码,该代码注册局部变量的地址 - 并推断堆栈信息。还有GetCurrentThreadStackLimits API,但 a) 它在早期版本的 Windows 中不可用,b) 它会返回单个线程的堆栈,这可能是也可能不是你想要的。
    • 确实,请注意,如果您的 DLL 有多个线程 - 它会有多个堆栈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2023-03-09
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多