獲取程序列表和模組資訊
阿新 • • 發佈:2019-01-30
這一節,我們將學會如何獲取本地程序資訊與模組資訊
測試環境 :
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;
}