现在的位置: 首页 > 综合 > 正文

枚举进程的几种方法

2013年05月06日 ⁄ 综合 ⁄ 共 10832字 ⁄ 字号 评论关闭

 http://www.cctry.com/thread-11857-1-1.html

 

1.CreateToolhelp32Snapshot法:(me 使用过)

  1. // //////////////////////////////////////////////////////////////////////////
  2. // // CreateToolhelp32Snapshot 法            #include <Tlhelp32.h>
  3. // //////////////////////////////////////////////////////////////////////////
  4. PROCESSENTRY32 pe32;
  5. pe32.dwSize = sizeof(PROCESSENTRY32);
  6. BOOL bRet;
  7. HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
  8. bRet = Process32First(hProcessSnap,&pe32);
  9. while (bRet)
  10. {
  11.    bRet = Process32Next(hProcessSnap,&pe32);
  12.    printf("%s\n",&pe32.szExeFile);
  13. }
  14. return 0;

复制代码

如果想输出文件路径,在其中加入提权代码后再OpenProcess,GetModuleFileNameEx即可。

2.EnumProcesses 法

  1. //////////////////////////////////////////////////////////////////////////
  2. // EnumProcesses 法      #include <Psapi.h>   #pragma comment(lib,"Psapi.lib")
  3. //////////////////////////////////////////////////////////////////////////
  4. DWORD PID[1024];
  5. DWORD needed,NumProcess;
  6. EnumProcesses(PID,sizeof(PID),&needed);
  7. NumProcess = needed/sizeof(DWORD);
  8. char FilePatch[MAX_PATH];
  9. for (DWORD i=0;i<NumProcess;i++)
  10. {
  11.    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,PID[i]);
  12.    if (hProcess)
  13.    {
  14.     GetModuleFileNameEx(hProcess,NULL,FilePatch,sizeof(FilePatch));
  15.     printf("%s\n",FilePatch);
  16.    }
  17. }
  18. CloseHandle(hProcess);
  19. printf("一共%d个进程\n",NumProcess);
  20. return 0;

复制代码

3.WTSOpenServer 法

  1. //////////////////////////////////////////////////////////////////////////
  2. // WTSOpenServer 法   #include <Wtsapi32.h> #pragma comment(lib,"Wtsapi32.lib")   用nbtstat -an获取本机NetBios名称,并在命令行下输入即可
  3. //////////////////////////////////////////////////////////////////////////
  4. char *szServerName = argv[1];
  5. PWTS_PROCESS_INFO wts;
  6. DWORD dwCount;
  7. HANDLE hWtsServer = WTSOpenServer(szServerName);
  8. if(!WTSEnumerateProcesses(hWtsServer,0,1,&wts,&dwCount))
  9.    return 0;
  10. for (DWORD i=0;i<dwCount;i++)
  11. {
  12.    printf("%s\n",wts[i].pProcessName);
  13. }
  14. return 0;

复制代码

4. ZwQuerySystemInformation 法

  1. //////////////////////////////////////////////////////////////////////////
  2. // ZwQuerySystemInformation 法
  3. //////////////////////////////////////////////////////////////////////////
  4. /*
  5. * Author: Leng_que
  6. * Date: 2010年1月26日23:44:28
  7. * E-mail: [email]leng_que@yahoo.com.cn[/email]
  8. * Description: 演示了如何通过ZwQuerySystemInformation这个函数获取系统的相关信息
  9. */
  10. #include <stdio.h>   
  11. #include <windows.h>   
  12. typedef LONG NTSTATUS;   
  13. #define STATUS_SUCCESS                  ((NTSTATUS)0x00000000L)   
  14. #define STATUS_UNSUCCESSFUL             ((NTSTATUS)0xC0000001L)   
  15. #define STATUS_NOT_IMPLEMENTED          ((NTSTATUS)0xC0000002L)   
  16. #define STATUS_INVALID_INFO_CLASS       ((NTSTATUS)0xC0000003L)   
  17. #define STATUS_INFO_LENGTH_MISMATCH     ((NTSTATUS)0xC0000004L)   
  18. typedef enum _SYSTEM_INFORMATION_CLASS   
  19. {   
  20.     SystemBasicInformation,                 // 0 Y N   
  21.     SystemProcessorInformation,             // 1 Y N   
  22.     SystemPerformanceInformation,           // 2 Y N   
  23.     SystemTimeOfDayInformation,             // 3 Y N   
  24.     SystemNotImplemented1,                  // 4 Y N   
  25.     SystemProcessesAndThreadsInformation,   // 5 Y N   
  26.     SystemCallCounts,                       // 6 Y N   
  27.     SystemConfigurationInformation,         // 7 Y N   
  28.     SystemProcessorTimes,                   // 8 Y N   
  29.     SystemGlobalFlag,                       // 9 Y Y   
  30.     SystemNotImplemented2,                  // 10 Y N   
  31.     SystemModuleInformation,                // 11 Y N   
  32.     SystemLockInformation,                  // 12 Y N   
  33.     SystemNotImplemented3,                  // 13 Y N   
  34.     SystemNotImplemented4,                  // 14 Y N   
  35.     SystemNotImplemented5,                  // 15 Y N   
  36.     SystemHandleInformation,                // 16 Y N   
  37.     SystemObjectInformation,                // 17 Y N   
  38.     SystemPagefileInformation,              // 18 Y N   
  39.     SystemInstructionEmulationCounts,       // 19 Y N   
  40.     SystemInvalidInfoClass1,                // 20   
  41.     SystemCacheInformation,                 // 21 Y Y   
  42.     SystemPoolTagInformation,               // 22 Y N   
  43.     SystemProcessorStatistics,              // 23 Y N   
  44.     SystemDpcInformation,                   // 24 Y Y   
  45.     SystemNotImplemented6,                  // 25 Y N   
  46.     SystemLoadImage,                        // 26 N Y   
  47.     SystemUnloadImage,                      // 27 N Y   
  48.     SystemTimeAdjustment,                   // 28 Y Y   
  49.     SystemNotImplemented7,                  // 29 Y N   
  50.     SystemNotImplemented8,                  // 30 Y N   
  51.     SystemNotImplemented9,                  // 31 Y N   
  52.     SystemCrashDumpInformation,             // 32 Y N   
  53.     SystemExceptionInformation,             // 33 Y N   
  54.     SystemCrashDumpStateInformation,        // 34 Y Y/N   
  55.     SystemKernelDebuggerInformation,        // 35 Y N   
  56.     SystemContextSwitchInformation,         // 36 Y N   
  57.     SystemRegistryQuotaInformation,         // 37 Y Y   
  58.     SystemLoadAndCallImage,                 // 38 N Y   
  59.     SystemPrioritySeparation,               // 39 N Y   
  60.     SystemNotImplemented10,                 // 40 Y N   
  61.     SystemNotImplemented11,                 // 41 Y N   
  62.     SystemInvalidInfoClass2,                // 42   
  63.     SystemInvalidInfoClass3,                // 43   
  64.     SystemTimeZoneInformation,              // 44 Y N   
  65.     SystemLookasideInformation,             // 45 Y N   
  66.     SystemSetTimeSlipEvent,                 // 46 N Y   
  67.     SystemCreateSession,                    // 47 N Y   
  68.     SystemDeleteSession,                    // 48 N Y   
  69.     SystemInvalidInfoClass4,                // 49   
  70.     SystemRangeStartInformation,            // 50 Y N   
  71.     SystemVerifierInformation,              // 51 Y Y   
  72.     SystemAddVerifier,                      // 52 N Y   
  73.     SystemSessionProcessesInformation       // 53 Y N   
  74. } SYSTEM_INFORMATION_CLASS;   
  75. typedef struct _LSA_UNICODE_STRING   
  76. {   
  77.     USHORT Length;   
  78.     USHORT MaximumLength;   
  79.     PWSTR Buffer;   
  80.       
  81. } LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;   
  82. typedef struct _CLIENT_ID   
  83. {   
  84.     HANDLE UniqueProcess;   
  85.     HANDLE UniqueThread;   
  86. } CLIENT_ID;   
  87. typedef enum _THREAD_STATE   
  88. {   
  89.     StateInitialized,   
  90.     StateReady,   
  91.     StateRunning,   
  92.     StateStandby,   
  93.     StateTerminated,   
  94.     StateWait,   
  95.     StateTransition,   
  96.     StateUnknown   
  97. } THREAD_STATE;   
  98. typedef enum _KWAIT_REASON   
  99. {   
  100.     Executive,   
  101.     FreePage,   
  102.     PageIn,   
  103.     PoolAllocation,   
  104.     DelayExecution,   
  105.     Suspended,   
  106.     UserRequest,   
  107.     WrExecutive,   
  108.     WrFreePage,   
  109.     WrPageIn,   
  110.     WrPoolAllocation,   
  111.     WrDelayExecution,   
  112.     WrSuspended,   
  113.     WrUserRequest,   
  114.     WrEventPair,   
  115.     WrQueue,   
  116.     WrLpcReceive,   
  117.     WrLpcReply,   
  118.     WrVirtualMemory,   
  119.     WrPageOut,   
  120.     WrRendezvous,   
  121.     Spare2,   
  122.     Spare3,   
  123.     Spare4,   
  124.     Spare5,   
  125.     Spare6,   
  126.     WrKernel   
  127. } KWAIT_REASON;   
  128. typedef struct _IO_COUNTERS   
  129. {   
  130.     LARGE_INTEGER ReadOperationCount;   //I/O读操作数目   
  131.     LARGE_INTEGER WriteOperationCount; //I/O写操作数目   
  132.     LARGE_INTEGER OtherOperationCount; //I/O其他操作数目   
  133.     LARGE_INTEGER ReadTransferCount;    //I/O读数据数目   
  134.     LARGE_INTEGER WriteTransferCount;   //I/O写数据数目   
  135.     LARGE_INTEGER OtherTransferCount;   //I/O其他操作数据数目   
  136. } IO_COUNTERS, *PIO_COUNTERS;   
  137. typedef struct _VM_COUNTERS   
  138. {   
  139.     ULONG PeakVirtualSize;              //虚拟存储峰值大小   
  140.     ULONG VirtualSize;                  //虚拟存储大小   
  141.     ULONG PageFaultCount;               //页故障数目   
  142.     ULONG PeakWorkingSetSize;           //工作集峰值大小   
  143.     ULONG WorkingSetSize;               //工作集大小   
  144.     ULONG QuotaPeakPagedPoolUsage;      //分页池使用配额峰值   
  145.     ULONG QuotaPagedPoolUsage;          //分页池使用配额   
  146.     ULONG QuotaPeakNonPagedPoolUsage;   //非分页池使用配额峰值   
  147.     ULONG QuotaNonPagedPoolUsage;       //非分页池使用配额   
  148.     ULONG PagefileUsage;                //页文件使用情况   
  149.     ULONG PeakPagefileUsage;            //页文件使用峰值   
  150. } VM_COUNTERS, *PVM_COUNTERS;   
  151. typedef LONG KPRIORITY;   
  152. typedef struct _SYSTEM_THREADS   
  153. {   
  154.     LARGE_INTEGER KernelTime;   
  155.     LARGE_INTEGER UserTime;   
  156.     LARGE_INTEGER CreateTime;   
  157.     ULONG WaitTime;   
  158.     PVOID StartAddress;   
  159.     CLIENT_ID ClientId;   
  160.     KPRIORITY Priority;   
  161.     KPRIORITY BasePriority;   
  162.     ULONG ContextSwitchCount;   
  163.     THREAD_STATE State;   
  164.     KWAIT_REASON WaitReason;   
  165. } SYSTEM_THREADS, *PSYSTEM_THREADS;   
  166. typedef struct _SYSTEM_PROCESSES   
  167. {   
  168.     ULONG NextEntryDelta;   
  169.     ULONG ThreadCount;   
  170.     ULONG Reserved1[6];   
  171.     LARGE_INTEGER CreateTime;   
  172.     LARGE_INTEGER UserTime;   
  173.     LARGE_INTEGER KernelTime;   
  174.     UNICODE_STRING ProcessName;   
  175.     KPRIORITY BasePriority;   
  176.     ULONG ProcessId;   
  177.     ULONG InheritedFromProcessId;   
  178.     ULONG HandleCount;   
  179.     ULONG Reserved2[2];   
  180.     VM_COUNTERS VmCounters;   
  181.     IO_COUNTERS IoCounters;   
  182.     SYSTEM_THREADS Threads[1];   
  183. } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;   
  184. typedef struct _SYSTEM_BASIC_INFORMATION   
  185. {   
  186.     BYTE Reserved1[24];   
  187.     PVOID Reserved2[4];   
  188.     CCHAR NumberOfProcessors;   
  189. } SYSTEM_BASIC_INFORMATION;   
  190. typedef NTSTATUS (WINAPI *NTQUERYSYSTEMINFORMATION)(IN SYSTEM_INFORMATION_CLASS, IN OUT PVOID, IN ULONG, OUT PULONG OPTIONAL);   
  191. int main(void)   
  192. {   
  193.     HINSTANCE ntdll_dll = GetModuleHandle("ntdll.dll");   
  194.     if ( ntdll_dll!=NULL )   
  195.     {   
  196.         NTQUERYSYSTEMINFORMATION dwFunAddress = (NTQUERYSYSTEMINFORMATION)GetProcAddress(ntdll_dll, "ZwQuerySystemInformation");   
  197.         if ( dwFunAddress!=NULL )   
  198.         {   
  199.             //执行 SystemBasicInformation   
  200.             SYSTEM_BASIC_INFORMATION sbi = {0};   
  201.             NTSTATUS status = dwFunAddress(SystemBasicInformation, (PVOID)&sbi, sizeof(sbi), NULL);   
  202.             if ( status == STATUS_SUCCESS )   
  203.             {   
  204.                 printf("处理器个数:%d\r\n", sbi.NumberOfProcessors);   
  205.                 printf("\r\n");   
  206.             }   
  207.             else
  208.             {   
  209.                 printf("\r\n SystemBasicInformation error");   
  210.             }   
  211.                
  212.             //执行 SystemProcessesAndThreadsInformation   
  213.             PSYSTEM_PROCESSES pSp=NULL;   
  214.             ULONG retureSize=0;   
  215.                
  216.             status = dwFunAddress(SystemProcessesAndThreadsInformation, NULL, 0, &retureSize);   
  217.             if ( status == STATUS_INFO_LENGTH_MISMATCH )   
  218.             {   
  219.                 unsigned char *buf = new unsigned char[retureSize];   
  220.                 if ( buf!=NULL )   
  221.                 {   
  222.                     status = dwFunAddress(SystemProcessesAndThreadsInformation, (PVOID)buf, retureSize, NULL);   
  223.                     if ( status == STATUS_SUCCESS )   
  224.                     {   
  225.                         pSp = (PSYSTEM_PROCESSES)buf;   
  226.                            
  227.                         printf("===============所有进程信息=============\r\n");   
  228.                         do {   
  229.                               
  230.                             printf("进程ID:%d\r\n", pSp->ProcessId);   
  231.                               
  232.                             printf("进程名:");   
  233.                             wprintf(L"%s\r\n", pSp->ProcessName.Buffer);   
  234.                               
  235.                             printf("线程数:%d\r\n", pSp->ThreadCount);   
  236.                             printf("工作集大小:%dKB\r\n", pSp->VmCounters.WorkingSetSize/1024);   
  237.                             printf("\r\n\r\n");   
  238.                               
  239.                             pSp = (PSYSTEM_PROCESSES)( (unsigned long)pSp + pSp->NextEntryDelta );   
  240.                               
  241.                         } while ( pSp->NextEntryDelta != 0 );   
  242.                         printf("========================================\r\n");   
  243.                            
  244.                         delete[] buf;   
  245.                         buf = NULL;   
  246.                         pSp = NULL;   
  247.                     }   
  248.                     else if ( status == STATUS_UNSUCCESSFUL )   
  249.                     {   
  250.                         printf("\r\n STATUS_UNSUCCESSFUL");   
  251.                     }   
  252.                     else if ( status == STATUS_NOT_IMPLEMENTED )   
  253.                     {   
  254.                         printf("\r\n STATUS_NOT_IMPLEMENTED");   
  255.                     }   
  256.                     else if ( status == STATUS_INVALID_INFO_CLASS )   
  257.                     {   
  258.                         printf("\r\n STATUS_INVALID_INFO_CLASS");   
  259.                     }   
  260.                     else if ( status == STATUS_INFO_LENGTH_MISMATCH )   
  261.                     {   
  262.                         printf("\r\n STATUS_INFO_LENGTH_MISMATCH");   
  263.                     }   
  264.                 }   
  265.                 else
  266.                 {   
  267.                     printf("\r\n new operation error!");   
  268.                 }   
  269.             }   
  270.         }   
  271.         else
  272.         {   
  273.             printf("\r\n get ZwQuerySystemInformation address error!");   
  274.         }   
  275.            
  276.         FreeLibrary(ntdll_dll);   
  277.     }   
  278.       
  279.     system("pause > nul");   
  280.     return 0;   
  281. }

复制代码

抱歉!评论已关闭.