摘要
上一篇文章詳細介紹瞭如何 遍歷Windows進程。這篇文章主要是對獲取的系統進程做進一步處理,依次遍歷每個進程中使用的模塊!主要是用到了Module32First
以及Module32Next
兩個函數,思路就是在以前的進程
外層循環中新增一個模塊
內層循環segmentfault
具體思路
(1).使用CreateToolhelp32Snapshot
以及傳參TH32CS_SNAPPROCESS
建立系統進程快照
(2).使用Process32First
獲取第一個進程的信息存入到PROCESSENTRY32
結構體中
(3).再用CreateToolhelp32Snapshot
以及傳參TH32CS_SNAPMODULE
建立系統進程的模塊快照
(4).使用Module32First
獲取第一個模塊信息存到MODULEENTRY32
結構體中
(5).而後使用Module32Next
循環當前進程的全部模塊
(6).再用Process32Next
遍歷全部進程
(7).最後用CloseHandle
關閉全部句柄windows
完整代碼函數
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <Tlhelp32.h> BOOL SetProcessPrivilege(char *lpName, BOOL opt); int main(int argc, char *argv[]) { PROCESSENTRY32 pe32; MODULEENTRY32 me32; HANDLE hProcess, hSnapshot_proc, hSnapshot_mod; pe32.dwSize = sizeof(pe32); SetProcessPrivilege("SeDebugPrivilege", 1); hSnapshot_proc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (Process32First(hSnapshot_proc, &pe32)) { do { hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID); if (pe32.th32ProcessID && pe32.th32ProcessID != 4 && pe32.th32ProcessID != 8) { printf("PID: %d >>> ProcName: %s\n", pe32.th32ProcessID, pe32.szExeFile); me32.dwSize = sizeof(me32); hSnapshot_mod = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID); Module32First(hSnapshot_mod, &me32); do { printf("ModName: %s -> Path: %s\n", me32.szModule, me32.szExePath); } while (Module32Next(hSnapshot_mod, &me32)); printf("------\n\n"); CloseHandle(hSnapshot_mod); } CloseHandle(hProcess); } while (Process32Next(hSnapshot_proc, &pe32)); } SetProcessPrivilege("SeDebugPrivilege", 0); CloseHandle(hSnapshot_proc); system("pause"); return 0; } BOOL SetProcessPrivilege(char *lpName, BOOL opt) { HANDLE tokenhandle; TOKEN_PRIVILEGES NewState; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenhandle)) { LookupPrivilegeValue(NULL, lpName, &NewState.Privileges[0].Luid); NewState.PrivilegeCount = 1; NewState.Privileges[0].Attributes = opt != 0 ? 2 : 0; AdjustTokenPrivileges(tokenhandle, FALSE, &NewState, sizeof(NewState), NULL, NULL); CloseHandle(tokenhandle); return 1; } else { return 0; } }
編譯命令gcc mod1.c -o mod1
,注意程序的OpenProcess
並非必要的,只是爲了加深進程提權的理解ui
運行截圖
因爲內容太多控制檯顯示不全,設置緩衝區的高度
便可徹底顯示spa