Windows驱动开发学习笔记(三)—— 内核空间&内核模块

  • 内核空间
    • 实验
      • 第一步:编译如下代码
      • 第二步:将 .sys 文件拷贝到虚拟机中
      • 第三步:部署 .sys 文件并运行
      • 第四步:创建一个任意进程
      • 第五步:在 WinDbg 中查看新进程的高2G内存
  • 内核模块
  • 驱动对象
    • DRIVER_OBJECT
    • LDR_DATA_TABLE_ENTRY
    • 实验
      • 第一步:编译如下代码
      • 第二步:将 .sys 文件拷贝到虚拟机中
      • 第三步:部署 .sys 文件并运行
      • 第四步:在 WinDbg 中查看驱动对象
      • 第五步:通过双向链表查看其它模块的信息
  • 总结

内核空间

描述:两个进程在低2G内存空间中所对应的物理页是不同的,但是在高2G内存空间中所对应的物理页几乎是相同的(所有的进程共享同一个内核空间)

实验

第一步:编译如下代码

#include "ntddk.h"//卸载函数
VOID DriverUnload(PDRIVER_OBJECT driver)
{DbgPrint("驱动程序已停止.\r\n");
}ULONG x = 0x12345678;//驱动程序入口函数,相当于控制台的main函数
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{DbgPrint("驱动程序已运行.\r\n");DbgPrint("%x . \r\n", &x);//设置一个卸载函数  便于退出DriverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}

第二步:将 .sys 文件拷贝到虚拟机中

第三步:部署 .sys 文件并运行

第四步:创建一个任意进程

本实验采用飞鸽传书(ipmsg.exe

第五步:在 WinDbg 中查看新进程的高2G内存

内核模块

描述

  1. 硬件的种类繁多,不可能做一个兼容所有硬件的内核,因此,微软提供规定的接口格式,让硬件驱动人员按照规定的格式编写“驱动程序
  2. 这些驱动程序每一个都是一个模块,称为“内核模块”,可以加载到内核中,并遵守PE结构。但本质上讲,任意一个.sys文件与内核文件没有区别
  3. 不管是我们自己编写的 .sys 文件,还是 Windows 自带的内核文件(如 ntoskrnl.exe),它们在内核中的地位是相同的,都是内核模块中的其中一个

驱动对象

DRIVER_OBJECT

在WinDbg中查看

DriverStart:驱动模块在内核中的地址
DriverSize:驱动模块在内核中的大小
DriverName:驱动模块在内核中的名字
DriverSection:指向 _LDR_DATA_TABLE_ENTRY 结构体

LDR_DATA_TABLE_ENTRY

描述:包含了当前内核模块的具体信息,以及其它内核模块的双向链表

在WinDbg中查看

InLoadOrderLinks:双向链表,包含所有内核模块
DllBase:当前内核模块起始地址
SizeOfImage:当前内核模块的大小
FullDllName:当前内核模块的完整路径
BaseDllName:当前内核模块的模块名

实验

第一步:编译如下代码

#include "ntddk.h"//卸载函数
VOID DriverUnload(PDRIVER_OBJECT driver)
{DbgPrint("驱动程序已停止.\r\n");
}//驱动程序入口函数,相当于控制台的main函数
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{DbgPrint("驱动程序已运行.\r\n");DbgPrint("%x . \r\n", DriverObject);//设置一个卸载函数  便于退出DriverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}

第二步:将 .sys 文件拷贝到虚拟机中

第三步:部署 .sys 文件并运行

第四步:在 WinDbg 中查看驱动对象

第五步:通过双向链表查看其它模块的信息

注意:遇到NULL则跳过

直到找到一个有效的内核模块

总结

  1. 内核空间中,每个进程低2G各不相同,高2G相同,在高2G中做任何事情影响的是所有进程
  2. 在高2G中,并不是只有一个内核模块为所有进程提供服务,而是由许多个模块组成,每个模块在高2G中都有属于自己独立的内存地址和大小
  3. 若想了解每个内核模块的具体信息,可以通过 _DRIVER_OBJECT 这个结构体,它存储了当前内核模块的具体信息
  4. 任意加载一个驱动,便可通过 _LDR_DATA_TABLE_ENTRY 这个结构体中的双向链表得到所有内核模块的信息

Windows驱动开发学习笔记(三)—— 内核空间内核模块相关推荐

  1. Windows驱动开发学习笔记(七)—— 多核同步内核重载

    Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...

  2. Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础

    Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...

  3. Windows驱动开发学习笔记(五)—— SSDT HOOK

    Windows驱动开发学习笔记(五)-- SSDT HOOK 系统服务表 系统服务描述符表 实验一:通过代码获取SSDT表地址 通过页表基址修改页属性 方法1:修改页属性 方法2:修改CR0寄存器 实 ...

  4. Windows驱动开发学习笔记(六)—— Inline HOOK

    Windows驱动开发学习笔记(六)-- Inline HOOK SSDT HOOK Inline Hook 挂钩 执行流程 脱钩 实验一:3环 Inline Hook 实验二:0环 Inline H ...

  5. Windows驱动开发学习笔记(四)—— 3环与0环通信(常规方式)

    Windows驱动开发学习笔记(四)-- 3环与0环通信(常规方式) 设备对象 创建设备对象 设置数据交互方式 创建符号链接 IRP与派遣函数 IRP的类型 其它类型的IRP 派遣函数 派遣函数注册位 ...

  6. Windows驱动开发学习笔记(一)—— 环境配置第一个驱动程序

    Windows驱动开发学习笔记(一)-- 环境配置&第一个驱动程序 环境配置 第一个驱动程序 环境配置 安装VS2010:https://pan.baidu.com/s/1uZWWxCtB60 ...

  7. Android深度探索(卷1)HAL与驱动开发学习笔记(8)

    Android深度探索(卷1)HAL与驱动开发学习笔记(8) 第八章 蜂鸣器驱动   L i n u x驱动的代码重用有很多种方法.可以采用标准C程序的方式.将要重用的代码放在其他的文件(在头文件中声 ...

  8. Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作

    Polyworks脚本开发学习笔记(三)-TREEVIEW进阶操作 移动/交换对象的顺序 移动对象的顺序 TREEVIEW FEATURE MOVE ( 1,2 ) 将索引号为1和2的特征交换位置 T ...

  9. windows驱动开发学习

    序言]  很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资 料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从 事驱动开发时间不长也不短, ...

最新文章

  1. Spring Session使用
  2. 本题要求实现函数输出n行数字金字塔。_练习5-3 数字金字塔 (15分)
  3. 普通树与二叉树的相互转化及哈夫曼树的了解
  4. linux u盘 uid pid,linux下的pid文件的作用
  5. 在Ubuntu上安装使用深度影音深度音乐
  6. mysql递归查询树,帮你突破瓶颈
  7. 使用Log Parase 结合 Log Parase Studio 查询IIS日志
  8. Must Know Tips/tricks in DNN
  9. WPFAvalonDock基本用法
  10. Oracle数据库进行简单优化,Oracle数据库性能优化
  11. 计算题合集-管理经济学
  12. 解决dll load failed while importing qtgui
  13. c语言网页版在线编译器_梦幻西游网页版在线玩 梦幻西游网页版礼包兑换码_梦幻西游网页版...
  14. centos 7 parity 安装方法
  15. 论文笔记:图像分割——ExFuse DFN
  16. 【高通SDM660平台 Android 10.0】(21) --- 高通Camera persist使用手册
  17. 面向对象的C++了解
  18. 软件工程McCabe环路复杂度计算,自环情况详解。
  19. 看恐怖片可能会让你变胖:吃掉更多的爆米花和巧克力
  20. Windows下strongswan-5.5.3源码安装

热门文章

  1. NLP:LSTM之父眼中的深度学习十年简史《The 2010s: Our Decade of Deep Learning / Outlook on the 2020s》的参考文献
  2. CV:基于人工智能算法实现人脸口罩的实时检测(结合无人机可,实现实时警告提醒)
  3. Py之torchvision:torchvision库的简介、安装、使用方法之详细攻略
  4. Interview:算法岗位面试—10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法、回归算法、聚类算法等细节考察
  5. Python语言学习之字母G开头函数使用集锦:global用法之详细攻略
  6. Py之reprint:reprint的简介、安装、使用方法之详细攻略
  7. CV之CycleGAN:CycleGAN算法相关思路配图、论文集合
  8. Py之matplotlib:matplotlib绘图自定义函数总结
  9. TensorFlowIO操作(一)----线程和队列
  10. Linux设置SSH登录(SecureCrt)