獲取進程列表和模塊信息

這一節,我們將學會如何獲取本地進程信息與模塊信息

注:轉載請註明來源 enjoy5512的博客 http://blog.csdn.net/enjoy5512


測試環境 :


windows xp sp3 + vc6.0


實現思路:


1) 通過自己編寫的EnableDebugPriv()函數獲取調試權限
2) 通過CreateToolhelp32Snapshot()函數獲取進程快照
3) 通過Process32First()函數獲取第一個進程信息
  3.1) 通過CreateToolhelp32Snapshot()獲取進程模塊信息
  3.2) 通過Module32First()獲取第一個模塊信息
  3.3) 通過Module32Next()循環獲取其他模塊信息
4) 通過Process32Next()循環遍歷其他進程信息


代碼:


/////////////////////////////////////////////////////////////////////////////
//  文件名 : test.c
//  工程 : test
//  作者 : enjoy5512   修改者 : enjoy5512   最後優化註釋者 : enjoy5512
//  個人技術博客 : blog.csdn.net/enjoy5512
//  個人GitHub   : github.com/whu-enjoy
//  csdn code    : code.csdn.net/enjoy5512
//  描述 : 獲取本地系統進程列表
//  編譯環境 : Windows XP SP3 + vc6.0
//  主要函數 :
//  版本 : 最終確定版  完成日期 : 2016年6月2日 20:00:02
//  修改 :
/////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <windows.h>
#include"tlhelp32.h"


    //函數說明開始
    //==================================================================================
    //  功能 : 獲取進程的調試權限
    //  參數 : const char *name
    //  (入口)  name : 指向權限名稱,我們這裏用到SE_DEBUG_NAME
    //    #define          SE_BACKUP_NAME           TEXT("SeBackupPrivilege")
    //    #define          SE_RESTORE_NAME          TEXT("SeRestorePrivilege")
    //    #define          SE_SHUTDOWN_NAME         TEXT("SeShutdownPrivilege")
    //    #define          SE_DEBUG_NAME            TEXT("SeDebugPrivilege")
    //  返回 : -1表示獲取權限失敗, 0表示獲取權限成功
    //  主要思路 : 先打開進程令牌環,然後獲得本地進程name所代表的權限類型的局部唯一ID
    //             最後調整進程權限
    //  調用舉例 : EnableDebugPriv(SE_DEBUG_NAME)
    //  日期 : 2016年6月1日 19:08:22(註釋日期)
    //==================================================================================
    //函數說明結束
int EnableDebugPriv(const char *name)
{
    HANDLE hToken;        //進程令牌句柄
    TOKEN_PRIVILEGES tp;  //TOKEN_PRIVILEGES結構體,其中包含一個【類型+操作】的權限數組
    LUID luid;           //上述結構體中的類型值

    //打開進程令牌環
    //GetCurrentProcess()獲取當前進程的僞句柄,只會指向當前進程或者線程句柄,隨時變化
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))
    {
       fprintf(stderr,"OpenProcessToken error\n");
       return -1;
    }

    //獲得本地進程name所代表的權限類型的局部唯一ID
    if (!LookupPrivilegeValue(NULL, name, &luid))
    {
       fprintf(stderr,"LookupPrivilegeValue error\n");
    }

    tp.PrivilegeCount = 1;                               //權限數組中只有一個“元素”
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  //權限操作
    tp.Privileges[0].Luid = luid;                        //權限類型

    //調整進程權限
    if (!AdjustTokenPrivileges(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
    {
       fprintf(stderr,"AdjustTokenPrivileges error!\n");
       return -1;
    }

    return 0;

}

int main()
{
    HANDLE hProcess;                        //進程句柄
    HANDLE hModule;                         //模塊句柄
    BOOL bProcess = FALSE;                  //獲取進程信息的函數返回值
    BOOL bModule = FALSE;                   //獲取模塊信息的函數返回值
    PROCESSENTRY32 pe32;                    //保存進程信息
    MODULEENTRY32  me32;                    //保存模塊信息

    int i = 0;
    int j = 0;

    //獲取進程調試權限,如果失敗,則提示獲取權限失敗,失敗的話,有的進程信息就會獲取不到
    if (EnableDebugPriv(SE_DEBUG_NAME))     
    {
        fprintf(stderr,"Add Privilege error\n");
    }

    hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//獲取進程快照
    if (hProcess == INVALID_HANDLE_VALUE)
    {
        printf("獲取進程快照失敗\n");
        exit(1);
    }

    bProcess = Process32First(hProcess, &pe32);              //獲取第一個進程信息
    while (bProcess)                                         //循環獲取其餘進程信息
    {
        printf("%d :\t Father's PID(%d)\tPID(%d)\t%s\n", i, pe32.th32ParentProcessID, pe32.th32ProcessID, pe32.szExeFile);
        i++;
        j = 0;
        if (0 != pe32.th32ParentProcessID)                   //獲取進程PID不爲0的模塊信息
        {
            hModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID);  //獲取模塊快照
            if (hModule != INVALID_HANDLE_VALUE)
            {
                bModule = Module32First(hModule,&me32);      //獲取第一個模塊信息,即進程相應可執行文件的信息
                while(bModule)
                {
                    printf("模塊:\n%d\t%s\n", j, me32.szExePath);
                    j++;
                    bModule = Module32Next(hModule, &me32);  //獲取其他模塊信息
                }
                CloseHandle(hModule);
            }
        }

        bProcess = Process32Next(hProcess,&pe32);           //繼續獲取其他進程信息
        printf("\n\n");
        getchar();
    }

    CloseHandle(hProcess);
    return 0;
}

軟件運行結果 :


這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章