摘要
上一篇文章详细介绍了如何 遍历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