|
本帖最后由 Delina 于 2021-8-12 09:48 编辑
原文链接:干货|Windows下进程操作的一些C++代码
0x01 进程遍历因为进程是在随时进行变动的所以我们需要获取一张快照
1.1 CreateToolhelp32Snapshot- HANDLE CreateToolhelp32Snapshot(
- DWORD dwFlags,
- DWORD th32ProcessID
- );
复制代码 因为要获取进程第一个参数选择TH32CS_SNAPPROCESS来获取系统中所有的进程,具体可以参考[CreateToolhelp32Snapshot]:https://docs.microsoft.com/zh-cn ... 26l%3DZH-CN%26k%3Dk(TLHELP32%252FCreateToolhelp32Snapshot);k(CreateToolhelp32Snapshot);k(DevLang-C%252B%252B);k(TargetOS-Windows)%26rd%3Dtrue
1.2 Process32First- BOOL Process32First(
- HANDLE hSnapshot,
- LPPROCESSENTRY32 lppe
- );
复制代码 第一个参数使用上面CreateToolhelp32Snapshot函数返回的句柄。第二个参数执行了PROCESSENTRY32结构的指针,它包含了进程信息。检索进程里的第一个进程信息。
1.2.1 PROCESSENTRY32- typedef struct tagPROCESSENTRY32 {
- DWORD dwSize;
- DWORD cntUsage;
- DWORD th32ProcessID;
- ULONG_PTR th32DefaultHeapID;
- DWORD th32ModuleID;
- DWORD cntThreads;
- DWORD th32ParentProcessID;
- LONG pcPriClassBase;
- DWORD dwFlags;
- CHAR szExeFile[MAX_PATH];
- } PROCESSENTRY32;
复制代码
使用时候要把结构体清零。szExeFile为进程名称,其他都根据名称一样。
1.3 Process32Next
- BOOL Process32Next(
- HANDLE hSnapshot,
- LPPROCESSENTRY32 lppe
- );
复制代码 检索快照中的下一个进程信息。
- void ListProcess() {
- HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- PROCESSENTRY32 pe32 = { 0 };
- pe32.dwSize = sizeof(PROCESSENTRY32);
- BOOL bRet = Process32First(hSnap, &pe32);
- while (bRet)
- {
- bRet = Process32Next(hSnap, &pe32);
- printf(pe32.szExeFile);
- pid = pe32.th32ProcessID;
- wprintf(L"\r\n");
- printf("pid:%d", pe32.th32ProcessID);
- printf("\r\n-----------------------------------------");
- wprintf(L"\r\n");
- }
- ::CloseHandle(hSnap);
- }
复制代码
0x02 模块遍历同理只需要将CreateToolhelp32Snapshot的dwFlags修改为TH32CS_SNAPMODULE,th32ProcessID参数为进程的pid,这里要先获取进程pid。
2.1 ?? |
|