枚举进程再来两弹
? 看了剛出幾個(gè)博友的博客,感覺(jué)人家的量大,詳細(xì),干貨量實(shí)足啊,
所以我就把另外兩種常見(jiàn)的枚舉進(jìn)程的方法簡(jiǎn)單說(shuō)下心得,
一個(gè)是EnumProcesses和CreateToolhelp32Snapshot系列的Tool help API的 Process32First和Process32Next函數(shù)完成列舉進(jìn)程。
這兩種都是比較簡(jiǎn)單實(shí)用的?https://github.com/Arsense/WindowsCode
蠻簡(jiǎn)單的 ?需要編譯好的源碼的 支持vs2015,低版本的VS想編譯 簡(jiǎn)單右鍵工程 屬性設(shè)置下低版本的編譯器就行,如下
?
0x01 基本思路
?有兩種方法? 第一種方法調(diào)用EnumProcesses遍歷進(jìn)程,
并調(diào)用ListProcessModules1函數(shù)和
ListProcessThreads函數(shù)列舉模塊和線程
?
調(diào)用Process32First和Process32Next遍歷進(jìn)程,
并調(diào)用ListProcessModules2函數(shù)列舉模塊,
調(diào)用ShowProcessMemoryInfo函數(shù)顯示內(nèi)存使用情況
?
細(xì)微的區(qū)別是 EnumProcesses 可以一次性列舉所有進(jìn)程(以PID的形式返回),但是沒(méi)有
Process32First 和 Process32Next獲取的信息豐富
?
?
0x02 代碼流程
??? 本實(shí)例是使用EnumProcesses函數(shù)獲取所有進(jìn)程的PID,然后使用OpenProcess、函數(shù)
各進(jìn)程的句柄,然后獲取相關(guān)信息
?
?
* 功能 調(diào)用EnumProcesses遍歷進(jìn)程, * 并調(diào)用ListProcessModules1函數(shù)和 * ListProcessThreads函數(shù)列舉模塊和線程 * * 無(wú)參數(shù),無(wú)返回值 **************************************/ VOID WINAPI EnumProcess1() {// 假設(shè)不超過(guò)1024個(gè)進(jìn)程DWORD aProcesses[1024], cbNeeded, cProcesses;unsigned int i;// 調(diào)用EnumProcessesif ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )return;// 進(jìn)程數(shù)cProcesses = cbNeeded / sizeof(DWORD);for ( i = 0; i < cProcesses; i++ ){// 顯示進(jìn)程信息printf( "\n\n**************************************************" );printf("\nPROCESS : %u\n\n",aProcesses[i]);printf( "\n****************************************************" );// 列舉模塊信息和線程信息 ListProcessModules1( aProcesses[i] );ListProcessThreads( aProcesses[i] );} }?
而CreateToolhelp32Snapshot函數(shù)通過(guò)獲取進(jìn)程信息為指定的進(jìn)程、進(jìn)程使用的堆[HEAP]、模塊[MODULE]、線程[THREAD]建立一個(gè)快照
0x03? 使用 PSAPI 庫(kù)枚舉進(jìn)程 ?這兩個(gè)都是這個(gè)庫(kù)里面的
在 Windows NT 中,創(chuàng)建進(jìn)程列表使用 PSAPI 函數(shù),這些函數(shù)在 PSAPI.DLL 中。這個(gè)文件是隨 Platform SDK 一起分發(fā)的:
使用這個(gè)庫(kù)所需的 PSAPI.h 和 PSAPI.lib 文件也在該 Platform SDK 中。
為了使用 PSAPI 庫(kù)中的函數(shù),需將 PSAPI.lib 添加到代碼項(xiàng)目中,同時(shí)在所有調(diào)用 PSAPI API 的模塊中包含 PSAPI.h 文件。記住一定要隨可執(zhí)行文件一起分發(fā) PSAPI.DLL,因?yàn)樗浑S Windows NT 一起分發(fā)。
主要的代碼實(shí)現(xiàn)如下
#include<stdio.h> #include<psapi.h> #pragma comment(lib,"psapi.lib")int main() {//進(jìn)程結(jié)構(gòu) PROCESSENTRY32 Pe32; //用之前要知道大小Pe32.dwSize = sizeof(Pe32);//創(chuàng)建進(jìn)程快照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; //模塊的結(jié)構(gòu) pModule.dwSize = sizeof(MODULEENTRY32);BOOL Return = FALSE;//準(zhǔn)備好了 開(kāi)始遍歷while (NextProcess){//先打開(kāi)進(jìn)程對(duì)象得到句柄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);//創(chuàng)建模塊的快照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; }
?
轉(zhuǎn)載于:https://www.cnblogs.com/arsense/p/6417966.html
總結(jié)
- 上一篇: UVA 10603 - Fill(dij
- 下一篇: iOS - UIRefreshContr