|
在C++中获取模块基地址主要有以下几种方法:
1.使用Toolhelp32快照API
这是最常用的方法,通过CreateToolhelp32Snapshot创建进程模块快照,然后遍历模块列表18。示例代码如下:
- #include <windows.h>
- #include <tlhelp32.h>
- #include <iostream>
- DWORD GetModuleBase(DWORD pid, const char* moduleName) {
- HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
- if (hSnapshot == INVALID_HANDLE_VALUE) return 0;
-
- MODULEENTRY32 me;
- me.dwSize = sizeof(MODULEENTRY32);
-
- if (!Module32First(hSnapshot, &me)) {
- CloseHandle(hSnapshot);
- return 0;
- }
-
- do {
- if (_stricmp(me.szModule, moduleName) == 0) {
- CloseHandle(hSnapshot);
- return (DWORD)me.modBaseAddr;
- }
- } while (Module32Next(hSnapshot, &me));
-
- CloseHandle(hSnapshot);
- return 0;
- }
复制代码
2.使用EnumProcessModules API
这种方法适用于获取当前进程或指定进程的模块信息。需要先获取进程句柄,然后调用EnumProcessModules枚举模块。
3.通过PEB结构遍历
在更底层的情况下,可以通过进程环境块(PEB)来遍历模块链表获取基地址。这种方法常用于驱动开发或特殊场景。
4.特征码搜索方法
当不知道模块名时,可以通过特征码搜索来定位基地址。这种方法常用于游戏修改或逆向工程。
注意事项:
- 32位和64位程序需要区分处理,API可能不同
- 跨进程操作需要适当权限
- 模块基址在每次程序启动时可能变化
- 对于系统模块,可以使用GetModuleHandle直接获取
|
|