美文网首页windows
获取基础基地址的思路

获取基础基地址的思路

作者: fcc_load | 来源:发表于2017-09-05 10:22 被阅读0次

    在虚拟内存的管理中还是存在很多可用的技巧,前段时间遇到了一种情况,怎么快速获取本身dll的基地址(前提是内存加载并且DllMain不会被调用),还是同事给了份代码,才发现还有这种玩法。
      如果进行过windows下的调试会发现,我们的dll是一个完整的内存块,也就是说我们dll的基地址实际上是在这块虚拟内存的首地址,那么也就是说我们通过VirtualQuery函数查找当前代码所在虚拟内存块的起始地址,进而获得当前模块的基地址。

    HRESULT VirtualQuery (
        [in]  void*    lpAddress,
        [out] void*    lpBuffer,
        [in]  SIZE_T   dwLength,
        [out] SIZE_T*  pResult
    );
    

    lpAddress
      [in]指向要查询的虚拟内存中的地址的指针。
    lpBuffer
      [out]指向包含有关指定的内存区域的信息的结构的指针。
    dwLength
      [in]以字节为单位的缓冲区的大小, lpBuffer 指向。
    pResult
      [out]指向返回的信息缓冲区的字节数的指针。

    参数lpBuffer实际上是一个结构

    typedef struct _MEMORY_BASIC_INFORMATION {
        PVOID BaseAddress;
        PVOID AllocationBase;    \\基地址
        DWORD AllocationProtect;
        SIZE_T RegionSize;
        DWORD State;
        DWORD Protect;
        DWORD Type;
    } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
    

    代码

    //获取模块基地址
    HMODULE GetSelfModuleHandle()
    {
        MEMORY_BASIC_INFORMATION mbi;
        return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0) ? (HMODULE)mbi.AllocationBase : NULL);
    }
    

    相关文章

      网友评论

        本文标题:获取基础基地址的思路

        本文链接:https://www.haomeiwen.com/subject/uicujxtx.html