- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进 程 管 理 器
设 置 管 理 器
本 地 过 程 调 用
Configuratio n manager
Local process call
Plug and Play manager
Security reference monitor
Memory manager
Process manager
Object manager
添加串口(Serial Port),串口使用为\\.\pipe\com_1 选择为This end is the server和The other end is a virtul machine 在XP的启动引导文件boot.ini中添加 multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional (Debug Mode)" /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200
Explorer User application Subsystem DLLs
POSIX Windows DLLs
NTDLL.DLL User Mode Ring 3 Ring 0 System Service Dispatcher(系统服务) (Kernel mode callable interfaces)(执行体API)
Task Manager
Service control manager
Local Security Authority Winlogon Wininit Windows DLLs
Environment Subsystem
Windows
Services
Service host Print spooler Windows DLLs
用户层
驱动开发环境的搭建 Visual Studio + Windows Driver Kit + Windbg + VMware
VS作为IDE是默认作为应用层的开发环境,默认使用的是SDK, 所以使用VS作为驱动开发的IDE需要进行环境上的设置。
WDK相对于Win32的SDK而言,前者用于内核层开发,后者用于 用户层开发,两者有相当一部分内容是不可以共用的,而且即使存在 相同的函数,其函数的参数也是不一样的。 在Win32开发中,我们使用VS写代码和调试代码,而在驱动开发 中,VS仅仅用作写代码和静态查错,写完代码后使用WDK进行编译 和连接。 由于不像Win32中的程序相互之间是独立的,拥有各自的虚拟地 址空间和资源,一个程序出错不会影响到其他正在运行的程序,而在 内核中所有的地址空间和资源完全是共用的,一旦有一个内核文件出 错,那必定会导致操作系统的蓝屏。 所以我们在驱动开发中,对于驱动的调试和加载不在本机上实现,而 是在虚拟机中实现,调试驱动是用Windbg通过串口连接到虚拟机对 虚拟机上运行的整个系统作为一个程序进行调试。
3、驱动中的链表操作 (1)new和delete的重载 (2)使用自定义结构体 (3)WDK提供的结构体List_Entry
Part 1 基础知识
System Processes
Session manager Local session manager
Windows操作系统架构
Applications
typedef struct _KSERVICE_TABLE_DESCRIPTOR { PULONG_PTR Base;//SSDT的基地址 PULONG Count;//SSDT每个服务被调用的次数,一个指向数组的指针 ULONG Limit;//服务函数的个数 PUCHAR Number;//指向一个记录每个服务所需传递参数长度的数组的指针 } KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;
Part 2 从最简单的驱动开始
1、最简单的驱动HelloWorld (1)编写最简单的驱动 (2)添加默认派遣例程 (3)为驱动添加设备和卸载设备 2、驱动的加载与启动 (1)使用工具 (2)命令行 (3)注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services (4)自己编写Win32驱动加载程序LoadSys.exe
3、SSDT (1)读取SSDT中当前函数地址 (2)读出函数原地址 (3)突破Blue Screen,取消Windows内核只读保护,修改SSDT表。 (4)JMP 0xE9 Inline Hook初试 4、C还是C++? (1)函数调用约定__stdcall __cdecl (2)C和C++编译 (3)运行时函数Run Time Function
高级: 入口点:DriverEntry 设置校验和:是(/RELEASE) 基址:0x10000 随机基址:默认值 数据执行保护(DEP):默认值 命令行: 附加选项:/SECTION:INIT,D/IGNORE:4198,4010,4037, 4039,4065,4070,4078,4087,4089,4221 Vmware设置
I/O manager 缓 存 Device and 管 file system 理 器 drivers Windows USER, GDI Graphics drivers
Kernel Mode
System Threads
对 象 管 理 器
插 即 用 管 理 器即
全 引 用 监 视安
内 存 管 理 器
VS中的环境设置(以VS2008为例) 添加配置Driver VC++目录中 包含文件: D:\WinDDK\7600.16385.1\inc\api D:\WinDDK\7600.16385.1\inc\crt D:\WinDDK\7600.16385.1\inc\ddk 库文件: D:\WinDDK\7600.16385.1\lib\win7\i386 属性管理器 C/C++ 常规: 调试信息格式:C7兼容 警告等级:3级 将警告视为错误:是 优化: 优化:禁用 预处理器: 预处理器定义:WIN32=100;_X86_=1;WINVER=0x501;DBG=1 代码生成: 运行时库:多线程/多线程调试 缓冲区安全检查:否
高级: 调用约定:__stdcall 编译为:默认值 链接器: 常规: 输出文件:$(OutDir)\$(ProjectName).sys 启用增量连接:否 忽略导入库:是 附加库目录:D:\WinDDK\7600.16385.1\lib\win7\i386 输入: 附加依赖项:ntoskrnl.lib Hal.lib wdm.lib wdmsec.lib wmilib.lib ndis.lib MSVCRT.LIB LIBCMT.LIB 忽略所有默认库:是 清单文件: 启用用户账户控制(UAC):否 调试: 生成调试信息:是 生成映射文件:是 映射文件名:$(TargetDir)$(TargetName).map 系统: 子系统:本机(/SUBSYSTEM:NATIVE) 堆栈保留大小:262144 堆栈提交大小:4096 驱动程序:驱动程序(/DRIVER)
Part 3 派遣函数与内存管理
1、应用程序.exe与驱动.sys的通信 (1)IRP (I/O Request Package) (2)缓冲模式 (3)直接模式 (4)其他模式 (5)SSDT Hook进程保护的实现 2、内存管理 (1)物理内存、虚拟内存 (2)Ring3地址,Ring0地址 (3)内存管理API
Cache manager
Micro-Kernel(微内核) Hardware abstraction layer (HAL)硬件抽象层
OpenProcess调用过程
OpenProcess Kernel32.OpenProcess Ntdll.NtOpenProcess
Ntdll.KiFastSystemCall Sysenter中断 内核层 SSDT (System Service Descriptor Table) Ntoskrnl.NtOpenPr的 API 在这个系统服务描 述表(SSDT)中都存在一个与之相对应的服务,当我 们的应用程序调用 ntdll.dll 中的 API 时,最终会调 用内核中与之相对应的系统服务。 由于有了 SSDT,我们只需要告诉内核需要调 用的服务所在 SSDT 中的索引就 可以了,然后内 核根据这个索引值就可以在 SSDT 中找到相对应的 服务了,然后再由内核调用服务完成应用程序 API 的调用请求即可。
System Services Descriptor Table 系统服务描述符表
这个表将用户层的Win32 API和内核层的API连接起来。SSDT的全部 内容通过内核全局变量KeServiceDescriptorTable来完成。
在Windows Research Kit中的关于KeServiceDescriptorTable的定义。 \Windows Research Kernel\WRK-v1.2\base\ntos\inc\ke.h
在Windbg中的Symbol Search Path中添加 srv*D:\WinDDK\symbols*/download/symbols 建立Windbg的快捷方式,属性中目标为 D:\WinDDK\7600.16385.1\Debuggers\windbg.exe -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,reconnect -y
Windows内核 和驱动进程保护
By Dream_Sky12
Part 1 基础知识 1、Windows操作系统架构,以OpenProcess为例介绍函数在整个操作系统的 调用过程。 2、驱动开发环境的搭建(Visual Studio+WDK+Windbg+VMware) 3、初步了解SSDT(System Services Descriptor Table系统服务描述符表) 4、makefile,sources文件
索引0 服务0 索引1 服务1 索引2 服务2 …… …… 索引n 服务n
使用Windbg来查看SSDT表 kd> dd KeServiceDescriptorTable 8055d700 80505480 00000000 0000011c 805058f4 8055d710 00000000 00000000 00000000 00000000 8055d720 00000000 00000000 00000000 00000000 8055d730 00000000 00000000 00000000 00000000 8055d740 00000002 00002710 bf80c331 00000000 8055d750 ba5a5a80 b9797b60 897dd0f0 806f80c0 8055d760 00000000 00000000 0a0f7e2c 00000000 8055d770 aa5133ec 01cd2d10 00000000 00000000 可以看出SSDT首地址是0x80505480 kd> dd 80505480 80505480 805a5630 805f240e 805f5c44 805f2440 80505490 805f5c7e 805f2476 805f5cc2 805f5d06 805054a0 80616cee 80617a30 805ed80c 805ed464 805054b0 805d5b7e 805d5b2e 80617314 805b6fb6 805054c0 80616930 805a9aba 805b15ca b135a610 805054d0 8050289c 80617a22 80577b0a 80539c30 805054e0 8060fefe 805bd530 805f617e 80624cc0 805054f0 805fa692 805a5d1e 80624f14 805a55d0 0x805a5630为第一个服务函数的地址