【内核篇】Windows内核重要变量
======================================================
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/
【内核篇】Windows内核重要变量的更多相关文章
- Linux 内核和 Windows 内核有什么区别?
Windows 和 Linux 可以说是我们比较常见的两款操作系统的. Windows 基本占领了电脑时代的市场,商业上取得了很大成就,但是它并不开源,所以要想接触源码得加入 Windows 的开发团 ...
- windows内核基础与异常处理
前两日碰到了用异常处理来做加密的re题目 所以系统学习一下windows内核相关 windows内核基础 权限级别 内核层:R0 零环 核心态工作区域 大多数驱动程序 应用层:R3 用户态工作区域 只 ...
- Windows内核原理系列01 - 基本概念
1.Windows API Windows 应用编程接口(API)是针对WIndwos操作系统用户模式的系统编程接口,包含在WindwosSDK中. 2.关于.NET .NET由一个被称为FCL的类库 ...
- [5]windows内核情景分析---进程线程
本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName, ...
- [4]Windows内核情景分析---内核对象
写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...
- 【windwos 操作系统】关键的Windows内核数据结构一览(上)
文章作者:r00tk1t 发布时间:2018年01月08日 - 21时56分 最后更新:2020年10月20日 - 21时01分 原始链接:https://r00tk1ts.github.io/201 ...
- 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)
原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...
- Windows内核 基本数据结构
驱动对象: 每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的.驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并 ...
- Windows内核 基本汇编指令
1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...
- Windows内核安全与驱动开发
这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...
随机推荐
- NodeJS+Express下构建后端MVC文件结构
关于MVC的结构大体上有两种方式,其一按照层级进行文件夹分类,其二是按照业务进行文件夹分类.关于这个demo相关的业务简单,所以暂采用第一种的方式,当然实际当中很恨复杂的项目可以采用两种方式相结合的方 ...
- sql跨库查询
---------------------------------------------------------------------------------- --1. 创建链接服务器 --1. ...
- PHP多条件查询 (租房查询)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Linux学习记录
---恢复内容开始--- linux与unix的关系 linux是借鉴了unix设计思想,也称linux位类unix系统. Linux常用命令 1.命令基本格式 命令[选项][参数] 注意:个别命令不 ...
- ios常用的第三方库
ios开发中有可能用到的第三方库进行记录一下: 注:资料信息来源于网络 自己整理 https://developer.apple.com/reference(苹果官方文档) https://gith ...
- history命令详解
Linux下history命令用法 ^_^在项目中希望调用history命令来获取用户的历史记录,方便分析,可是我们平时所见到的history结果是下面这样: # history | head -10 ...
- vmware下centos7桥接模式无法上网
前一段时间由于想给vm中的centos分配一个独立的IP,就将网络适配器的连接方式由NAT改为桥接,一切顺利. 今天再次开机,IP居然变成了192开头的局域网,并且ping不通外网,经过查找资料,解决 ...
- TFS API:一、TFS 体系结构和概念
TFS API:一.TFS 体系结构和概念 TFS是Team Fundation Server的简称,是微软VSTS的一部分,它是Microsoft应用程序生命周期管理(ALM)工具的核心协作平台, ...
- CENTOS7 mysql 安装
CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 $ wget http://repo.mysql.com ...
- java十进制转十六进制
package com.ds.detect; import java.util.Scanner; public class ToHEX{ public static void main(String[ ...