最近在准备一个进程查看(当然不只进程查看功能了)的工具,总结了在用户态下查找进程的几种方法。
当然,如果想要真正做到进程查看,还是要进入核心态中,因为在用户态是查不到什么东西的,但是可以用来和
核心态结果进行比较找出隐藏进程。(内核级病毒、木马在Ring0中可以很容易的做到隐藏而是用户态程序检测不到)。
//write by jingzhongrong
1、利用ToolHelp API
首先创建一个系统快照,然后通过对系统快照的访问完成进程的枚举
获取系统快照使用 CreateToolhelp32Snapshot 函数
函数原型声明如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
将dwFlags设置为TH32CS_SNAPPROCESS用于获取进程快照。
函数调用成功后会返回一个快照的句柄,便可以使用Process32First、Process32Next进行枚举了
函数原型声明如下:
BOOL WINAPI Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
BOOL WINAPI Process32Next( HANDLE hSnapshot, LPPROCESSENTRY32 lppe );
下面是相关代码:
#include <tlhelp32.h>
#include <stdio.h>
void useToolHelp()
{
HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0 );
if(procSnap == INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot failed, %d " ,GetLastError());
return ;
}
//
PROCESSENTRY32 procEntry = { 0 };
procEntry.dwSize = sizeof (PROCESSENTRY32);
BOOL bRet = Process32First(procSnap,& procEntry);
while (bRet)
{
wprintf(L"PID: %d (%s) " ,procEntry.th32ProcessID, procEntry.szExeFile);
bRet = Process32Next(procSnap,& procEntry);
}
CloseHandle(procSnap);
}
void main()
{
useToolHelp();
getchar();
}
用此方法可以在进程ID和进程名称间进行转换,即通过进程名称获得进程ID,通过进程ID获取进程名称。
2、通过psapi.dll提供的函数
通过psapi.dll提供的EnumProcesses、EnumProcessModules实现
函数原型声明如下:
BOOL EnumProcesses( DWORD* pProcessIds, DWORD cb, DWORD*