[Windows编程]模块遍历

模块遍历

整体思路

1.创建进程快照
2.遍历首次模块
3.继续下次遍历
4.模块信息结构体

相关API的调用

  • 创建进程快照API
HANDLE WINAPI CreateToolhelp32Snapshot(      进程快照API
  DWORD dwFlags,                       遍历的标志,表示你要遍历什么(进程,模块,堆...)
  DWORD th32ProcessID                   遍历的进程ID,如果为0,则是当前进程,如果不为0,则是创建指定进程的快照进行遍历
);

成功返回快照地址,失败返回(INVALID_HANDLE_VALUE)-1

  • 遍历第一个模块
点开查看 LPMODULEENTRY32 结构体

typedef struct tagMODULEENTRY32 {
DWORD dwSize;                 大小,第一次使用必须初始化
DWORD th32ModuleID;              进程模块标识符
DWORD th32ProcessID;             进程ID
DWORD GlblcntUsage;              全局模块使用次数
DWORD ProccntUsage;              模块的引用计数
BYTE * modBaseAddr;              模块的基址
DWORD modBaseSize;              模块的大小
HMODULE hModule;                 模块的句柄
TCHAR szModule[MAX_MODULE_NAME32 + 1]; 模块名称的字符串
TCHAR szExePath[MAX_PATH];          模块路径字符串
} MODULEENTRY32;
typedef MODULEENTRY32 *PMODULEENTRY32;

BOOL WINAPI Module32First(
  HANDLE hSnapshot,           快照句柄
  LPMODULEENTRY32 lpme         模块信息结构体
);
  • 获取下一个模块
BOOL WINAPI Process32Next(
  HANDLE hSnapshot,        进程句柄
  LPPROCESSENTRY32 lppe     进程信息结构体
);

实现

#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
int main(int argc, char* argv[])
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
    if (INVALID_HANDLE_VALUE == hSnapshot)
    {
        return 0;
    }
    MODULEENTRY32 mi; 
    mi.dwSize = sizeof(MODULEENTRY32); //第一次使用必须初始化成员
    BOOL bRet = Module32First(hSnapshot,&mi);
    while (bRet)
    {
		printf("%s",mi->szExePath); //模块名
        bRet = Module32Next(hSnapshot,&mi);
    }
    return 0;
}
posted @ 2021-10-14 11:27  Aur0ra*  阅读(78)  评论(0编辑  收藏  举报