zoukankan      html  css  js  c++  java
  • 利用服务枚举进程

    枚举进程的方法有许多,简单说一下它们的优缺点。

    1.利用CreateToolhelp32Snapshot来枚举,这是最常用,也最简单的方法了,不用多说。

    2.利用ZwQuerySystemInformation从ntdll.dll中获取,需要定义结构体SYSTEM_PROCESS_INFORMATION,还有对应的函数指针,但是要注意一点,申请内存之后,要判断ZwQuerySystemInformation的返回值是不是STATUS_INFO_LENGTH_MISMATCH,如果是,说明内存不足,要重新申请更大的。

    3.利用PSAPI.DLL中提供的EnumProcesses,EnumProcessModules等函数来获取,这种方法是去打开进程,因此对于权限的要求特别高,即使加上提权代码,或者以管理员权限运行,仍然有许多进程信息得不到,但是它可以得到部分进程完整路径。根据自己的需求来选择。

    4.利用服务中的WTSOpenServerA,WTSEnumerateProcessesA函数来得到,下面重点说说这种方法。

    #include <windows.h>
    #include <stdio.h>
    #include <Wtsapi32.h>
    
    #pragma  comment (lib,"Wtsapi32.lib")
    
    
    int main()
    {
    	WCHAR* szServerName = L"";   //win10 不需要
    	HANDLE WtsServerHandle = WTSOpenServer(szServerName);
    
    	// 然后开始遍历终端服务器上的所有进程,这里我们是指本机的所有进程.
    
    	PWTS_PROCESS_INFO pWtspi;
    	DWORD dwCount;
    
    	if (!WTSEnumerateProcesses(WtsServerHandle, 0, 1, &pWtspi, &dwCount))
    	{
    		int a = GetLastError();
    		return 0;
    	}
    		
    
    	for (DWORD i = 0; i < dwCount; i++)
    	{
    		printf("ProcessID: %d (%ls)
    ", pWtspi[i].ProcessId,
    			pWtspi[i].pProcessName);
    	}
    
    	getchar(); 
    }
    

      win10下已经提供了Wtsapi32.lib,Wtsapi32.dll等,因此程序简化了很多,只是对于服务名szServerName,看资料以前的操作系统要主机的名字,NetBios指定的终端服务名,可以通过在控制台命令行下用 nbtstat –n 来获取本机NetBios名,我这样做了之后,却发现无法枚举,调用GetLastError()函数,错误是0x000006BA   ,RPC 服务器不可用。将RPC重启后还是不行,最后上网查了,原来win10下不需要这个名字。终于枚举成功了。

    对于比较旧的操作系统,建议用函数指针的方法实现:

    typedef HANDLE(WINAPI *WTSOPENSERVER)(LPTSTR ServerName);
    
    typedef BOOL(WINAPI *WTSENUMERATEPROCESSES)
    (
    	HANDLE ServerHandle,   // WTSOpenServer返回的句柄. 
    	DWORD Reserved,   // 保留值 0.
    	DWORD Version,    // 指定枚举要求的版本,必须为 1.
    	PWTS_PROCESS_INFO* ProcessInfo, // 存放我们要的进程名和进程id.
    	DWORD* Count     // 存放ppProcessInfo里WTS_PROCESS_INFO结构数量指针.
    	);
    
    
    	HMODULE WtsApi32Handle = LoadLibrary(L"wtsapi32.dll");
    
    	WTSOPENSERVER WtsOpenServer = (WTSOPENSERVER)
    		GetProcAddress(WtsApi32Handle, "WTSOpenServerA");
    
    	WTSENUMERATEPROCESSES WtsEnumerateProcesses =
    		(WTSENUMERATEPROCESSES)
    		GetProcAddress(WtsApi32Handle, "WTSEnumerateProcessesA");
    

      

     

  • 相关阅读:
    【转】软链接和硬链接到底有啥作用和区别
    useradd命令详解
    【转】Linux下MySQL数据库安装及配置方法
    【转】MySQL的安装与配置——详细教程-window系统下
    mysql服务器常用命令
    【转】DDL/DML/DCL区别概述
    tmux终端工具的简单使用
    linux go环境安装和基本项目结构
    ClickHouse高可用集群的配置
    centos7下使用rpm包安装clickhouse
  • 原文地址:https://www.cnblogs.com/kekoukele987/p/7503004.html
Copyright © 2011-2022 走看看