几种获取进程列表的方法

    xiaoxiao2021-03-25  56

    1.CreateToolhelp32Snapshot法:  // //// // CreateToolhelp32Snapshot 法            #include <Tlhelp32.h>// // PROCESSENTRY32 pe32;pe32.dwSize = sizeof(PROCESSENTRY32);BOOL bRet;HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);bRet = Process32First(hProcessSnap,&pe32);while (bRet){   bRet = Process32Next(hProcessSnap,&pe32);   printf("%s\n",&pe32.szExeFile);}return 0; 复制代码 如果想输出文件路径,在其中加入提权代码后再OpenProcess,GetModuleFileNameEx即可。2.EnumProcesses 法  //// EnumProcesses 法      #include <Psapi.h>   #pragma comment(lib,"Psapi.lib")//DWORD PID[1024];DWORD needed,NumProcess;EnumProcesses(PID,sizeof(PID),&needed);NumProcess = needed/sizeof(DWORD);char FilePatch[MAX_PATH]; for (DWORD i=0;i<NumProcess;i++){   HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,PID[i]);   if (hProcess)   {    GetModuleFileNameEx(hProcess,NULL,FilePatch,sizeof(FilePatch));    printf("%s\n",FilePatch);   }}CloseHandle(hProcess);printf("一共%d个进程\n",NumProcess);return 0; 复制代码 3.WTSOpenServer 法  //// WTSOpenServer 法   #include <Wtsapi32.h> #pragma comment(lib,"Wtsapi32.lib")   用nbtstat -an获取本机NetBios名称,并在命令行下输入即可//char *szServerName = argv[1];PWTS_PROCESS_INFO wts;DWORD dwCount;HANDLE hWtsServer = WTSOpenServer(szServerName);if(!WTSEnumerateProcesses(hWtsServer,0,1,&wts,&dwCount))   return 0;for (DWORD i=0;i<dwCount;i++){   printf("%s\n",wts[i].pProcessName); }return 0; 复制代码 4. ZwQuerySystemInformation 法  //// ZwQuerySystemInformation 法 // /* * Author: Leng_que * Date: 2010年1月26日23:44:28 * E-mail: [email]leng_que@yahoo.com.cn[/email] * Description: 演示了如何通过ZwQuerySystemInformation这个函数获取系统的相关信息 */ #include <stdio.h>   #include <windows.h>    typedef LONG NTSTATUS;    #define STATUS_SUCCESS                  ((NTSTATUS)0x00000000L)   #define STATUS_UNSUCCESSFUL             ((NTSTATUS)0xC0000001L)   #define STATUS_NOT_IMPLEMENTED          ((NTSTATUS)0xC0000002L)   #define STATUS_INVALID_INFO_CLASS       ((NTSTATUS)0xC0000003L)   #define STATUS_INFO_LENGTH_MISMATCH     ((NTSTATUS)0xC0000004L)    typedef enum _SYSTEM_INFORMATION_CLASS   {       SystemBasicInformation,                 // 0 Y N       SystemProcessorInformation,             // 1 Y N       SystemPerformanceInformation,           // 2 Y N       SystemTimeOfDayInformation,             // 3 Y N       SystemNotImplemented1,                  // 4 Y N       SystemProcessesAndThreadsInformation,   // 5 Y N       SystemCallCounts,                       // 6 Y N       SystemConfigurationInformation,         // 7 Y N       SystemProcessorTimes,                   // 8 Y N       SystemGlobalFlag,                       // 9 Y Y       SystemNotImplemented2,                  // 10 Y N       SystemModuleInformation,                // 11 Y N       SystemLockInformation,                  // 12 Y N       SystemNotImplemented3,                  // 13 Y N       SystemNotImplemented4,                  // 14 Y N       SystemNotImplemented5,                  // 15 Y N       SystemHandleInformation,                // 16 Y N       SystemObjectInformation,                // 17 Y N       SystemPagefileInformation,              // 18 Y N       SystemInstructionEmulationCounts,       // 19 Y N       SystemInvalidInfoClass1,                // 20       SystemCacheInformation,                 // 21 Y Y       SystemPoolTagInformation,               // 22 Y N       SystemProcessorStatistics,              // 23 Y N       SystemDpcInformation,                   // 24 Y Y       SystemNotImplemented6,                  // 25 Y N       SystemLoadImage,                        // 26 N Y       SystemUnloadImage,                      // 27 N Y       SystemTimeAdjustment,                   // 28 Y Y       SystemNotImplemented7,                  // 29 Y N       SystemNotImplemented8,                  // 30 Y N       SystemNotImplemented9,                  // 31 Y N       SystemCrashDumpInformation,             // 32 Y N       SystemExceptionInformation,             // 33 Y N       SystemCrashDumpStateInformation,        // 34 Y Y/N       SystemKernelDebuggerInformation,        // 35 Y N       SystemContextSwitchInformation,         // 36 Y N       SystemRegistryQuotaInformation,         // 37 Y Y       SystemLoadAndCallImage,                 // 38 N Y       SystemPrioritySeparation,               // 39 N Y       SystemNotImplemented10,                 // 40 Y N       SystemNotImplemented11,                 // 41 Y N       SystemInvalidInfoClass2,                // 42       SystemInvalidInfoClass3,                // 43       SystemTimeZoneInformation,              // 44 Y N       SystemLookasideInformation,             // 45 Y N       SystemSetTimeSlipEvent,                 // 46 N Y       SystemCreateSession,                    // 47 N Y       SystemDeleteSession,                    // 48 N Y       SystemInvalidInfoClass4,                // 49       SystemRangeStartInformation,            // 50 Y N       SystemVerifierInformation,              // 51 Y Y       SystemAddVerifier,                      // 52 N Y       SystemSessionProcessesInformation       // 53 Y N    } SYSTEM_INFORMATION_CLASS;    typedef struct _LSA_UNICODE_STRING   {       USHORT Length;       USHORT MaximumLength;       PWSTR Buffer;          } LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;    typedef struct _CLIENT_ID   {       HANDLE UniqueProcess;       HANDLE UniqueThread;    } CLIENT_ID;    typedef enum _THREAD_STATE   {       StateInitialized,       StateReady,       StateRunning,       StateStandby,       StateTerminated,       StateWait,       StateTransition,       StateUnknown    } THREAD_STATE;    typedef enum _KWAIT_REASON   {       Executive,       FreePage,       PageIn,       PoolAllocation,       DelayExecution,       Suspended,       UserRequest,       WrExecutive,       WrFreePage,       WrPageIn,       WrPoolAllocation,       WrDelayExecution,       WrSuspended,       WrUserRequest,       WrEventPair,       WrQueue,       WrLpcReceive,       WrLpcReply,       WrVirtualMemory,       WrPageOut,       WrRendezvous,       Spare2,       Spare3,       Spare4,       Spare5,       Spare6,       WrKernel    } KWAIT_REASON;    typedef struct _IO_COUNTERS   {       LARGE_INTEGER ReadOperationCount;   //I/O读操作数目       LARGE_INTEGER WriteOperationCount; //I/O写操作数目       LARGE_INTEGER OtherOperationCount; //I/O其他操作数目       LARGE_INTEGER ReadTransferCount;    //I/O读数据数目       LARGE_INTEGER WriteTransferCount;   //I/O写数据数目       LARGE_INTEGER OtherTransferCount;   //I/O其他操作数据数目    } IO_COUNTERS, *PIO_COUNTERS;    typedef struct _VM_COUNTERS   {       ULONG PeakVirtualSize;              //虚拟存储峰值大小       ULONG VirtualSize;                  //虚拟存储大小       ULONG PageFaultCount;               //页故障数目       ULONG PeakWorkingSetSize;           //工作集峰值大小       ULONG WorkingSetSize;               //工作集大小       ULONG QuotaPeakPagedPoolUsage;      //分页池使用配额峰值       ULONG QuotaPagedPoolUsage;          //分页池使用配额       ULONG QuotaPeakNonPagedPoolUsage;   //非分页池使用配额峰值       ULONG QuotaNonPagedPoolUsage;       //非分页池使用配额       ULONG PagefileUsage;                //页文件使用情况       ULONG PeakPagefileUsage;            //页文件使用峰值    } VM_COUNTERS, *PVM_COUNTERS;    typedef LONG KPRIORITY;    typedef struct _SYSTEM_THREADS   {       LARGE_INTEGER KernelTime;       LARGE_INTEGER UserTime;       LARGE_INTEGER CreateTime;       ULONG WaitTime;       PVOID StartAddress;       CLIENT_ID ClientId;       KPRIORITY Priority;       KPRIORITY BasePriority;       ULONG ContextSwitchCount;       THREAD_STATE State;       KWAIT_REASON WaitReason;    } SYSTEM_THREADS, *PSYSTEM_THREADS;    typedef struct _SYSTEM_PROCESSES   {       ULONG NextEntryDelta;       ULONG ThreadCount;       ULONG Reserved1[6];       LARGE_INTEGER CreateTime;       LARGE_INTEGER UserTime;       LARGE_INTEGER KernelTime;       UNICODE_STRING ProcessName;       KPRIORITY BasePriority;       ULONG ProcessId;       ULONG InheritedFromProcessId;       ULONG HandleCount;       ULONG Reserved2[2];       VM_COUNTERS VmCounters;       IO_COUNTERS IoCounters;       SYSTEM_THREADS Threads[1];    } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;    typedef struct _SYSTEM_BASIC_INFORMATION   {       BYTE Reserved1[24];       PVOID Reserved2[4];       CCHAR NumberOfProcessors;    } SYSTEM_BASIC_INFORMATION;    typedef NTSTATUS (WINAPI *NTQUERYSYSTEMINFORMATION)(IN SYSTEM_INFORMATION_CLASS, IN OUT PVOID, IN ULONG, OUT PULONG OPTIONAL);    int main(void)   {       HINSTANCE ntdll_dll = GetModuleHandle("ntdll.dll");       if ( ntdll_dll!=NULL )       {           NTQUERYSYSTEMINFORMATION dwFunAddress = (NTQUERYSYSTEMINFORMATION)GetProcAddress(ntdll_dll, "ZwQuerySystemInformation");           if ( dwFunAddress!=NULL )           {               //执行 SystemBasicInformation               SYSTEM_BASIC_INFORMATION sbi = {0};               NTSTATUS status = dwFunAddress(SystemBasicInformation, (PVOID)&sbi, sizeof(sbi), NULL);               if ( status == STATUS_SUCCESS )               {                   printf("处理器个数:%d\r\n", sbi.NumberOfProcessors);                   printf("\r\n");               }               else             {                   printf("\r\n SystemBasicInformation error");               }                              //执行 SystemProcessesAndThreadsInformation               PSYSTEM_PROCESSES pSp=NULL;               ULONG retureSize=0;                              status = dwFunAddress(SystemProcessesAndThreadsInformation, NULL, 0, &retureSize);               if ( status == STATUS_INFO_LENGTH_MISMATCH )               {                   unsigned char *buf = new unsigned char[retureSize];                   if ( buf!=NULL )                   {                       status = dwFunAddress(SystemProcessesAndThreadsInformation, (PVOID)buf, retureSize, NULL);                       if ( status == STATUS_SUCCESS )                       {                           pSp = (PSYSTEM_PROCESSES)buf;                                                      printf("===============所有进程信息=============\r\n");                           do {                                                              printf("进程ID:%d\r\n", pSp->ProcessId);                                                              printf("进程名:");                               wprintf(L"%s\r\n", pSp->ProcessName.Buffer);                                                              printf("线程数:%d\r\n", pSp->ThreadCount);                               printf("工作集大小:%dKB\r\n", pSp->VmCounters.WorkingSetSize/1024);                               printf("\r\n\r\n");                                                              pSp = (PSYSTEM_PROCESSES)( (unsigned long)pSp + pSp->NextEntryDelta );                                                          } while ( pSp->NextEntryDelta != 0 );                           printf("========================================\r\n");                                                      delete[] buf;                           buf = NULL;                           pSp = NULL;                       }                       else if ( status == STATUS_UNSUCCESSFUL )                       {                           printf("\r\n STATUS_UNSUCCESSFUL");                       }                       else if ( status == STATUS_NOT_IMPLEMENTED )                       {                           printf("\r\n STATUS_NOT_IMPLEMENTED");                       }                       else if ( status == STATUS_INVALID_INFO_CLASS )                       {                           printf("\r\n STATUS_INVALID_INFO_CLASS");                       }                       else if ( status == STATUS_INFO_LENGTH_MISMATCH )                       {                           printf("\r\n STATUS_INFO_LENGTH_MISMATCH");                       }                   }                   else                 {                       printf("\r\n new operation error!");                   }               }           }           else         {               printf("\r\n get ZwQuerySystemInformation address error!");           }                      FreeLibrary(ntdll_dll);       }              system("pause > nul");       return 0;   } 复制代码
    转载请注明原文地址: https://ju.6miu.com/read-38180.html

    最新回复(0)