用户态枚举进程的几种方法

本文介绍了在用户态下枚举进程的四种方法:1) 使用ToolHelp API,通过CreateToolhelp32Snapshot和Process32First/Next;2) 依赖psapi.dll的EnumProcesses和EnumProcessModules;3) 利用ntdll.dll的Native API中的ZwQuerySystemInformation;4) 通过进程打开的句柄枚举。文章强调,虽然用户态枚举存在被Rootkit篡改的风险,但可以作为内核态枚举的补充。
摘要由CSDN通过智能技术生成

最近在准备一个进程查看(当然不只进程查看功能了)的工具,总结了在用户态下查找进程的几种方法。

当然,如果想要真正做到进程查看,还是要进入核心态中,因为在用户态是查不到什么东西的,但是可以用来和

核心态结果进行比较找出隐藏进程。(内核级病毒、木马在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 <windows.h>
#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*
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值