【原创】QQ,挂你没商量(2)
QQ,挂你没商量(2)
声明:
本文不是教你如何盗QQ的,取这个题目无非是为了吸引人们的眼球,大家都来看看罢了(QQ的影响力很高,不是吗?)。
上次挂的是虚拟设备,这次真的要挂KeyBoard了。本文假设你看了《QQ,挂你没商量》。
本文纯属本人主观臆断,如有误导还请见谅。当我笔记了。
这里假设你已经知道设备挂接是怎么一回事了,无非是驱动的分层设计。代码还是NT式驱动,还有一个作即插即用的WDM就不说了。要学会,关键是理解IRP。
我们先猜想一下键盘是如何工作的(为什么是“猜想”?嗯,我老是在臆断,因为我什么都不知道)。你按下键盘,就会产生一个硬件中断,这个中断例程会通过各种手段向键盘驱动发送IRP(我们的message),键盘驱动处理IRP并结束IRP。应用程序得到按键。

那我们又要拦截IRP了。这时有人说了,“这个我会,因为我看了《QQ,挂你没商量》,就是下图那个样子”

“可是......可是那个IRP我们要怎么处理啊?KeyBoardDriver还没有加工IRP,我们怎么用啊?”。嗯,是啊,我想说IRP被结束后是要反回给I/O管理器的,这样应用程序才能得到处理结果(就是那个IRP->AssociatedIrp.SystemBuffer)。我们只要得到KeyBoardDevice处理后的IRP->AssociatedIrp.SystemBuffer就好啦。这时又有人说了“啊?可我们的HookDevice在KeyBoardDevice的上面。HookDevice先得到IRP,我们又怎么得到KeyBoardDriver处理的IRP呢?”。靠!你能问这种问题就说明你有了解IRP了,这又说明你控制IRP的能力将有质的飞越。好吧,我只能告诉你“该看看完成例程了”。我不想重复教科书上的东西(因为我看教科书从没考过高分,~~~~(>_<)~~~~ ),大家自己找一下资料(关于驱动分层设计,完成例程的),我略说一下自己的知道的得了。

IRP完成后,一层层堆栈向上弹出,如果遇到IO_STACK_LOCATION的CompletionRoutine非空,就调用这个函数。
好吧,我们说我们自己的程序,我们要捕捉的IRP是IRP_MJ_READ,因为我们敲击键盘时,键盘驱动会收到这个IRP。我们要在每个IRP_MJ_READ的IRP设置一个完成例程,这样每一次击键动作都会在IRP回滚时执行我们完成例程。那完成例程做些什么呢?这里我只打印了扫描码,别的没做,有心人就做自己想做的事吧。
http://g.zhubajie.com/urllink.php?id=8326585vig3zaga3mz5hcqq
