直奔主题
摘要
上一篇文章详细介绍了如何 遍历Windows进程。这篇文章主要是对获取的系统进程作进一步处理,依次遍历每一个进程中使用的模块!主要是用到了Module32First
以及Module32Next
两个函数,思路就是在之前的进程
外层循环中新增一个模块
内层循环
具体思路
(1).使用CreateToolhelp32Snapshot
以及传参TH32CS_SNAPPROCESS
创建系统进程快照
(2).使用Process32First
获取第一个进程的信息存入到PROCESSENTRY32
结构体中
(3).再用CreateToolhelp32Snapshot
以及传参TH32CS_SNAPMODULE
创建系统进程的模块快照
(4).使用Module32First
获取第一个模块信息存到MODULEENTRY32
结构体中
(5).然后使用Module32Next
循环当前进程的所有模块
(6).再用Process32Next
遍历所有进程
(7).最后用CloseHandle
关闭所有句柄
完整代码
#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
并不是必要的,只是为了加深进程提权的理解
运行截图
由于内容太多控制台显示不全,设置缓冲区的高度
即可完全显示