【文章标题】: PS/2键盘输入安全攻击与防御
【文章作者】: Rex
【作者主页】: http://hi.baidu.com/elevin
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  自己学习的一些经验和笔记,有些内容是自己看源码和调试得到的。
  只是提供一些思路,没有贴代码,主要是代码比较杂,而且有些方法我自己也没有写代码测试,如有错误,还请包涵。
  
  1、ring3层的攻击与防御
  Windows窗口应用程序是基于消息驱动的,其中按键消息也是属于消息的范畴。Windows的用户态程序虽然是隔离的,但是各个进程之间可以进行hook。由以上两点我们可以知道,要获得另外一个windows应用程序的按键信息,之需要hook其进程,然后获取按键消息即可。在windows中键盘消息钩子就可以实现这样一个功能,当然还可以用其他的一些方法实现。
  要实现对ring3层输入的保护,在ring3层实现起来可能要麻烦一些,本人也不是很了解,而在ring0层实现的方式是很多的。
  
  2、新的键盘过滤驱动设备
  在没有安装其他键盘驱动设备的windows xp中,键盘输入设备栈由上倒下依次是Kbdclass创建的设备对象、i8042prt创建的设备对象和ACPI创建的设备对象。我们可以在设备栈栈顶创建自己的设备对象对键盘输入进行过滤,ring3层的应用程序在毫无知觉的情况下,它的按键信息被泄露了!
  其实这种方法也可以用来保护用户的ring3层应用程序输入,驱动把按键的信息直接发给应用程序而不是windows,那些企图使用消息的方式来截获按键信息的ring3层的恶意程序就什么都拿不到了。实际上,很多商业输入保护控件是使用这种方式对其按键输入进行保护的。
  对付这种攻击方式,我们只要检查一下设备栈,发现有可疑设备直接卸载其驱动,或者使用更加底层的实现方式使其无效。
  
  3、键盘类驱动
  我们可以替换掉键盘类驱动程序的分发函数,直接回调完成函数获取信息,也可以inline hook类驱动的数据拷贝函数和读取端口驱动数据的回调函数等。
  修改原有驱动内部实现存在一定风险,且操作起来很复杂,所以用这些方法来实现保护并无优势。
  上面的方法实现hook之后,我们可以使用对比正常函数地址的和检查函数开头字节的方法进行检测,或者使用更加底层的实现方式使其无效。
  
  4、端口驱动
  端口驱动其本身已经是直接操作硬件了,但我们可以动手的地方有一个类驱动于端口驱动中的回调函数。这个函数的地址可以被替换掉,这样,每次调用函数来读缓冲区数据的时候,我们的驱动就先得到了数据。
  这个方法用来实现保护还不错,类驱动(包括类驱动)以上的驱动可以得不到任何按键信息。
  我们可以检测回调函数的地址,或者使用更加底层的实现方式使其无效。
  
  5、IDT
  当键盘上一个键被按下或者弹起的时候,将触发一个中断,这个中断将定位到IDT的0x93号中断描述符。这个描述符中保存着中断例程的地址。这个终端例程是端口驱动的,负责从端口中读取信息到端口驱动缓冲区。如果我们替换掉这个中断例程的地址,那么我们的程序将在第一时间读i8042芯片端口获得按键扫描码。
  这种方法几乎使所有基于系统驱动的实现方式无效,听说腾讯原来就是用这个方法来保护QQ安全的,但是由于太过底层,在用户使用非PS/2键盘的时候容易出现问题,后来没用这个方法了。
  我们可以检查0x93的中断例程是否正常进行防御,或者使用更加底层的实现方式使其无效。
  
  6、IOAPIC
  在windows中,中断号是可以更改的,我们可以让键盘的中断号不是0x93。更改中断号之后,具体实现和上面的IDT方法差不多。
  用这个方法来保护还是很有新意,“看中了”0x93的驱动都会失效。
  我们可以检测IOAPIC的IRQ1是否是0x93,或者使用更加底层的实现方式使其无效。
  
  7、轮询
  轮询是一种古老的东西,一般都会避免使用轮询而用中断,但是,在安全攻击和保护中,可以恰当使用轮询。
  使用这种方式进行攻击,需要先关闭i8042芯片的中断,即当有按键被按下或者弹起的时候,只是往芯片的输出寄存器写数据,不触发中断。我们可以写一个驱动,以一个较高的频率读键盘缓冲区,若有数据,肯定是第一手获得的。我们可以自己处理数据,也可以暂时打开中断,把数据写回芯片,再关闭中断。
  使用这种方式进行防御使一个不错的选择,所有基于中断的驱动都无效了,而且它并没有对任何驱动做任何改动。
  对于这种攻击的防御方法就是检查芯片的中断是否开启。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2009年08月21日 上午 10:08:53