【内核篇】Windows内核重要变量

本文深入探讨了Windows NT内核中几个关键数据结构和系统服务的作用,包括驱动对象链表、进程链表、空闲进程、系统进程、SSDT表、Shadow SSDT表、关机回调链表、驱动二次初始化链表等,以及它们在系统中的角色与功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

======================================================

LIST_ENTRY PsLoadedModuleList;

[定  义] wrk\wrk-v1.2\base\ntos\mm\Sysload.c

[初始化] wrk\wrk-v1.2\base\ntos\mm\Sysload.c  [MiInitializeLoadedModuleList()]

[引  用]

l  NtQuerySystemInformation()             查询系统所有内核模块

l  MiReleaseAllMemory()                       释放所有内核模块

l  MiProcessLoaderEntry()                            从全局链表中插入或删除一个模块

[描  述]

内核加载的所有驱动对象链表。链表所连接结构为KLDR_DATA_TABLE_ENTRY。

使用NtQuerySystemInformation()查询系统模块信息和进程信息时内部就是在对这个链表进行遍历。

======================================================

LIST_ENTRY PsActiveProcessHead;

[定  义] wrk\wrk-v1.2\base\ntos\ps\Psinit.c

[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c  [PspInitPhase0()]

[引  用]

l  PsEnumProcesses()                     遍历所有进程

l  PsGetNextProcess()                     获取下一个进程

l  PspCreateProcess()               创建一个新进程插入到链表中

[描  述]

内核所有进程EPROCESS对象链表,所有获取进程列表的函数都是从这里出发遍历的。

该全局变量通过EPROCESS中的ActiveProcessLinks把所有进程链接在一起。

======================================================

PEPROCESS PsIdleProcess;

[定  义] wrk\wrk-v1.2\base\ntos\ps\Psinit.c

[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c  [PspInitPhase0()]

[引  用]

[描  述]

空闲进程的进程对象

======================================================

PEPROCESS PsInitialSystemProcess; //导出

[定  义] wrk\wrk-v1.2\base\ntos\ps\Psinit.c

[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c  [PspInitPhase0()]

[引  用]

[描  述]

系统进程(SYSTEM)的进程对象,被内核导出,驱动程序使用它可以遍历全局进程链表。

======================================================

KSERVICE_TABLE_DESCRIPTOR

KeServiceDescriptorTable[NUMBER_SERVICE_TABLES]; //导出

[定  义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c

[初始化] wrk\wrk-v1.2\base\ntos\ke\keinit.c  [KiSystemStartup ()]

[引  用]

l  KeInitThread()                                     线程初始化使用SSDT表

l  KeAddSystemServiceTable()                     增加系统调用表

[描  述]

著名的SSDT表,包含了Windows NT内核的基本系统服务,供Ring3调用。其中宏NUMBER_SERVICE_TABLES随不同系统不一样。WRK中定义为2。

======================================================

KSERVICE_TABLE_DESCRIPTOR

KeServiceDescriptorTableShadow [NUMBER_SERVICE_TABLES];

[定  义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c

[初始化] wrk\wrk-v1.2\base\ntos\ke\ keinit.c  [KiInitSystem ()]

[引  用]

l  KeAddSystemServiceTable()                     增加系统调用表

l  PsConvertToGuiThread()                    GUI线程使用Shadow表

l  NtQuerySystemInformation()             查询系统调用数量

[描  述]

著名的Shadow SSDT表,包含了Windows NT内核基本服务和Win32子系统内核的基本系统服务,供Ring3调用。其中宏NUMBER_SERVICE_TABLES随不同系统不一样。WRK中定义为2。

======================================================

LIST_ENTRY IopNotifyShutdownQueueHead;

[定  义] wrk\wrk-v1.2\base\ntos\io\iomgr\Iodata.c

[初始化] wrk\wrk-v1.2\base\ntos\io\iomgr\Ioinit.c  [IoInitSystem()]

[引  用]

l  IoRegisterShutdownNotification()           添加关机回调

l  IoUnregisterShutdownNotification()        删除关机回调

l  IoShutdownSystem()                                 遍历链表发送关机消息

[描  述]

关机回调驱动对象链表,使用IoRegisterShutdownNotification()注册的驱动会在这里。链表链接结构为:SHUTDOWN_PACKET

详情查看WRK源码中IoRegisterShutdownNotification()函数实现向该结构添加新的关机回调, IoUnregisterShutdownNotification从该结构中删除回调。在函数IoShutdownSystem()中会遍历这个链表,向它们分别发送IRP_MJ_SHUTDOWN消息。

======================================================

LIST_ENTRY IopNotifyLastChanceShutdownQueueHead;

[定  义] wrk\wrk-v1.2\base\ntos\io\iomgr\Iodata.c

[初始化] wrk\wrk-v1.2\base\ntos\io\iomgr\Ioinit.c  [IoInitSystem()]

[引  用]

l  IoRegisterLastChanceShutdownNotification()      添加关机回调

l  IoUnregisterShutdownNotification()                      删除关机回调

l  IoShutdownSystem()                                               遍历链表发送关机消息

[描  述]

关机回调驱动对象链表,使用IoRegisterLastChanceShutdownNotification()注册的驱动会在这里。链表链接结构为:SHUTDOWN_PACKET

注意和IoRegisterShutdownNotification()不同的是,这里从名字中可以看出LastChance——最后机会,WDK中给出了说明,这里注册的关机回调被调用时所有的文件系统已经关闭了,所以不能执行关于文件IO的相关操作。看WRK也可以印证这一点。

======================================================

LIST_ENTRY IopDriverReinitializeQueueHead;

[定  义] wrk\wrk-v1.2\base\ntos\io\iomgr\Iodata.c

[初始化] wrk\wrk-v1.2\base\ntos\io\iomgr\Ioinit.c  [IoInitSystem()]

[引  用]

l  IopCallDriverReinitializationRoutines()                  调用驱动二次初始化例程

l  IoRegisterDriverReinitialization()                           注册驱动为此初始化例程

[描  述]

驱动二次初始化链表头

======================================================

LIST_ENTRY IopBootDriverReinitializeQueueHead;

[定  义] wrk\wrk-v1.2\base\ntos\io\iomgr\Iodata.c

[初始化] wrk\wrk-v1.2\base\ntos\io\iomgr\Ioinit.c  [IoInitSystem()]

[引  用]

l  IopCallBootDriverReinitializationRoutines()   调用0级驱动二次初始化例程

l  IoRegisterBootDriverReinitialization()            注册0级驱动二次初始化例程

[描  述]

0级驱动二次初始化链表头

======================================================

EX_CALLBACK CmpCallBackVector [CM_MAX_CALLBACKS] = {0};

ULONG CmpCallBackCount = 0;

[定  义] wrk\wrk-v1.2\base\ntos\config\Cmhook.c

[初始化] wrk\wrk-v1.2\base\ntos\config\Cmhook.c  [CmpInitCallback()]

[引  用]

l  CmRegisterCallback                            注册注册表回调

l  CmUnRegisterCallback                       撤销注册表回调

l  CmpCallCallBacks                               调用注册表回调

[描  述]

XP系统上用于保存所有注册表回调的数据结构。驱动程序使用CmRegisterCallback注册的回调函数就保存在这里。通过对该数据结构进行处理将可以增加和删除注册表回调。注意,从Vista开始使用CM_CALLBACK_CONTEXT_BLOCKEX结构,使用CallbackListHead全局变量来保存节点。

======================================================

EX_CALLBACK

PspCreateProcessNotifyRoutine[PSP_MAX_CREATE_PROCESS_NOTIFY];

ULONG PspCreateProcessNotifyRoutineCount;

[定  义] wrk\wrk-v1.2\base\ntos\ps\psp.h

[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c  [PspInitPhase0()]

[引  用]

l  PspCreateThread                                创建第一个线程时调用回调函数

l  PsSetCreateProcessNotifyRoutine     添加或删除进程创建/退出回调

l  PspExitProcess                                    进程退出调用回调函数

[描  述]

驱动程序使用PsSetCreateProcessNotifyRoutine添加和删除进程创建/退出回调函数,用于对进程诞生和消亡事件进行捕获。其添加的回调函数保存在这个全局数组中,WRK中宏PSP_MAX_CREATE_PROCESS_NOTIFY定义为8,最多支持8个回调。

======================================================

EX_CALLBACK

PspCreateThreadNotifyRoutine [PSP_MAX_CREATE_THREAD_NOTIFY];

ULONG PspCreateThreadNotifyRoutineCount;

[定  义] wrk\wrk-v1.2\base\ntos\ps\psp.h

[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c  [PspInitPhase0()]

[引  用]

l  PspCreateThread                                       线程创建时调用回调函数

l  PsSetCreateThreadNotifyRoutine             添加线程创建/退出回调

l  PsRemoveCreateThreadNotifyRoutine     移除线程创建/退出回调

l  PspExitThread                                            线程退出时调用回调函数

[描  述]

驱动程序使用PsSetCreateThreadNotifyRoutine添加和使用PsRemoveCreateThreadNotifyRoutine删除线程创建/退出回调函数,用于对线程诞生和消亡事件进行捕获。其添加的回调函数保存在这个全局数组中,WRK中宏PSP_MAX_CREATE_THREAD_NOTIFY定义为8,最多支持8个回调。

======================================================

EX_CALLBACK

PspLoadImageNotifyRoutine [PSP_MAX_LOAD_IMAGE_NOTIFY];

ULONG PspLoadImageNotifyRoutineCount;

[定  义] wrk\wrk-v1.2\base\ntos\ps\psp.h

[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c  [PspInitPhase0()]

[引  用]

l  PsSetLoadImageNotifyRoutine                 添加模块加载回调

l  PsRemoveLoadImageNotifyRoutine        移除模块加载回调

l  PsCallImageNotifyRoutines                      调用所有模块加载回调

[描  述]

驱动程序使用PsSetLoadImageNotifyRoutine添加和使用PsRemoveLoadImageNotifyRoutine删除模块加载回调函数,用于对模块加载事件进行捕获。其添加的回调函数保存在这个全局数组中,WRK中宏PSP_MAX_LOAD_IMAGE_NOTIFY定义为8,最多支持8个回调。

======================================================

PHANDLE_TABLE PspCidTable;

[定  义] wrk\wrk-v1.2\base\ntos\ps\ Psinit.c

[初始化] wrk\wrk-v1.2\base\ntos\ps\Psinit.c  [PspInitPhase0()]

[引  用]

l  PspCreateThread()                              创建线程插入全局句柄表

l  PspCreateProcess()                             创建进程插入全局句柄表

l  PsLookupThreadByThreadId       ()            查找线程内核对象ETHREAD

l  PsLookupProcessByProcessId()         查找进程内核对象EPROCESS

l  PsLookupProcessThreadByCid()        根据ID同时查进程和线程

l  PspProcessDelete()                                   删除一个进程

l  PspThreadDelete()                              删除一个线程

[描  述]

全局进程内核对象句柄表。PspCidTable是一个句柄表,其格式与普通的句柄表是完全一样的.但它与每个进程私有的句柄表有以下不同: 
1.PspCidTable中存放的对象是系统中所有的进线程对象指针,其索引就是PID和CID 
2.PspCidTable中存放是对象体(指向EPROCESS和ETHREAD),而每个进程私有的句柄表则存放的是对象头(OBJECT_HEADER) 
3.PspCidTable是一个独立的句柄表,而每个进程私有的句柄表以一个双链连接起来

======================================================

LIST_ENTRY HandleTableListHead;

[定  义] wrk\wrk-v1.2\base\ntos\ex\Handle.c

[初始化] wrk\wrk-v1.2\base\ntos\ex\Handle.c  [ExInitializeHandleTablePackage ()]

[引  用]

l  ExCreateHandleTable()                       创建进程时调用创建句柄表链入全局链表头

l  ExDupHandleTable()

l  ExSnapShotHandleTables()

 [描  述]

系统所有进程的句柄表构成一个链表,链表节点为HANDLE_TABLE,而上面的PspCidTable是个例外。

======================================================

PHANDLE_OBJECT ObpKernelHandleTable;

[定  义] wrk\wrk-v1.2\base\ntos\ob\obp.h

[初始化] wrk\wrk-v1.2\base\ntos\ob\obinit.c  [ObInitSystem ()]

[引  用]

l  ObpCloseHandle()                              关闭句柄(内核句柄)

l  ObpCreateHandle()                                   创建句柄(内核句柄)

l  ObpCreateUnnamedHandle()            创建匿名句柄(内核句柄)

l  ObSetHandleAttributes()                   设置句柄属性(内核句柄)

l  ObReferenceObjectByHandle()          通过句柄引用对象(内核句柄)

[描  述]

系统进程System的句柄表,也是内核全局句柄表。内核驱动程序所打开的句柄都存储在这里。内核句柄最高位为1。

======================================================

CCHAR KeNumberProcessors; //导出

[定  义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c

[初始化] wrk\wrk-v1.2\base\ntos\ke\newsysbg.c  [KiSystemStartup ()]

[引  用]

[描  述]

处理器数量

======================================================

PKPRCB KiProcessorBlock[MAXIMUM_PROCESSORS];

[定  义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c

[初始化] wrk\wrk-v1.2\base\ntos\ex\obinit.c  [KiSystemStartup ()]

[引  用]

l  KiSwapThread()                                   线程调度

l  KiSetAffinityThread()                          设置线程亲和性

[描  述]

系统核心数据结构,与线程调度密切相关。所有KPRCB的指针数组,往前拨偏移可以得到对应KPCR。MAXIMUM_PROCESSORS定义为32。而实际数组的元素个数由上面KeNumberProcessors决定,每个处理器对应一个KPRCB结构体。

======================================================

ULONG_PTR KiSystemSharedData =KI_USER_SHARED_DATA;

[定  义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c

[初始化] wrk\wrk-v1.2\base\ntos\ke\ kernldat.c

[引  用]

[描  述]

常量指针,指向Ring0与Ring3共享的一个页面地址,宏KI_USER_SHARED_DATA定义为:0xFFDF0000,即内核态地址,用户态地址为:0x7FFE0000。该页面存储的数据结构是:KUSER_SHARED_DATA。

======================================================

PVOID KeUserExceptionDispatcher;

[定  义] wrk\wrk-v1.2\base\ntos\ke\kernldat.c

[初始化] wrk\wrk-v1.2\base\ntos\ps\kulookup.c  [PspLookupKernelUserEntryPoints ()]

[引  用]

l  KiDispatchException()                        异常分发

[描  述]

函数指针,指向了用户模式异常处理入口:位于ntdll.dll中的KiUserExceptionDispatcher函数。用于系统在进行异常分发过程中向用户态分发异常。

 

 

To be update…

 

轩辕之风http://www.cnblogs.com/xuanyuan/

转载于:https://www.cnblogs.com/xuanyuan/p/4165232.html

易语言辅助必备驱动保护模块 代码公开 透明 绝无暗装之类 ------------------------------ .版本 2 .子程序 关闭保护辅助进程, 逻辑型, 公开, 取消禁止结束并保护程序 .参数 进程ID, 整数型, 可空, 可空,默认取消自身,可用的进程_名取ID()获取进程ID, .子程序 关闭防各类调试, 逻辑型, 公开, 取消结束并保护程序 .参数 进程ID, 整数型, 可空, 可空,默认取消自身,可用的进程_名取ID()获取进程ID, .子程序 开启保护辅助进程, 逻辑型, 公开, 可禁止他人有意结束某程序,并保护程序不被注入,打开程序,支持所有系统,32,WIN764位都可以 .参数 进程ID, 整数型, 可空, 可空,默认保护自身,可用的进程_名取ID()获取进程ID, .子程序 开启防各类调试, 逻辑型, 公开, 可禁止他人有意,用CE,VE,ME,GE,内存工具和WPE等程序,打开程序,支持所有系统,32,WIN764位都可以 .参数 进程ID, 整数型, 可空, 可空,默认保护自身,可用的进程_名取ID()获取进程ID, .子程序 隐藏模块, 逻辑型, 公开, 隐藏模块 (GetModuleHandle (“隐藏.dll”)) .参数 模块基地址, 整数型 .子程序 郁金香取消隐藏进程, 逻辑型, 公开, 取消隐藏进程 暂时无法取消隐藏 .参数 进程ID, 整数型, 可空, 可空,默认取消自身,可用进程_名取ID()获取进程ID, .子程序 郁金香隐藏进程, 逻辑型, 公开, 隐藏进程,,支持32位,和64位WIn7,所有系统请自行测试 .参数 进程ID, 整数型, 可空, 可空,默认隐藏自身,可用进程_名取ID()获取进程ID, .子程序 置格盘陷阱, 逻辑型, 公开 .子程序 置蓝屏陷阱, 逻辑型, 公开, 利用蓝屏代码 绝对值蓝屏 .子程序 置死机陷阱, 逻辑型, 公开 .子程序 置重启陷阱, 逻辑型, 公开, 绝对值重启 .DLL命令 GetModuleHandle, 整数型, "kernel32", "GetModuleHandleA", 公开 .参数 lpModuleName, 文本型 .DLL命令 RtlMoveMemory, 整数型, , "RtlMoveMemory", 公开, _写内存3 .参数 dest, 整数型, 传址 .参数 Source, 整数型 .参数 len, 整数型, , 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值