获取基础基地址的思路
在虚拟内存的管理中还是存在很多可用的技巧,前段时间遇到了一种情况,怎么快速获取本身dll的基地址(前提是内存加载并且DllMain不会被调用),还是同事给了份代码,才发现还有这种玩法。
??如果进行过windows下的调试会发现,我们的dll是一个完整的内存块,也就是说我们dll的基地址实际上是在这块虚拟内存的首地址,那么也就是说我们通过VirtualQuery函数查找当前代码所在虚拟内存块的起始地址,进而获得当前模块的基地址。
HRESULT VirtualQuery (
[in]void*lpAddress,
[out] void*lpBuffer,
[in]SIZE_TdwLength,
[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);
}
推荐阅读
- 软件逆向-求解flag内存获取逆变换操作线性变换约束求解
- 【docker专栏3】docker基础概念-容器、镜像以及引擎组成部分
- Linux|Linux Shell脚本
- 微信小程序获取用户手机号码的详细步骤
- c语言|每天一练——牛客网基础语法(10)
- c语言|这可能是最全最详细的C语言指针基础教程
- 计算机协议基础|交换机&路由器工作原理
- thingsboard|ThingsBoard 使用 REST API HTTP 方法获取遥测数据 属性数据等
- 0基础C语言保姆教学|C语言自学保姆教程——第一节--编译准备与第一个C程序
- Python迭代器