内核层 进程列举 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;
}

相关文章
|
1月前
|
算法 调度 Python
探索操作系统的内核——一个简单的进程调度示例
【9月更文挑战第17天】在这篇文章中,我们将深入探讨操作系统的核心组件之一——进程调度。通过一个简化版的代码示例,我们将了解进程调度的基本概念、目的和实现方式。无论你是初学者还是有一定基础的学习者,这篇文章都将帮助你更好地理解操作系统中进程调度的原理和实践。
|
2月前
|
调度 虚拟化 容器
探索操作系统的心脏:内核与进程管理
【8月更文挑战第28天】在数字世界的复杂迷宫中,操作系统扮演着关键角色。它如同一座桥梁,连接硬件与软件,确保一切顺畅运行。本文将深入剖析操作系统的核心——内核和进程管理,揭示它们如何协同工作,保障系统的稳定与高效。通过简化的比喻,我们将一探究竟,了解操作系统背后的神秘面纱。
|
2月前
|
算法 安全 调度
揭秘操作系统的心脏:内核与进程管理
【8月更文挑战第27天】在数字世界的庞大机器中,操作系统扮演着至关重要的角色。本文将深入探讨操作系统的核心组件之一——内核,以及它是如何高效地管理和调度进程的。通过浅显易懂的语言和生动的比喻,我们将一起探索这一技术领域的奥秘,并了解其对整个计算生态的影响。无论你是技术新手还是资深爱好者,这篇文章都将为你打开一扇了解操作系统深层工作机制的大门。
|
2月前
|
存储 算法 调度
操作系统的心脏:内核与进程管理
【8月更文挑战第22天】本文将带你深入探索操作系统的核心——内核,以及它如何通过进程管理来维护系统的稳定运行。我们将从内核的基本概念出发,逐步揭示它在操作系统中的角色和功能,并探讨进程管理的重要性及其对系统性能的影响。文章将用通俗易懂的语言,深入浅出地分析内核与进程管理的相互作用,为你呈现一个清晰、条理化的操作系统内部世界。
|
2月前
|
算法 调度 UED
操作系统的心脏:内核与进程管理
在数字世界的宏伟建筑中,操作系统是那支撑起一切软件运行的基石。本文将深入浅出地探讨操作系统的核心—内核,以及它如何通过进程管理来协调计算机资源的使用。我们将从内核的定义和功能出发,逐步深入到进程的生命周期,以及调度算法的重要性,最终揭示这些机制如何影响我们日常使用的电子设备性能。
38 2
|
1月前
crash —— 查看进程的内核栈的内容
crash —— 查看进程的内核栈的内容
|
2月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
|
2月前
|
算法 数据处理 调度
操作系统的心脏:内核与进程管理
【8月更文挑战第21天】 本文以浅显的语言和生动的比喻,探索操作系统内核的奥秘和进程管理的机制。我们将从内核的角色出发,了解它如何协调计算机硬件与软件的交互,并深入进程的世界,揭示它们是如何被创建、调度和同步的。文章通过日常生活中的比喻帮助读者构建对这一复杂主题的直观理解,同时提供实用的知识,让每位用户都能更好地理解自己的电脑是如何运作的。
34 0
|
2月前
|
安全 调度 数据安全/隐私保护
探索操作系统的心脏:内核与进程管理
在数字世界的宏伟建筑中,操作系统扮演着基石的角色,而内核则是这座建筑的核心。本文将深入浅出地介绍操作系统内核的概念、功能及其在进程管理中的关键作用。我们将从内核的职责出发,逐步揭示它是如何协调和管理计算机系统中的资源,保证多任务环境下的高效运行。通过本文,你将了解内核的神秘面纱,并掌握进程管理的基本知识,为深入理解操作系统打下坚实的基础。
36 0
|
5月前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【5月更文挑战第29天】 在现代操作系统中,尤其是类Unix系统如Linux中,进程调度机制是保证多任务高效运行的核心。本文将深入探讨Linux操作系统内核的进程调度器——负责管理CPU资源分配的关键组件。我们会详细分析其调度策略、调度器的演进及其在多核处理器环境下的表现。通过剖析进程调度器的工作原理和设计哲学,旨在为读者提供一个清晰的视角来理解这一复杂的系统功能。
238 0

相关实验场景

更多