进程枚举相关函数

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,有基础了再回来练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值