Windows編程之模塊遍歷(C++實現)


            Windows編程之模塊遍歷

 

PS: 主要扣代碼使用,直接滑動到最下面使用.

 

遍歷模塊需要幾個API,和一個結構體

  1.創建進程快照

  2.遍歷首次模塊

  3.繼續下次遍歷

  4.模塊信息結構體

API 分別是:

1.創建進程快照

HANDLE WINAPI CreateToolhelp32Snapshot(      進程快照API
  DWORD dwFlags,                       遍歷的標志,表示你要遍歷什么(進程,模塊,堆...)
  DWORD th32ProcessID                   遍歷的進程ID,如果為0,則是當前進程,如果不為0,則是創建指定進程的快照進行遍歷
);

注意,創建進程快照需要包含頭文件  Tlhelp32.h

返回值:

  成功返回快照句柄

  失敗返回 INVALID_HANDLE_VALUE

2.遍歷首次模塊.

BOOL WINAPI Module32First(
  HANDLE hSnapshot,           快照句柄
  LPMODULEENTRY32 lpme         模塊信息結構體
);
 
模塊信息結構體


對我們有用的就是
dwSize         初始化結構體的大小
th32ProcessId 進程ID
szExeFile[MAX_PATH] 進程路徑

3.遍歷下一次進程
BOOL WINAPI Process32Next(
  HANDLE hSnapshot,        進程句柄
  LPPROCESSENTRY32 lppe     進程信息結構體
);
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; 

這個常用的也很多

模塊基址  模塊大小 模塊句柄 模塊名稱,以及模塊路徑等等.

兼容代碼,遍歷自己進程模塊(DLL)
#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)
    {
        /*
        循環遍歷添加自己的額外代碼
        */    
    
        bRet = Module32Next(hSnapshot,&mi);
    }
    return 0;
}

兼容代碼,遍歷指定進程模塊

思路:

  1.獲取你想要遍歷的進程ID (可以通過遍歷進程,也可以通過通過句柄獲得進程ID)

  2.創建進程快照,第一個參數傳入遍歷模塊,第二個參數傳入你想要遍歷進程的ID

#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
int main(int argc, char* argv[])
{
    HANDLE hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if (INVALID_HANDLE_VALUE == hProcessSnapshot)
    {
        return 0;
    }
    DWORD dwPid = 0;
    PROCESSENTRY32 pi;
    pi.dwSize = sizeof(PROCESSENTRY32);
    BOOL Ret = Process32First(hProcessSnapshot,&pi);
    while (Ret)
    {
        if (strcmp("QQ.exe",pi.szExeFile) == 0)
        {
            dwPid = pi.th32ProcessID;
            break;
        }
        Ret = Process32Next(hProcessSnapshot,&pi);
    }
    CloseHandle(hProcessSnapshot);


    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPid);//上面獲取了進程PID,下面使用即可.
    if (INVALID_HANDLE_VALUE == hSnapshot)
    {
        return 0;
    }
    MODULEENTRY32 mi; 
    mi.dwSize = sizeof(MODULEENTRY32); //第一次使用必須初始化成員
    BOOL  bRet = Module32First(hSnapshot,&mi);
    while (bRet)
    {
        /*
        循環遍歷添加自己的額外代碼
        */    
    
        bRet = Module32Next(hSnapshot,&mi);
    }
    CloseHandle(hSnapshot);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM