C/C++ 获取进程某模块入口地址
2023-02-18 16:46:19 时间
实现获取指定进程中特定模块的枚举以及得到该模块入口地址等信息。
实现代码:
HMODULE GetProcessModuleHandle(DWORD pid, CONST TCHAR* moduleName){ // 根据 PID 、模块名(需要写后缀,如:".dll"),获取模块入口地址。
MODULEENTRY32 moduleEntry;
HANDLE handle = NULL;
handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid); // 获取进程快照中包含在th32ProcessID中指定的进程的所有的模块。
if (!handle) {
CloseHandle(handle);
return NULL;
}
ZeroMemory(&moduleEntry, sizeof(MODULEENTRY32));
moduleEntry.dwSize = sizeof(MODULEENTRY32);
if (!Module32First(handle, &moduleEntry)) {
CloseHandle(handle);
return NULL;
}
do {
if (_tcscmp(moduleEntry.szModule, moduleName) == 0) {return moduleEntry.hModule;}
} while (Module32Next(handle, &moduleEntry));
CloseHandle(handle);
return 0;
}
int main(){
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); // 进程快照句柄
PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)}; // 存放进程快照的结构体
// 遍历进程
while (Process32Next(hProcessSnap,&process)){
// 找到 QQMusic.exe 进程
string s_szExeFile = process.szExeFile; // char* 转 string
if(s_szExeFile == "QQMusic.exe"){
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID); // 进程句柄
cout << "QQMusic.dll的模块基地址:" << GetProcessModuleHandle(process.th32ProcessID,"QQMusic.dll") << endl;
}
}
}
效果图:
相关文章
- C#11 file关键字
- Linux 命令(219)—— nstat 命令
- Linux 命令(220)—— ipcalc 命令
- Linux 命令(221)—— poweroff 命令
- Linux 命令(222)—— halt 命令
- Linux 命令(223)—— reboot 命令
- Linux 命令(224)—— ctrlaltdel 命令
- Linux 命令(225)—— printf 命令
- Linux 命令(226)—— exec 命令(builtin)
- Linux 命令(227)—— history 命令(builtin)
- 嵌入式:堆栈寻址、相对寻址与ARM指令总结
- C++中你不知道的namespace和using的用法
- Golang数据结构之Interface
- 我开源了一个Go学习仓库|笔记预览
- Go语言知识查漏补缺|基本数据类型
- Go 源码解读|如何用好 errors 库的 errors.Is() 与 errors.As() 方法
- 使用 Go HTTP 框架 Hertz 进行 JWT 认证
- 玩转 Go 生态|Hertz WebSocket 扩展简析
- trzsz ( trz / tsz ) 是兼容 tmux 的 rz / sz,js 和 go 版发布 1.0 正式版。
- Linux 网卡的路由和网关