驱动开发:内核取ntoskrnl模块基地址

article/2025/8/29 23:22:05

模块是程序加载时被动态装载的,模块在装载后其存在于内存中同样存在一个内存基址,当我们需要操作这个模块时,通常第一步就是要得到该模块的内存基址,模块分为用户模块和内核模块,这里的用户模块指的是应用层进程运行后加载的模块,内核模块指的是内核中特定模块地址,本篇文章将实现一个获取驱动ntoskrnl.exe的基地址以及长度,此功能是驱动开发中尤其是安全软件开发中必不可少的一个功能。

关于该程序的解释,官方的解析是这样的ntoskrnl.exeWindows操作系统的一个重要内核程序,里面存储了大量的二进制内核代码,用于调度系统时使用,也是操作系统启动后第一个被加载的程序,通常该进程在任务管理器中显示为System

使用ARK工具也可看出其代表的是第一个驱动模块。

那么如何使用代码得到如上图中所展示的基地址以及大小呢,实现此功能我们需要调用ZwQuerySystemInformation这个API函数,这与上一篇文章《驱动开发:判断自身是否加载成功》所使用的NtQuerySystemInformation只是开头部分不同,但其本质上是不同的,如下是一些参考资料;

  • 从内核模式调用NtZw系列API,其最终都会连接到nooskrnl.lib导出库:

    • Nt系列API将直接调用对应的函数代码,而Zw系列API则通过调用KiSystemService最终跳转到对应的函数代码。
    • 重要的是两种不同的调用对内核中previous mode的改变,如果是从用户模式调用Native APIprevious mode是用户态,如果从内核模式调用Native APIprevious mode是内核态。
    • 如果previous为用户态时Native API将对传递的参数进行严格的检查,而为内核态时则不会检查。

调用Nt API时不会改变previous mode的状态,调用Zw API时会将previous mode改为内核态,因此在进行Kernel Mode Driver开发时可以使用Zw系列API可以避免额外的参数列表检查,提高效率。Zw*会设置KernelMode已避免检查,Nt*不会自动设置,如果是KernelMode当然没问题,如果就UserMode就挂了。

回到代码上来,下方代码就是获取ntoskrnl.exe基地址以及长度的具体实现,核心代码就是调用ZwQuerySystemInformation得到SystemModuleInformation,里面的对比部分是在比较当前获取的地址是否超出了ntoskrnl的最大和最小范围。

#include <ntifs.h>static PVOID g_KernelBase = 0;
static ULONG g_KernelSize = 0;#pragma pack(4)
typedef struct _PEB32
{UCHAR InheritedAddressSpace;UCHAR ReadImageFileExecOptions;UCHAR BeingDebugged;UCHAR BitField;ULONG Mutant;ULONG ImageBaseAddress;ULONG Ldr;ULONG ProcessParameters;ULONG SubSystemData;ULONG ProcessHeap;ULONG FastPebLock;ULONG AtlThunkSListPtr;ULONG IFEOKey;ULONG CrossProcessFlags;ULONG UserSharedInfoPtr;ULONG SystemReserved;ULONG AtlThunkSListPtr32;ULONG ApiSetMap;
} PEB32, *PPEB32;typedef struct _PEB_LDR_DATA32
{ULONG Length;UCHAR Initialized;ULONG SsHandle;LIST_ENTRY32 InLoadOrderModuleList;LIST_ENTRY32 InMemoryOrderModuleList;LIST_ENTRY32 InInitializationOrderModuleList;
} PEB_LDR_DATA32, *PPEB_LDR_DATA32;typedef struct _LDR_DATA_TABLE_ENTRY32
{LIST_ENTRY32 InLoadOrderLinks;LIST_ENTRY32 InMemoryOrderLinks;LIST_ENTRY32 InInitializationOrderLinks;ULONG DllBase;ULONG EntryPoint;ULONG SizeOfImage;UNICODE_STRING32 FullDllName;UNICODE_STRING32 BaseDllName;ULONG Flags;USHORT LoadCount;USHORT TlsIndex;LIST_ENTRY32 HashLinks;ULONG TimeDateStamp;
} LDR_DATA_TABLE_ENTRY32, *PLDR_DATA_TABLE_ENTRY32;
#pragma pack()typedef struct _RTL_PROCESS_MODULE_INFORMATION
{HANDLE Section;PVOID MappedBase;PVOID ImageBase;ULONG ImageSize;ULONG Flags;USHORT LoadOrderIndex;USHORT InitOrderIndex;USHORT LoadCount;USHORT OffsetToFileName;UCHAR  FullPathName[256];
} RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION;typedef struct _RTL_PROCESS_MODULES
{ULONG NumberOfModules;RTL_PROCESS_MODULE_INFORMATION Modules[1];
} RTL_PROCESS_MODULES, *PRTL_PROCESS_MODULES;typedef enum _SYSTEM_INFORMATION_CLASS
{SystemModuleInformation = 0xb,
} SYSTEM_INFORMATION_CLASS;// 取出KernelBase基地址
// By: lyshark.com
PVOID UtilKernelBase(OUT PULONG pSize)
{NTSTATUS status = STATUS_SUCCESS;ULONG bytes = 0;PRTL_PROCESS_MODULES pMods = 0;PVOID checkPtr = 0;UNICODE_STRING routineName;if (g_KernelBase != 0){if (pSize)*pSize = g_KernelSize;return g_KernelBase;}RtlInitUnicodeString(&routineName, L"NtOpenFile");checkPtr = MmGetSystemRoutineAddress(&routineName);if (checkPtr == 0)return 0;__try{status = ZwQuerySystemInformation(SystemModuleInformation, 0, bytes, &bytes);if (bytes == 0){DbgPrint("Invalid SystemModuleInformation size\n");return 0;}pMods = (PRTL_PROCESS_MODULES)ExAllocatePoolWithTag(NonPagedPoolNx, bytes, "lyshark");RtlZeroMemory(pMods, bytes);status = ZwQuerySystemInformation(SystemModuleInformation, pMods, bytes, &bytes);if (NT_SUCCESS(status)){PRTL_PROCESS_MODULE_INFORMATION pMod = pMods->Modules;for (ULONG i = 0; i < pMods->NumberOfModules; i++){if (checkPtr >= pMod[i].ImageBase &&checkPtr < (PVOID)((PUCHAR)pMod[i].ImageBase + pMod[i].ImageSize)){g_KernelBase = pMod[i].ImageBase;g_KernelSize = pMod[i].ImageSize;if (pSize)*pSize = g_KernelSize;break;}}}}__except (EXCEPTION_EXECUTE_HANDLER){return 0;}if (pMods)ExFreePoolWithTag(pMods, "lyshark");return g_KernelBase;
}VOID UnDriver(PDRIVER_OBJECT driver)
{DbgPrint(("Uninstall Driver Is OK \n"));
}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{DbgPrint(("hello lyshark \n"));PULONG ulong = 0;UtilKernelBase(ulong);DbgPrint("ntoskrnl.exe 模块基址: 0x%p \n", g_KernelBase);DbgPrint("模块大小: 0x%p \n", g_KernelSize);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

我们编译并运行上方代码,效果如下:


参考文献:

https://blog.csdn.net/u012410612/article/details/17096597


http://chatgpt.dhexx.cn/article/02BGOCUm.shtml

相关文章

解决由于ntoskrnl.exe导致的蓝屏

文章目录 1. 复现问题2. 分析问题3. 解决问题4. 备注 1. 复现问题 之前电脑总是出现蓝屏&#xff0c;如下所示&#xff1a; 起初并没有放在心上&#xff0c;因为重启之后就正常了&#xff0c;但在某天又蓝屏了&#xff0c;如下所示&#xff1a; 在工作的过程中蓝屏很让人心烦&…

system占用cpu解决(ntoskrnl.exe)

今天打开电脑发现system占cpu特别多 百度好多资料后解决步骤如下&#xff1a; 因为system是系统程序 里面有好多线程都有可能占用 所以不能确定是哪个线程占用的cpu procexp可以分析是哪个线程 下载地址 http://www.crsky.com/soft/1074.html 打开后双击system 点线程 可…

解决由于ntoskrnl.exe导致的蓝屏(Win10)

注&#xff1a;本文章中的方法并未解决我自己的这个问题&#xff0c;但是也算是一个思路&#xff0c;大家可以参考一下。 2019.09.25 虚拟机中的 Win10 又出现了这个问题&#xff1a; ------------------------------------------------ 在2018.10.30的那天又蓝屏了&#xff…

grafana导出和导入dashboard

除了从官网获取一些dashboard&#xff0c;在日常使用中&#xff0c;如果看到其他人自己创建的dashboard很符合自己的需求&#xff0c;我们也可以直接导出到我们自己的环境使用。 1 导出 在你需要导出的dashboard最上方&#xff0c;点击分享的图标&#xff0c;然后点击export&…

EasyExcel的简单导出

EasyExcel的简单导出 Controller层代码 GetMapping("/download") public void download(String name, HttpServletResponse response) {fileManager.download(name, response); }Service处理代码 public void download(String name, HttpServletResponse response…

DbVisualizer 导出大数据

工具: DbVisualizer Pro 10.0.20 、OS: Windows 10、导出目标&#xff1a;Excel2007(.xlsx)最大支持1048576行、更新时间&#xff1a;2021/1/6 1.执行一个sql查询&#xff0c;使用工具Export导出 2.在导出页面&#xff0c;选择xls&#xff0c;一直选next直到Export&#xff08…

mysql数据库导出

进入数据库服务器linux操作界面2.导出数据库表结构&#xff08;不包含数据&#xff09; 导库语句&#xff1a; mysqldump -h localhost -uroot -ppassword1# -d atsdb > /data/atsdb_20220908_test.sql 参数解释&#xff1a; -h localhost 表示安装在本地的mysql数据…

ARCGIS地图导出问题

ARCGIS地图导出问题 问题来喽&#xff01;我们如何做一幅信息齐全的地图并且将其导出呢&#xff1f; 图1-1标准地图样式 首先&#xff0c;我们需要做出一张漂亮的地图 &#xff01; 第一步&#xff1a;添加数据。如图2-1&#xff0c;点击布局&#xff0c;添加数据&#xff…

mysql 导出表数据

mysql怎么导出表 Mysql导出表方法如下&#xff0c;可用第三方工具NavicatforMysql。 1、登录到指定的Mysql数据库。 2、在指定的数据库下找到“表”&#xff0c;然后在右侧找到要导出的表名。 3、在表名处点击鼠标右键&#xff0c;选择“导出向导”。 4、选择要导出的格式&…

数据导出流程设计

1. 需求描述 数据导出成excel、csv等格式文件是一个非常常见的需求&#xff0c;普通的导出可能是直接请求后端接口获取数据然后生成对应的文件并执行下载&#xff0c;这种导出方式会存在很多问题&#xff0c;因此根据公司系统的导出总结一下新的导出流程。 2. 技术方案 流程图…

文件导出与下载(Excel,Zip)等几种方式

文件下载的几种办法&#xff1a; 1、导出数据为某种格式 ​ 这种的话常见的也就是导出为excel格式&#xff0c;个人通常有两种解决办法&#xff1a; a. 先创建文件&#xff0c;把数据写入文件中去&#xff0c;当然文件也是保存在电脑某个地方的&#xff0c;再读取该文件&…

java导出excel的两种方式

博主简介&#xff1a;原互联网大厂tencent员工&#xff0c;网安巨头Venustech员工&#xff0c;阿里云开发社区专家博主&#xff0c;微信公众号java基础笔记优质创作者&#xff0c;csdn优质创作博主&#xff0c;创业者&#xff0c;知识共享者,欢迎关注&#xff0c;点赞&#xff…

数据的导出方法

实现页面数据的导出 怎样实现网页数据的导出到本地&#xff0c;这里实现的是以Excel表格的格式导入到本地. 比如这样的个表格我怎样实现把数据导出放到一个到Excel表格中保存到本地&#xff0c; 从下面划红线部分可以看出这里的数据是通过三个下拉框的查询条件得到的数据&…

Pr 入门系列之十四:导出

视频工作流程中的最后一步就是导出。 Pr 中&#xff0c;可以方便地导出序列或剪辑&#xff0c;发送给他人&#xff0c;分享到社交媒体渠道&#xff0c;或者创建 DCP&#xff08;数字电影包&#xff09;文件用于影院分发。 ◆ ◆ ◆ 导出的一般流程 1、首先&#xff0c;在时间…

正态分布

正态分布 我们来对某一个年级做一项调查&#xff0c;看一看这个年级到底有多巨。于是&#xff0c;他们统计了每个同学一周刷题的时间。得到的结果如下&#xff1a; 可以看出&#xff0c;大多数人每周都有7-8个小时做题&#xff0c;有少部分蒟蒻(比如我)每周只有1-3个小时做题&…

广义pareto分布_帕累托分布广义帕累托分布

PDF、PMF、CDF 1. 概念解释 PDF:概率密度函数(probability density function), 在数学中,连续型随机变量的概率密度函数(在不至于混淆时可以简称为密度函数)是一个描述这个随机变量的输出值,在某个确定的取值点附近的可能性的函数。 PMF:概率质量函数(probability mass fun…

离散均匀分布

离散均匀分布 n 个值中的每一个具有相等的概率 1/ n 截图来源&#xff1a;Discrete Uniform Distribution 例子&#xff1a; 投掷一个骰子6个值中每个值出现的概率为 1 / 6 1/6 1/6 投掷两个骰子出现的两值之和&#xff0c;结果分布不再均匀&#xff0c;因为并非所有和的概率都…

平均分布

转载请注明出处&#xff1a;http://blog.csdn.net/liu_sn/article/details/79333368 今天遇到本很好玩的书&#xff0c;《世界是随机的:大数据时代的概率统计学》&#xff0c;在讲分布的时候作者说&#xff1a;概率分布就是概率论中的小九九。很有意思&#xff0c;看了之后确实…

边缘分布

什么是边缘分布函数&#xff0c;有那些性质 设 F ( x , y ) F(x,y) F(x,y)为随机变量 ( X , Y ) (X,Y) (X,Y)的分布函数&#xff0c;则 F ( x , y ) P { X ≤ x , Y ≤ y } F(x,y)P\{X \le x,Y \le y\} F(x,y)P{X≤x,Y≤y} 令 y → ∞ y \rightarrow \infty y→∞&#xff…

度分布的概念及形状

一、度分布的概念 把网络中节点的度按从小到大排序&#xff0c;从而统计得到度为k的节点占整个网络节点数的比例怕p k _k k​。例如下图&#xff1a; 从概率统计的角度看&#xff0c;p k _k k​也可以视为网络中一个随机选择的节点的度为k的概率&#xff0c;这就是度分布的概…