<读书笔记>Windows内核安全 —— 第四章 键盘的过滤
2014-03-25 23:25
417 查看
本章讲了几种过滤键盘的方法,说实话越往后越深,写的很全,后面我没看懂,下面是我看懂的部分记录了下来。
文章开头讲了几个知识点:
1) 符号链接,用一个不同的明智代表一个设备对象,上层可以通过该名称访问相应的设备对象。
2) ZwCreateFile,在内核中用于打开文件(设备对象)的函数,是应用层的Createfile在内核层的实现
3) PDO(物理设备对象, physical device object),PDO是设备占最下面的设备对象,所以相比较于PDO和FDO(function device object),PDO肯定是处于FDO的下方,可以认为PDO是物理设备在系统中的对应对象
4) 函数IoGetAttachDevice可以获得一个设备所在设备栈最顶端的那个对象
这些知识点在文中都有使用,而且在编写驱动的过程中也是经常需要使用的。
本文讲了这样一句话,感觉很正确,过滤与反过滤的过程中,关键在于“谁将第一个得到信息”,所以我们要分析键盘的整体结构来一步一步考虑该如果在对应的位置去过滤该设备。如下图所示键盘的整体架构:
可以看出可以再图中红色区域添加过滤驱动程序,分别对应类驱动的上层过滤、类驱动的下层过滤、端口驱动的上层过滤、端口驱动的下层过滤。所以最开始的例子就讲述如何在对应的位置绑定过滤设备的。
其流程如下:
1) 调用函数ObReferenceObjectByName通过驱动名(KdbClass)获取对象指针
2) 通过该对象指针获取设备链中的第一个设备
3) 创建与该设备对象类型一样的过滤设备
4) 调用函数IoAttachDeviceToDeviceStack将过滤设备绑定到原始的设备对象上,生成新的设备对象
5) 继续枚举设备链中的下一个设备。
OK,绑定完过滤驱动之后,按照串口过滤驱动的处理方式,在相应的读写例程中就可以处理键盘的相关信息了。
以上将的方法都是可以让人很容易理解的,后面书中又介绍了HOOK的方式来过滤键盘设备,所谓的HOOK简单来说就是找到待HOOK的函数指针,将我们自己的函数指针替换上去,达到获取数据的目的。
1) 将对应类驱动对象的分发函数指针进行置换,调用函数InterLockedExchangePointer
2) Hook端口完成上层输入的回调函数,也可以处理响应的过滤信息
该函数指针的位置信息:1)存在于i8042prt的设备扩展中; 2)开始地址在kbclass中; 3)kbclass生成的一个设备对象也保存在设备扩展中,且在要找的函数之前
3) 通过获取IDT(中断描述符),替换0x93的中断处理函数
IDT(中断描述符)用于存放每个中断号对应的中断处理函数地址。在多核CPU上,每一个核心都有自己的IDT。
4) 利用IOAPIC重定位中断处理函数
IOAPIC是用于多个核心CPU的信息中断控制器。通过IOAPIC可以将IRQ的处理对应到CPU的某个核心上。所以通过修改IOAPIC可以修改IRQ1对应的中断号,这样可以 达到过滤的功能。
操作IOAPIC寄存器的方法:
(1)IOREGSEL(I/O寄存器选择寄存器)
在Windows下可以通过物理地址0xfec00000直接访问,可读写,其中只有低8位有效,其它位被保护,它的作用是选择一个要操作的IOAPIC寄存器。
(2)IOWIN(I/O窗口寄存器)
在Windows下对应的物理地址是0Xfec00010,作用是读/写由IOREGSEL指定的IOAPIC寄存器。
相当于IOREGSEL用来设置地址,IOWIN用于读写数据。
回头看一下这次写的东西,感觉很乱很乱,刚开始写读书笔记,希望见谅。
文章开头讲了几个知识点:
1) 符号链接,用一个不同的明智代表一个设备对象,上层可以通过该名称访问相应的设备对象。
2) ZwCreateFile,在内核中用于打开文件(设备对象)的函数,是应用层的Createfile在内核层的实现
3) PDO(物理设备对象, physical device object),PDO是设备占最下面的设备对象,所以相比较于PDO和FDO(function device object),PDO肯定是处于FDO的下方,可以认为PDO是物理设备在系统中的对应对象
4) 函数IoGetAttachDevice可以获得一个设备所在设备栈最顶端的那个对象
这些知识点在文中都有使用,而且在编写驱动的过程中也是经常需要使用的。
本文讲了这样一句话,感觉很正确,过滤与反过滤的过程中,关键在于“谁将第一个得到信息”,所以我们要分析键盘的整体结构来一步一步考虑该如果在对应的位置去过滤该设备。如下图所示键盘的整体架构:
可以看出可以再图中红色区域添加过滤驱动程序,分别对应类驱动的上层过滤、类驱动的下层过滤、端口驱动的上层过滤、端口驱动的下层过滤。所以最开始的例子就讲述如何在对应的位置绑定过滤设备的。
其流程如下:
1) 调用函数ObReferenceObjectByName通过驱动名(KdbClass)获取对象指针
2) 通过该对象指针获取设备链中的第一个设备
3) 创建与该设备对象类型一样的过滤设备
4) 调用函数IoAttachDeviceToDeviceStack将过滤设备绑定到原始的设备对象上,生成新的设备对象
5) 继续枚举设备链中的下一个设备。
OK,绑定完过滤驱动之后,按照串口过滤驱动的处理方式,在相应的读写例程中就可以处理键盘的相关信息了。
以上将的方法都是可以让人很容易理解的,后面书中又介绍了HOOK的方式来过滤键盘设备,所谓的HOOK简单来说就是找到待HOOK的函数指针,将我们自己的函数指针替换上去,达到获取数据的目的。
1) 将对应类驱动对象的分发函数指针进行置换,调用函数InterLockedExchangePointer
2) Hook端口完成上层输入的回调函数,也可以处理响应的过滤信息
该函数指针的位置信息:1)存在于i8042prt的设备扩展中; 2)开始地址在kbclass中; 3)kbclass生成的一个设备对象也保存在设备扩展中,且在要找的函数之前
3) 通过获取IDT(中断描述符),替换0x93的中断处理函数
IDT(中断描述符)用于存放每个中断号对应的中断处理函数地址。在多核CPU上,每一个核心都有自己的IDT。
4) 利用IOAPIC重定位中断处理函数
IOAPIC是用于多个核心CPU的信息中断控制器。通过IOAPIC可以将IRQ的处理对应到CPU的某个核心上。所以通过修改IOAPIC可以修改IRQ1对应的中断号,这样可以 达到过滤的功能。
操作IOAPIC寄存器的方法:
(1)IOREGSEL(I/O寄存器选择寄存器)
在Windows下可以通过物理地址0xfec00000直接访问,可读写,其中只有低8位有效,其它位被保护,它的作用是选择一个要操作的IOAPIC寄存器。
(2)IOWIN(I/O窗口寄存器)
在Windows下对应的物理地址是0Xfec00010,作用是读/写由IOREGSEL指定的IOAPIC寄存器。
相当于IOREGSEL用来设置地址,IOWIN用于读写数据。
回头看一下这次写的东西,感觉很乱很乱,刚开始写读书笔记,希望见谅。
相关文章推荐
- <读书笔记>Windows内核安全 ---串口过滤驱动(3) 相关知识总结
- <寒江独钓>Windows内核安全编程__键盘过滤之内核级Hook(一)
- <读书笔记>Windows内核安全 ---- 串口过滤(2)
- <读书笔记> windows内核安全 --- 串口过滤(1)
- <寒江独钓>Windows内核安全编程__键盘过滤之内核级Hook(二)
- <寒江独钓>Windows内核安全编程__一个简单的Windows串口过滤驱动程序的开发
- <读书笔记>Windows内核安全——第六章 磁盘过滤
- <寒江独钓>Windows内核安全编程__具有还原功能的磁盘卷过滤驱动
- <寒江独钓>Windows内核安全编程__传统键盘过滤程序
- <读书笔记>Windows内核安全——第五章磁盘的虚拟
- 对<<寒江独钓---Windows内核安全编程>>中第3章<<串口过滤>>的改进
- <寒江独钓>Windows内核安全编程__Ramdisk源码解读
- 无法编译出.sys文件 寒江孤钓<<windows 内核安全编程>> 学习笔记
- <<C++Primer PLus 第五版>>读书笔记3
- <读书笔记>Javascript系列之6种继承(面向对象)
- <图形图像,动画,多媒体> 读书笔记 --- 录制与编辑视频
- <<High Performance JavaScript>>读书笔记-10.Tools
- <人性的弱点>读书笔记
- <Effective C++>读书笔记-7
- <版本控制>Windows下搭建VisualSVN服务端与客户端