[Windows编程]模块遍历
阅读原文时间:2023年07月10日阅读:1

模块遍历

1.创建进程快照
2.遍历首次模块
3.继续下次遍历
4.模块信息结构体
  • 创建进程快照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
    #include
    #include
    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;
    }