列举出所有进程(包括隐藏的)

其实只要导出这些NativeAPI,在应用态也是可以用的。
本文来自看雪的某人谁不记得了不好意思了!

  
  
C/C++ code
HANDLE LzOpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle, DWORD dwProcessId)
{
    NTSTATUS status=0;
    char *pBuf=NULL;
//    BOOLEAN wasEnabled;
    DWORD buflen=0x10000,needlen=0;
    DWORD HandleCnt=0;
    HANDLE hRetProcess=0,hOwnerProc,hTmp;
    PSYSTEM_HANDLE_INFORMATION pSysHandleInfo=NULL;
    PROCESS_BASIC_INFORMATION BasePsInfo;
    OBJECT_ATTRIBUTES objatr;
    CLIENT_ID Cid;
    //提升调试权限,否则有些进程,比如服务进程打不开    
    InitializeObjectAttributes(&objatr,0,0,0,0);
    //先尝试正常方式打开
    Cid.UniqueProcess=(HANDLE)dwProcessId;
    Cid.UniqueThread=0;
    status=ZwOpenProcess(&hRetProcess,dwDesiredAccess,&objatr,&Cid);//尝试直接打开
    if (NT_SUCCESS(status))
    {
      return hRetProcess;    
    }
    //不成功,尝试把PID加1再打开,加2,加3也可以
    //理由:有些HOOK函数中过滤PID时不完善,正确的做法应该是先用掩码忽略低两位之后再比较
    Cid.UniqueProcess=(HANDLE)(dwProcessId+1);
    status=ZwOpenProcess(&hRetProcess,dwDesiredAccess,&objatr,&Cid);//尝试直接打开pid+1
    if (NT_SUCCESS(status))
    {
      return hRetProcess;
    }
    //都不成功,就找别的进程中的Handle,这才是本代码的核心, 这些Handle大部分是在Csrss.exe中
    do
    {
      //申请查询句柄信息所需的内存
      ZwAllocateVirtualMemory(GetCurrentProcess(),(PVOID*)&pBuf,0,&buflen,MEM_COMMIT,PAGE_READWRITE);
      //查询系统句柄信息,类型为16
      status=ZwQuerySystemInformation(SystemHandleInformation,(PVOID)pBuf,buflen,&needlen);
      if (status==STATUS_SUCCESS)
      {
        break;
      }
      //不成功,则释放内存
      //这里只要一块大内存够放这些内容就行,或者直接申请一块足够大的也可以
      //返回的needlen可以做为参考
      ZwFreeVirtualMemory(GetCurrentProcess(),(PVOID*)&pBuf,&buflen,MEM_RELEASE);
      //然后把要申请的内存大小乘2,直至成功为止
      buflen*=2;
      pBuf=NULL;
    } while(1);
    //返回的缓冲区内容的第一个DWORD是总的句柄的个数
    HandleCnt=*(DWORD*)pBuf;
    //跳过句柄计数,才是真正的开始
    pSysHandleInfo=(PSYSTEM_HANDLE_INFORMATION)((char*)pBuf+sizeof(DWORD));
    for (DWORD i=0;i<HandleCnt;i++)
    {
      //只验证类型为PROCESS的,值为5
      if (pSysHandleInfo->ObjectTypeNumber==OB_TYPE_PROCESS)
      {
        //打开这个句柄的所有者进程,要复制过来才能查询,否则只能看不能摸~
        Cid.UniqueProcess=(HANDLE)(pSysHandleInfo->ProcessId);
        Cid.UniqueThread=0;
        status=ZwOpenProcess(&hOwnerProc,PROCESS_DUP_HANDLE,&objatr,&Cid);
        if (NT_SUCCESS(status))
        {
        //打开成功,复制句柄到本进程,这里用了PROCESS_ALL_ACCESS以避免权限问题
        status=ZwDuplicateObject(hOwnerProc,
          (void **)(pSysHandleInfo->Handle),
          GetCurrentProcess(),
          &hTmp,
          PROCESS_ALL_ACCESS,
          FALSE,
          0);
        if (NT_SUCCESS(status))
        {
          //复制成功,查询此句柄所对应的进程PID,查询基本信息即可
          status=ZwQueryInformationProcess(hTmp,ProcessBasicInformation,&BasePsInfo,sizeof(PROCESS_BASIC_INFORMATION),NULL);
          if (NT_SUCCESS(status))
          {
          //成功,判断其PID
          if ((unsigned long)BasePsInfo.UniqueProcessId==dwProcessId)
          {
            //句柄所有者是我们要的目标进程,再按所需的权限复制过来
            ZwDuplicateObject(hOwnerProc,
            (void **)(pSysHandleInfo->Handle),
            GetCurrentProcess(),
            &hRetProcess,
            dwDesiredAccess,
            FALSE,
            0);
            //关掉为复制而打开的句柄所有者的句柄引用
            ZwClose(hOwnerProc);
            break;
          }
          
          }
    
        }
        }
      }
      pSysHandleInfo++;//指向下一个结构
    }
    if (pBuf)
    {
        ZwFreeVirtualMemory(GetCurrentProcess(),(PVOID*)&pBuf,&buflen,MEM_RELEASE);
    }
    return hRetProcess;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值