1.EnumProcessModules , GetModuleBaseName
这种方法获取的进程,如果用户名是NETWORK SERVICE或LOCAL SEVICE获取用户名会失败,原因是调用OpenProcess时对这些进程没有权限!
示例代码:
#include "stdafx.h"
#include "windows.h"
#include "psapi.h"
#pragma comment(lib,"psapi.lib")
void PrintProcessNameAndID(DWORD processID)
{
wchar_t szProcessName[MAX_PATH]=L"unknown";
//得到进程句柄
HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,processID);
//获得进程名称
if(hProcess!=NULL)
{
HMODULE hMod=NULL;
DWORD cbNeeded;
if(EnumProcessModules(hProcess,&hMod,sizeof(hMod),&cbNeeded))
{
if(GetModuleBaseName(hProcess,hMod,szProcessName,sizeof(szProcessName)))
printf("%ws (ProcessID:%d)\n",szProcessName,processID);
}
else printf("getname fail\n");
CloseHandle(hProcess);
}
else{
printf("open process fail\n");
printf("%ws (ProcessID:%d)\n",szProcessName,processID);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//获得进程标识符列表
DWORD aProcesses[60],cbNeeded,cProcesses;
unsigned int i;
if(!EnumProcesses(aProcesses,sizeof(aProcesses),&cbNeeded))
printf("EnumProcess fail\n");
//计算返回进程标识符的个数
cProcesses=cbNeeded/sizeof(DWORD);
//打印进程名称和进程标识符
for(i=0;i<cProcesses;i++){
printf("%d ",i);
PrintProcessNameAndID(aProcesses[i]);
}
printf("%d",i);
getchar();
return 0;
}
2.CreateToolhelp32Snapshot , Process32First , Process32Next
这种方法我觉得比前一种好,可以获得打开任务管理器能看到的所有进程,代码也相对简单。
#include "stdafx.h"Process32Next
#include <windows.h>
#include <tlhelp32.h>
#pragma comment(lib,"kernel32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
int i=0;
if (!hSnapshot)
{
printf("CreateToolhelp32Snapshot ERROR!/n");
return 1;
}
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32 );//如果不初始化,Process32First会失败。
if (!Process32First(hSnapshot, &pe32))
{
printf("Process32First ERROR!/n");
}
do
{
printf("%d ParentProcessID:%d ProcID:%d---%ws\n",i++,pe32.th32ParentProcessID,pe32.th32ProcessID ,pe32.szExeFile );
}while(Process32Next(hSnapshot, &pe32));
getchar();
return 0;
}
3.相关函数还有GetProcessMemoryInfo,kiSwapContext,拒说kiSwapContext是RING0级的,可获取隐藏进程,现在还不会HOOK,有基础了再回来练习。