******************************************************* *标题:【原创】逆向BackInC驱动,实现虚拟键鼠模拟 * *作者:踏雪流云 * *日期:2011年3月6号 * *声明:本文章的目的仅为技术交流讨论 * ******************************************************* 由于最近在做应用层程序开发,已经好几个月没搞逆向了,感觉有些生疏了,这样不好,于是便有了这篇文章;花了一周时间来分析,希望能给我等菜鸟一点帮助。 第一次逆向驱动,有什么不对的地方还望指正。 BackInC是一个想搞游戏外挂的朋友发给我的,BackInC.sys驱动实现了驱动级的键鼠模拟,NT式的,可动态卸载。为什么我会对这个技术这么感兴趣呢?这可以追溯到本人在上大学三年级时,做的一个叫做“手控鼠标”的项目。原理很简单:首先,摄像头采集到用户做出的不同手势动作;然后,进行手势识别(图像处理+BP神经网络);最后,将其转换为控制系统的不同动作,以达到操控windows的目的。因此,需要实现驱动级键鼠模拟(由于需要使用3D游戏来演示效果,因此应用层API就不太靠谱),当时的做法是将DDK Sample下的kbfiltr和moufiltr直接改造来实现的,但是这个是wdm的,感觉很不爽…… 本文只是分享和探讨技术,希望BackInC作者见谅! 闲话说了不少,下面言归正传。 以键盘为例:KbdClass.sys是键盘的类驱动,无论是USB键盘,还是PS/2键盘都要经过它的处理;在键盘类驱动之下,和实际硬件打交道的驱动叫做“端口驱动”,比如:i8042prt.sys是ps/2键盘的端口驱动,Kbdhid.sys是USB键盘的端口驱动。 端口驱动与类驱动之间的协助机制: 键盘中断导致键盘中断服务例程被执行,导致最终i8042prt的I8042KeyboardInterruptService被执行。 在I8042KeyboardInterruptService中,从端口读取扫描码,放到一个KEYBOARD_INPUT_DATA结构中。并把这个结构放到i8042prt的输入队列中。最后会调用内核api函数KeInsertQueueDpc。 在这个调用中会调用上层KbdClass.sys中处理输入的回调函数KeyboardClassServiceCallback,取走i8042prt的输入数据队列里的数据。 因此,主动调用KeyboardClassServiceCallback就可以实现虚拟键盘模拟;Hook KeyboardClassServiceCallback当然就可以实现键盘记录了(kbdclass驱动是在I8042prt和kbdhid这两个驱动之上的,因此键盘记录能对PS/2和USB键盘同时生效)。 本文的重点来了,如何定位KeyboardClassServiceCallback的地址和kbdclass的DeviceObject指针呢? 代码如下:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课