admin管理员组文章数量:1631605
遍历进程
该代码使用Windows API函数来列出当前运行的所有进程及其对应的进程ID(PID)。主要使用了CreateToolhelp32Snapshot
函数进行进程快照,然后通过Process32First
和Process32Next
函数遍历进程信息。
解释一下代码的主要步骤:
-
CreateToolhelp32Snapshot
函数:此函数创建一个快照,用于获取系统中的进程信息。第一个参数TH32CS_SNAPPROCESS
表示获取进程信息的快照,第二个参数0表示获取当前系统的进程信息。 -
Process32First
函数:此函数用于获取第一个进程的信息,将其存储在currentProcess
结构体中,并返回TRUE
。如果返回FALSE
,则表示获取第一个进程信息失败。 -
遍历进程:使用
while
循环和Process32Next
函数遍历快照中的进程信息,每次将下一个进程的信息存储在currentProcess
结构体中。 -
输出进程信息:通过
currentProcess.th32ProcessID
和currentProcess.szExeFile
分别获取进程的PID和进程名,并将其输出。 -
清理资源:关闭进程快照句柄,释放资源。
-
打印进程数量:统计运行的进程数量并输出。
总体上,该代码用于列出当前运行的所有进程及其对应的PID。注意,该代码只能在Windows系统上运行,并需要以管理员权限运行,以获取完整的进程信息。
#include <windows.h>
#include <tlhelp32.h> //进程快照函数头文件
#include <stdio.h>
int main()
{
int countProcess=0; //当前进程数量计数变量
PROCESSENTRY32 currentProcess; //存放快照进程信息的一个结构体
currentProcess.dwSize = sizeof(currentProcess); //在使用这个结构之前,先设置它的大小
HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//给系统内的所有进程拍一个快照
if (hProcess == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot()调用失败!\n");
return -1;
}
bool bMore=Process32First(hProcess,¤tProcess); //获取第一个进程信息
while(bMore)
{
printf("PID=%5u PName= %s\n",currentProcess.th32ProcessID,currentProcess.szExeFile); //遍历进程快照,轮流显示每个进程信息
bMore=Process32Next(hProcess,¤tProcess); //遍历下一个
countProcess++;
}
CloseHandle(hProcess); //清除hProcess句柄
printf("共有以上%d个进程在运行\n",countProcess);
system("pause");
return 0;
}
遍历线程
这段代码是使用C++和Windows API函数来列出当前运行的所有进程及其对应的进程ID(PID)。代码使用了CreateToolhelp32Snapshot
函数进行进程快照,然后通过Process32First
和Process32Next
函数遍历进程信息。
解释一下代码的主要步骤:
-
traverseProcess
函数:此函数用于获取系统中的进程信息,并将进程ID存储在_nameID
map中。该函数返回BOOL
类型表示操作是否成功。 -
CreateToolhelp32Snapshot
函数:此函数创建一个快照,用于获取系统中的进程信息。第一个参数TH32CS_SNAPPROCESS
表示获取进程信息的快照,第二个参数0表示获取当前系统的进程信息。 -
Process32First
函数:此函数用于获取第一个进程的信息,并将其存储在pe32
结构体中。如果返回FALSE
,则表示获取第一个进程信息失败。 -
遍历进程:使用
do-while
循环和Process32Next
函数遍历快照中的进程信息,每次将下一个进程的信息存储在pe32
结构体中,并输出进程ID。 -
清理资源:关闭进程快照句柄,释放资源。
-
打印进程ID:输出进程的PID。
总体上,该代码用于列出当前运行的所有进程及其对应的PID。注意,该代码只能在Windows系统上运行,并需要以管理员权限运行,以获取完整的进程信息。
#include <windows.h>
#include <TlHelp32.h>
#include <iostream>
#include <map>
#include <string>
using namespace std;
BOOL traverseProcess(std::map<std::string, int>&_nameID){
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hProcessSnap;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE){
cout << "CreateToolhelp32Snapshot Error!" << endl;
return false;
}
if (!Process32First(hProcessSnap, &pe32)){
cout << "Process32First Error!" << endl;
CloseHandle(hProcessSnap);
return false;
}
int num = 0;
do{
int id = pe32.th32ProcessID;
cout << "[" << ++num << "]:" << "------------"
<< "Process ID = " << id << endl;
} while (Process32Next(hProcessSnap, &pe32));
CloseHandle(hProcessSnap);
return true;
}
int main(){
map<string, int> _nameID;
if (!traverseProcess(_nameID)){
cout << "Start Process Error!" << endl;
}
system("pause");
}
遍历进程模块
这段代码使用Windows API函数来获取指定进程的模块信息并输出到控制台。
解释一下代码的主要步骤:
-
GetModuleList
函数:此函数用于获取指定进程的模块信息,并输出模块的基址、大小和名称。 -
CreateToolhelp32Snapshot
函数:此函数创建一个模块相关的快照句柄,用于获取指定进程的模块信息。第一个参数TH32CS_SNAPMODULE
表示获取模块信息的快照,第二个参数dwPId
表示要获取信息的进程ID。 -
Module32First
函数:此函数用于获取第一个模块的信息,并将其存储在me32
结构体中。如果返回FALSE
,则表示获取第一个模块信息失败。 -
循环获取模块信息:使用
do-while
循环和Module32Next
函数遍历模块快照中的模块信息,每次将下一个模块的信息存储在me32
结构体中,并输出模块的基址、大小和名称。 -
关闭句柄并退出函数:关闭模块快照句柄,释放资源。
-
main
函数:在main
函数中,用户输入一个进程ID(dwId
),然后调用GetModuleList
函数来获取并输出该进程的模块信息。
注意,该代码只能在Windows系统上运行,并需要以管理员权限运行,以获取完整的模块信息。在使用printf
和scanf_s
函数时,需要注意保证输入输出的数据类型匹配。在本代码中,输入进程ID时使用%ud
格式化字符串,表示输入一个无符号十进制数。
#include <windows.h>
#include <TlHelp32.h>
#include <locale.h>
#include <stdio.h>
bool GetModuleList(DWORD dwPId) {
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32 = { sizeof(MODULEENTRY32) };
// 1. 创建一个模块相关的快照句柄
hModuleSnap = CreateToolhelp32Snapshot(
TH32CS_SNAPMODULE, // 指定快照的类型
dwPId); // 指定进程
if (hModuleSnap == INVALID_HANDLE_VALUE)
return false;
// 2. 通过模块快照句柄获取第一个模块信息
if (!Module32First(hModuleSnap, &me32)) {
CloseHandle(hModuleSnap);
return false;
}
// 3. 循环获取模块信息
do {
wprintf(L"模块基址:%d,模块大小:%d,模块名称:%s\n",me32.modBaseAddr, me32.modBaseSize, me32.szModule);
} while (Module32Next(hModuleSnap, &me32));
// 4. 关闭句柄并退出函数
CloseHandle(hModuleSnap);
}
int main()
{
setlocale(LC_ALL, "chs");
DWORD dwId = 0;
printf("请输入一个ID:");
scanf_s("%ud", &dwId);
GetModuleList(dwId);
getchar();
}
遍历进程模块
这段代码用于获取当前系统中正在运行的进程以及每个进程加载的模块信息,并输出到控制台。
-
SetProcessPrivilege
函数:此函数用于设置进程特权,它允许程序使用调试特权来打开其他进程。函数通过调用OpenProcessToken
来打开当前进程的访问令牌,并调用AdjustTokenPrivileges
来修改特权状态。 -
main
函数:在main
函数中,首先调用SetProcessPrivilege
函数,获取调试特权,以便能够打开其他进程。然后使用CreateToolhelp32Snapshot
和Process32First
函数获取系统中正在运行的进程的快照,再通过循环使用Process32Next
函数遍历每个进程的信息。对于每个进程,打开进程句柄,获取其模块信息并输出到控制台。最后,关闭进程句柄和快照句柄,并释放特权。
需要注意的是,该代码需要以管理员权限运行,因为获取进程和模块信息需要特权。另外,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;
}
}
遍历模块
这段代码用于获取指定进程ID(dwPId
)的模块列表,并输出模块的基址、大小和模块路径到控制台。
-
GetModuleList
函数:此函数用于获取指定进程的模块列表。首先,它通过调用CreateToolhelp32Snapshot
函数创建一个模块相关的快照句柄,然后使用Module32First
函数获取第一个模块信息。接着,通过循环使用Module32Next
函数遍历每个模块信息,并将模块的基址、大小和路径输出到控制台。最后,关闭快照句柄并退出函数。 -
main
函数:在main
函数中,指定一个进程ID(dwId
)并调用GetModuleList
函数来获取该进程的模块列表。
需要注意的是,要获取指定进程的模块列表,当前进程需要有足够的权限。否则可能无法打开其他进程的快照。在实际运行时,确保以管理员权限运行或具备足够的权限以避免访问限制。另外,进程ID 1988
是一个示例值,你可以根据实际需要替换为其他进程ID。
#include <stdio.h>
void GetModuleList(DWORD dwPId) {
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32 = { sizeof(MODULEENTRY32) };
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPId);
if (!Module32First(hModuleSnap, &me32)) {
CloseHandle(hModuleSnap);
}
do {
printf("ModeBase: %d \t ModeSize: %d \t %s\n", me32.modBaseAddr, me32.modBaseSize, me32.szExePath);
} while (Module32Next(hModuleSnap, &me32));
}
int main()
{
DWORD dwId = 1988;
GetModuleList(dwId);
getchar();
}
版权声明:本文标题:CC++ 进程线程模块遍历 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1729089000a1185930.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论