标签:空间 属性 mina oca 遍历 snapshot try char word
什么是进程?
通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 4 GB大小,一组提供数据和代码的模块,通产是 dll 和 exe 文件,一个进程内核对象和最少一个线程。
进程类似于一个容器,提供给线程一块空间和需要执行的操作,线程用于进行执行。
什么是模块?
提供代码和数据的可执行文件,主要有 exe 和 dll。可以通过 VS 的调试->窗口->模块进行查看
创建进程
// 结构体用于设置进程的初始化信息 STARTUPINFO StartupInfo = { sizeof(STARTUPINFO) }; ? // 用于保存被创建的进程的 id 和句柄 PROCESS_INFORMATION ProcessInfomation = { 0 }; ? // 创建第一个进程,使用 CreateProcess BOOL IsOk = CreateProcess( L"C:\\Windows\\System32\\calc.exe", // 用于创建进程的 exe 路径 NULL, // 命令行参数 NULL, // 进程的安全属性, NULL 表示使用默认值 NULL, // 线程的安全属性 FALSE, // 子进程是否拥有父进程的句柄 NULL, // 进程创建标志,(挂起\调试\在新窗口打开) NULL, // 环境变量 NULL, // 程序的工作目录) &StartupInfo, // 输入的进程设置 &ProcessInfomation); // 输出的进程信息 ? // 为了防止泄露关闭进程和线程句柄 CloseHandle(ProcessInfomation.hThread); CloseHandle(ProcessInfomation.hProcess); ? // * 创建进程的时候,创建出的进程和线程的句柄会被返回,所以[当前进程]中 // 线程句柄和进程句柄都被打开了一次。[被创建]的进程中拥有自己的进程内 // 核对象和线程内核对象。* ? // 还有 n 多的创建进程的方式,比如 system,ShellExecute, Winexec system("start calc.exe");
操作进程
// 0. 通过窗口句柄动态的查找 pid DWORD Pid = 0; HWND hWnd = FindWindow(NULL, L"无标题 - 记事本"); GetWindowThreadProcessId(hWnd, &Pid); ? // 1. 获取进程内核对象的句柄 HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid); ? // 2. 结束其它进程,需要一定的权限 TerminateProcess(ProcessHandle, 0); ? // 3. 手动的关闭内核对象 CloseHandle(ProcessHandle); ? // 4. 直接关闭自己的进程 ExitProcess(-1);
遍历进程
// 1. 包含创建快照需要用到的头文件 TlHelp32.h #include <TlHelp32.h> ? // 2. 开始拍摄快照,第一个参数指定快照的类型 HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); ? // 3. 判断快照是否拍摄成功 if (Snapshot == INVALID_HANDLE_VALUE) { MessageBox(NULL, L"进程快照创建失败", L"警告", MB_OK | MB_ICONERROR); ExitProcess(-1); } ? // 4. 创建结构体用于保存遍历的进程信息 PROCESSENTRY32 ProcessInfo = { sizeof(PROCESSENTRY32) }; ? // 5. 尝试从快照中获取第一个进程 if (Process32First(Snapshot, &ProcessInfo)) { do { // 6. 输出进程的信息 printf("ProcessName: %ls", ProcessInfo.szExeFile); ? // DWORD th32ProcessID; // 进程的 id // DWORD cntThreads; // 线程的数量 // DWORD th32ParentProcessID; // 父进程 id // DWORD dwFlags; // 线程的标志 // CHAR szExeFile[MAX_PATH]; // 进程的名字 ? // 6.1 以查询的权限打开进程句柄 HANDLE Handle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ProcessInfo.th32ProcessID); ? // 6.2 获取进程文件所在的路径 DWORD PathSize = MAX_PATH; WCHAR Path[MAX_PATH] = { 0 }; QueryFullProcessImageName(Handle, 0, Path, &PathSize); ? // 6.3 输出文件的路径 printf("\t%ls\n", Path); ? // 6.4 关闭句柄 CloseHandle(Handle); ? // 7. 继续遍历下一个进程信息 } while (Process32Next(Snapshot, &ProcessInfo)); }
遍历模块
// 1. 包含创建快照需要用到的头文件 TlHelp32.h #include <TlHelp32.h> ? int main() { // 2. 开始拍摄快照,第一个参数指定快照的类型,参数 2 表示某一个进程的模块 HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 1360); ? // 3. 判断快照是否拍摄成功 if (Snapshot == INVALID_HANDLE_VALUE) { MessageBox(NULL, L"模块快照创建失败", L"警告", MB_OK | MB_ICONERROR); ExitProcess(-1); } ? // 4. 创建结构体用于保存遍历的进程信息 MODULEENTRY32 ModuleInfo = { sizeof(MODULEENTRY32) }; ? // 5. 尝试从快照中获取第一个模块 if (Module32First(Snapshot, &ModuleInfo)) { do { // 6. 输出模块的信息 ? // DWORD th32ProcessID; // 父进程 id // HMODULE hModule; // 模块句柄,模块在虚拟空间的起始位置 // char szModule[]; // 模块的名称 // char szExePath[MAX_PATH]; // 模块的路径 ? printf("%ls: %ls\n", ModuleInfo.szModule, ModuleInfo.szExePath); ? // 7. 继续遍历下一个模块信息 } while (Module32Next(Snapshot, &ModuleInfo)); } ? return 0; }
标签:空间 属性 mina oca 遍历 snapshot try char word
原文地址:https://www.cnblogs.com/ltyandy/p/10932344.html