1. 程式人生 > >獲取程序列表和模組資訊

獲取程序列表和模組資訊

這一節,我們將學會如何獲取本地程序資訊與模組資訊

測試環境 :

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; }

軟體執行結果 :

這裡寫圖片描述