内核层 进程列举 NtQuerySystemInformation

简介:

/*--------- 1.c -----------*/ 
#include "1.h"   

//---------列举进程---------   
NTSTATUS EnumProcess()   
{   
int iCount = 1;    //进程计数   
NTSTATUS status;   //返回值   
PVOID pSi = NULL; /*指向SystemInformationClass的指针,此处为SystemProcessesAndThreadsInformation,即我们所要获取的信息*/ 
PSYSTEM_PROCESS_INFORMATION pSpiNext = NULL; //同上   
ULONG uSize;       //pSi的大小,以BYTE为单位   
ULONG pNeededSize = 0; //系统返回所需长度,因在WIN2000下不会返回,故不使用,设置为0   
BOOL bOver = FALSE; //标识是否列举完成   

//设定pSi大小uSize初始为32K,并为pSi分配uSize的内存,根据返回值逐步累加uSize,步长为32K   
for (uSize = 0x8000; ((pSi = ExAllocatePoolWithTag(NonPagedPool, uSize, 'tag1')) != NULL); uSize += 0x8000)   
{   
    //检索指定的系统信息,这里是有关进程的信息   
    status = NtQuerySystemInformation(SystemProcessesAndThreadsInformation,   
                      pSi,   
                      uSize,   
                      &pNeededSize);   
    if (STATUS_SUCCESS == status) //NtQuerySystemInformation返回成功   
    {   
      DbgPrint("[Aliwy] SUCCESS uSize = 0x%.8X, pNeededSize = 0x%.8X, status = 0x%.8X\n", uSize, pNeededSize, status);   
      pSpiNext = (PSYSTEM_PROCESS_INFORMATION)pSi; /*使用pSpiNext操作,pSi要留到后面释放所分配的内存*/
      while (TRUE)   
      {   
        if (pSpiNext->ProcessId == 0)   
        {   
          DbgPrint("[Aliwy] %d - System Idle Process\n", pSpiNext->ProcessId); /*进程标识符为0的是System Idle Process,需手动标明*/ 
        }   
        else 
        {   
          DbgPrint("[Aliwy] %d - %wZ\n", pSpiNext->ProcessId, &pSpiNext->ImageName); /*打印出进程标识符和进程名称*/ 
        }   
        if (pSpiNext->NextEntryOffset == 0) //如果NextEntryOffset为0即表示进程已列举完   
        {   
          DbgPrint("[Aliwy] EnumProcess Over, Count is: %d\n", iCount);   
          bOver = TRUE; //标识进程列举已完成   
          break; //跳出列举循环(while循环)   
        }           
        pSpiNext = (PSYSTEM_PROCESS_INFORMATION)((ULONG)pSpiNext + pSpiNext->NextEntryOffset); //指向下一个进程的信息   
        iCount++;   //计数累加   
      }   
      ExFreePool(pSi); //释放为sPi分配的内存   
      if (bOver) //进程列举完成   
      {   
        break; //跳出内存分配循环(for循环)   
      }   
    }   
    else 
    {   
      DbgPrint("[Aliwy] FAILURE uSize = %.8X, pNeededSize = %.8X, status = %.8X\n", uSize, pNeededSize, status);   
    }   
}   
return STATUS_SUCCESS;   
}   
//------------------------------   

//---------DriverUnload---------   
VOID OnUnload( IN PDRIVER_OBJECT DriverObject )   
{   
DbgPrint("[Aliwy] OnUnload\n");   
}   
//------------------------------   

//----------DriverEntry---------   
NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )   
{   
DbgPrint("[Aliwy] DriverEntry\n");   
     
EnumProcess();   
     
theDriverObject->DriverUnload = OnUnload;    
     
return STATUS_SUCCESS;   
}   
//------------------------------   


/*----------- 1.h ------------*/ 
#include <ntddk.h>   

#define DWORD unsigned long   
#define BOOL int   

//---------系统信息结构---------   
typedef enum _SYSTEM_INFORMATION_CLASS {   
SystemBasicInformation,   
SystemProcessorInformation,   
SystemPerformanceInformation,   
SystemTimeOfDayInformation,   
SystemNotImplemented1,   
SystemProcessesAndThreadsInformation,   
SystemCallCounts,   
SystemConfigurationInformation,   
SystemProcessorTimes,   
SystemGlobalFlag,   
SystemNotImplemented2,   
SystemModuleInformation,   
SystemLockInformation,   
SystemNotImplemented3,   
SystemNotImplemented4,   
SystemNotImplemented5,   
SystemHandleInformation,   
SystemObjectInformation,   
SystemPagefileInformation,   
SystemInstructionEmulationCounts,   
SystemInvalidInfoClass1,   
SystemCacheInformation,   
SystemPoolTagInformation,   
SystemProcessorStatistics,   
SystemDpcInformation,   
SystemNotImplemented6,   
SystemLoadImage,   
SystemUnloadImage,   
SystemTimeAdjustment,   
SystemNotImplemented7,   
SystemNotImplemented8,   
SystemNotImplemented9,   
SystemCrashDumpInformation,   
SystemExceptionInformation,   
SystemCrashDumpStateInformation,   
SystemKernelDebuggerInformation,   
SystemContextSwitchInformation,   
SystemRegistryQuotaInformation,   
SystemLoadAndCallImage,   
SystemPrioritySeparation,   
SystemNotImplemented10,   
SystemNotImplemented11,   
SystemInvalidInfoClass2,   
SystemInvalidInfoClass3,   
SystemTimeZoneInformation,   
SystemLookasideInformation,   
SystemSetTimeSlipEvent,   
SystemCreateSession,   
SystemDeleteSession,   
SystemInvalidInfoClass4,   
SystemRangeStartInformation,   
SystemVerifierInformation,   
SystemAddVerifier,   
    SystemSessionProcessesInformation   
} SYSTEM_INFORMATION_CLASS, *PSYSTEM_INFORMATION_CLASS;   
//------------------------------   

//---------线程信息结构---------   
typedef struct _SYSTEM_THREAD {   
LARGE_INTEGER           KernelTime;   
LARGE_INTEGER           UserTime;   
LARGE_INTEGER           CreateTime;   
ULONG                   WaitTime;   
PVOID                   StartAddress;   
CLIENT_ID               ClientId;   
KPRIORITY               Priority;   
LONG                    BasePriority;   
ULONG                   ContextSwitchCount;   
ULONG                   State;   
KWAIT_REASON            WaitReason;   
} SYSTEM_THREAD, *PSYSTEM_THREAD;   
//------------------------------   

//---------进程信息结构---------   
typedef struct _SYSTEM_PROCESS_INFORMATION {   
ULONG                   NextEntryOffset; //NextEntryDelta 构成结构序列的偏移量   
ULONG                   NumberOfThreads; //线程数目   
LARGE_INTEGER           Reserved[3];   
LARGE_INTEGER           CreateTime;   //创建时间   
LARGE_INTEGER           UserTime;     //用户模式(Ring 3)的CPU时间   
LARGE_INTEGER           KernelTime;   //内核模式(Ring 0)的CPU时间   
UNICODE_STRING          ImageName;    //进程名称   
KPRIORITY               BasePriority; //进程优先权   
HANDLE                  ProcessId;    //ULONG UniqueProcessId 进程标识符   
HANDLE                  InheritedFromProcessId; //父进程的标识符   
ULONG                   HandleCount; //句柄数目   
ULONG                   Reserved2[2];   
ULONG                   PrivatePageCount;   
VM_COUNTERS             VirtualMemoryCounters; //虚拟存储器的结构   
IO_COUNTERS             IoCounters; //IO计数结构   
SYSTEM_THREAD           Threads[0]; //进程相关线程的结构数组   
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;   

//typedef SYSTEM_PROCESSES SYSTEM_PROCESS_INFORMATION;   
//typedef PSYSTEM_PROCESSES PSYSTEM_PROCESS_INFORMATION;   
//MSDN此结构定义在SDK的winternl.h中,以上部分信息未文档化   
//_SYSTEM_PROCESS_INFORMATION = _SYSTEM_PROCESSES   
//------------------------------   

//---------函数声明-------------   
NTSYSAPI    
NTSTATUS   
NTAPI   
NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInformationClass,   
             OUT PVOID SystemInformation,   
             IN ULONG SystemInformationLength,   
             OUT PULONG ReturnLength OPTIONAL);   
//------------------------------

另外再转一个

#include "ntddk.h"

#define printf DbgPrint

typedef enum _SYSTEM_INFORMATION_CLASS { 
SystemBasicInformation,      // 0 
   SystemProcessorInformation,     // 1 
   SystemPerformanceInformation,     // 2
   SystemTimeOfDayInformation,     // 3
   SystemNotImplemented1,      // 4
   SystemProcessesAndThreadsInformation,    // 5
   SystemCallCounts,       // 6
   SystemConfigurationInformation,     // 7
   SystemProcessorTimes,      // 8
   SystemGlobalFlag,       // 9
   SystemNotImplemented2,      // 10
   SystemModuleInformation,      // 11
   SystemLockInformation,      // 12
   SystemNotImplemented3,      // 13
   SystemNotImplemented4,      // 14
   SystemNotImplemented5,      // 15
   SystemHandleInformation,      // 16
   SystemObjectInformation,      // 17
   SystemPagefileInformation,      // 18
   SystemInstructionEmulationCounts,     // 19
   SystemInvalidInfoClass1,      // 20
   SystemCacheInformation,      // 21
   SystemPoolTagInformation,      // 22
   SystemProcessorStatistics,      // 23
   SystemDpcInformation,      // 24
   SystemNotImplemented6,      // 25
   SystemLoadImage,       // 26
   SystemUnloadImage,      // 27
   SystemTimeAdjustment,      // 28
   SystemNotImplemented7,      // 29
   SystemNotImplemented8,      // 30
   SystemNotImplemented9,      // 31
   SystemCrashDumpInformation,     // 32
   SystemExceptionInformation,     // 33
   SystemCrashDumpStateInformation,     // 34
   SystemKernelDebuggerInformation,     // 35
   SystemContextSwitchInformation,     // 36
   SystemRegistryQuotaInformation,     // 37
   SystemLoadAndCallImage,      // 38
   SystemPrioritySeparation,      // 39
   SystemNotImplemented10,      // 40
   SystemNotImplemented11,      // 41
   SystemInvalidInfoClass2,      // 42
   SystemInvalidInfoClass3,      // 43
   SystemTimeZoneInformation,      // 44
   SystemLookasideInformation,     // 45
   SystemSetTimeSlipEvent,      // 46
   SystemCreateSession,      // 47
   SystemDeleteSession,      // 48
   SystemInvalidInfoClass4,      // 49
   SystemRangeStartInformation,     // 50
   SystemVerifierInformation,      // 51
   SystemAddVerifier,      // 52
   SystemSessionProcessesInformation     // 53
} SYSTEM_INFORMATION_CLASS;

typedef struct _SYSTEM_THREAD_INFORMATION {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
LONG State;
LONG WaitReason;
} SYSTEM_THREAD_INFORMATION, * PSYSTEM_THREAD_INFORMATION;

typedef struct _SYSTEM_PROCESS_INFORMATION {
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_THREAD_INFORMATION Threads[1];
} SYSTEM_PROCESS_INFORMATION, * PSYSTEM_PROCESS_INFORMATION;

NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySystemInformation(
       IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
       OUT PVOID SystemInformation,
       IN ULONG SystemInformationLength,
       OUT PULONG ReturnLength OPTIONAL
);

void Ring0EnumProcess();

VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
printf("the driver is unload"); 
}

NTSTATUS DriverEntry(IN OUT PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING RegistryPath)
{
theDriverObject->DriverUnload = OnUnload;
Ring0EnumProcess();
return STATUS_SUCCESS;
}

void Ring0EnumProcess()
{
//初始化缓冲区大小 32kb
ULONG cbBuffer = 0x8000;

PVOID pBuffer = NULL;
NTSTATUS ntStatus;
PSYSTEM_PROCESS_INFORMATION pInfo;
do 
{ //分配内存缓冲区
   pBuffer = ExAllocatePool(NonPagedPool, cbBuffer);
   if (pBuffer == NULL)
   {
    KdPrint(("分配内存失败!"));
    return; 
   }
   ntStatus = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, pBuffer, cbBuffer, NULL);
   if (ntStatus == STATUS_INFO_LENGTH_MISMATCH) //如果缓冲区太小
   {
    ExFreePool(pBuffer); //释放缓冲区
    cbBuffer*=2;   //增加缓冲区到原来的2倍
   }
   else if (!NT_SUCCESS(ntStatus)) //如果获取信息不成功
   {
    ExFreePool(pBuffer);
    return;
   }


while(ntStatus == STATUS_INFO_LENGTH_MISMATCH);

pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuffer;
while(TRUE)
{
   LPWSTR pszProcessName = pInfo->ProcessName.Buffer;
   //如果获取映像名失败则返回空
   if (pszProcessName == NULL)
   {
    pszProcessName = L"NULL";
   }
   DbgPrint("pid %d ps %S\n", pInfo->ProcessId, pInfo->ProcessName.Buffer); //调试输出结果
   if (pInfo->NextEntryDelta == 0)
   {
    break; //没有后继了,退出链表循环.
   }
   pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo)+pInfo->NextEntryDelta);
  
}

ExFreePool(pBuffer); //释放分配的内存
return;
}

相关文章
|
25天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
1月前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
71 4
|
1月前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
1月前
|
算法 调度
探索操作系统的心脏:内核与进程管理
【10月更文挑战第25天】在数字世界的复杂迷宫中,操作系统扮演着关键角色,如同人体中的心脏,维持着整个系统的生命力。本文将深入浅出地剖析操作系统的核心组件——内核,以及它如何通过进程管理来协调资源的分配和使用。我们将从内核的概念出发,探讨它在操作系统中的地位和作用,进而深入了解进程管理的机制,包括进程调度、状态转换和同步。此外,文章还将展示一些简单的代码示例,帮助读者更好地理解这些抽象概念。让我们一起跟随这篇文章,揭开操作系统神秘的面纱,理解它如何支撑起我们日常的数字生活。
|
3月前
|
算法 调度 Python
探索操作系统的内核——一个简单的进程调度示例
【9月更文挑战第17天】在这篇文章中,我们将深入探讨操作系统的核心组件之一——进程调度。通过一个简化版的代码示例,我们将了解进程调度的基本概念、目的和实现方式。无论你是初学者还是有一定基础的学习者,这篇文章都将帮助你更好地理解操作系统中进程调度的原理和实践。
|
4月前
|
调度 虚拟化 容器
探索操作系统的心脏:内核与进程管理
【8月更文挑战第28天】在数字世界的复杂迷宫中,操作系统扮演着关键角色。它如同一座桥梁,连接硬件与软件,确保一切顺畅运行。本文将深入剖析操作系统的核心——内核和进程管理,揭示它们如何协同工作,保障系统的稳定与高效。通过简化的比喻,我们将一探究竟,了解操作系统背后的神秘面纱。
|
4月前
|
算法 安全 调度
揭秘操作系统的心脏:内核与进程管理
【8月更文挑战第27天】在数字世界的庞大机器中,操作系统扮演着至关重要的角色。本文将深入探讨操作系统的核心组件之一——内核,以及它是如何高效地管理和调度进程的。通过浅显易懂的语言和生动的比喻,我们将一起探索这一技术领域的奥秘,并了解其对整个计算生态的影响。无论你是技术新手还是资深爱好者,这篇文章都将为你打开一扇了解操作系统深层工作机制的大门。
|
4月前
|
存储 算法 调度
操作系统的心脏:内核与进程管理
【8月更文挑战第22天】本文将带你深入探索操作系统的核心——内核,以及它如何通过进程管理来维护系统的稳定运行。我们将从内核的基本概念出发,逐步揭示它在操作系统中的角色和功能,并探讨进程管理的重要性及其对系统性能的影响。文章将用通俗易懂的语言,深入浅出地分析内核与进程管理的相互作用,为你呈现一个清晰、条理化的操作系统内部世界。
|
3月前
crash —— 查看进程的内核栈的内容
crash —— 查看进程的内核栈的内容
|
4月前
|
算法 数据处理 调度
操作系统的心脏:内核与进程管理
【8月更文挑战第21天】 本文以浅显的语言和生动的比喻,探索操作系统内核的奥秘和进程管理的机制。我们将从内核的角色出发,了解它如何协调计算机硬件与软件的交互,并深入进程的世界,揭示它们是如何被创建、调度和同步的。文章通过日常生活中的比喻帮助读者构建对这一复杂主题的直观理解,同时提供实用的知识,让每位用户都能更好地理解自己的电脑是如何运作的。
45 0

相关实验场景

更多