枚举进程再来两弹
? 看了剛出幾個博友的博客,感覺人家的量大,詳細,干貨量實足啊,
所以我就把另外兩種常見的枚舉進程的方法簡單說下心得,
一個是EnumProcesses和CreateToolhelp32Snapshot系列的Tool help API的 Process32First和Process32Next函數完成列舉進程。
這兩種都是比較簡單實用的?https://github.com/Arsense/WindowsCode
蠻簡單的 ?需要編譯好的源碼的 支持vs2015,低版本的VS想編譯 簡單右鍵工程 屬性設置下低版本的編譯器就行,如下
?
0x01 基本思路
?有兩種方法? 第一種方法調用EnumProcesses遍歷進程,
并調用ListProcessModules1函數和
ListProcessThreads函數列舉模塊和線程
?
調用Process32First和Process32Next遍歷進程,
并調用ListProcessModules2函數列舉模塊,
調用ShowProcessMemoryInfo函數顯示內存使用情況
?
細微的區別是 EnumProcesses 可以一次性列舉所有進程(以PID的形式返回),但是沒有
Process32First 和 Process32Next獲取的信息豐富
?
?
0x02 代碼流程
??? 本實例是使用EnumProcesses函數獲取所有進程的PID,然后使用OpenProcess、函數
各進程的句柄,然后獲取相關信息
?
?
* 功能 調用EnumProcesses遍歷進程, * 并調用ListProcessModules1函數和 * ListProcessThreads函數列舉模塊和線程 * * 無參數,無返回值 **************************************/ VOID WINAPI EnumProcess1() {// 假設不超過1024個進程DWORD aProcesses[1024], cbNeeded, cProcesses;unsigned int i;// 調用EnumProcessesif ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )return;// 進程數cProcesses = cbNeeded / sizeof(DWORD);for ( i = 0; i < cProcesses; i++ ){// 顯示進程信息printf( "\n\n**************************************************" );printf("\nPROCESS : %u\n\n",aProcesses[i]);printf( "\n****************************************************" );// 列舉模塊信息和線程信息 ListProcessModules1( aProcesses[i] );ListProcessThreads( aProcesses[i] );} }?
而CreateToolhelp32Snapshot函數通過獲取進程信息為指定的進程、進程使用的堆[HEAP]、模塊[MODULE]、線程[THREAD]建立一個快照
0x03? 使用 PSAPI 庫枚舉進程 ?這兩個都是這個庫里面的
在 Windows NT 中,創建進程列表使用 PSAPI 函數,這些函數在 PSAPI.DLL 中。這個文件是隨 Platform SDK 一起分發的:
使用這個庫所需的 PSAPI.h 和 PSAPI.lib 文件也在該 Platform SDK 中。
為了使用 PSAPI 庫中的函數,需將 PSAPI.lib 添加到代碼項目中,同時在所有調用 PSAPI API 的模塊中包含 PSAPI.h 文件。記住一定要隨可執行文件一起分發 PSAPI.DLL,因為它不隨 Windows NT 一起分發。
主要的代碼實現如下
#include<stdio.h> #include<psapi.h> #pragma comment(lib,"psapi.lib")int main() {//進程結構 PROCESSENTRY32 Pe32; //用之前要知道大小Pe32.dwSize = sizeof(Pe32);//創建進程快照HANDLE ProcessSnapHandle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);HANDLE ModuleSnapHandle = NULL;if (ProcessSnapHandle == INVALID_HANDLE_VALUE){printf("[-]ProcessSnapHandle Error!\r\n");int Error = GetLastError();printf("Error is : %d\r\n", Error);return -1;}BOOL NextProcess = Process32First(ProcessSnapHandle,&Pe32);HANDLE ProcessHandle = 0;WCHAR ProcessPath[MAX_PATH] = { 0 };MODULEENTRY32 pModule; //模塊的結構 pModule.dwSize = sizeof(MODULEENTRY32);BOOL Return = FALSE;//準備好了 開始遍歷while (NextProcess){//先打開進程對象得到句柄ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pe32.th32ParentProcessID);//得到模塊的路徑 GetModuleFileNameEx(ProcessHandle, NULL, ProcessPath, _MAX_PATH);wprintf(_T("ProcessPath:%s\n ProcessName : %s\t\t ProcessID : %d\n\n"), ProcessPath, Pe32.szExeFile, Pe32.th32ProcessID);//創建模塊的快照ModuleSnapHandle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Pe32.th32ProcessID);Return = Module32First(ModuleSnapHandle, &pModule);while (Return){//枚舉輸出wprintf(_T("\t\tModual:%s\tBase:%2x\n"), pModule.szExePath, pModule.modBaseAddr);Return = ::Module32Next(ModuleSnapHandle, &pModule);}CloseHandle(ModuleSnapHandle);NextProcess = Process32Next(ProcessSnapHandle, &Pe32);}CloseHandle(ProcessSnapHandle);return 0; }
?
轉載于:https://www.cnblogs.com/arsense/p/6417966.html
總結
- 上一篇: UVA 10603 - Fill(dij
- 下一篇: iOS - UIRefreshContr