這一節,我們將學會如何獲取本地進程信息與模塊信息
注:轉載請註明來源 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;
}