QQ,挂你没商量

----------------------------------------------------------------------------------------

声明:

      本文不是教你如何盗QQ的,取这个题目无非是为了吸引人们的眼球,大家都来看看罢了(QQ的影响力很高,不是吗?)。

      本文的目的就是教大家如何挂接设备。常常有人说某某大虾的键盘过滤驱动..........,在这里我不想挂接任何实体设备(????,因为我也不懂)。出于便于理解的目的,我将自己创建一个设备并挂接它。这里假设读者有最基本的驱动知识,本文没有什么实质性人内容,有问题google一下吧。(嗯,我也刚刚学。也不会说什么“专业术语”,高人就乐呵乐呵得了)。

-----------------------------------------------------------------------------------------

《Win32汇编教程》中有一个键盘钩子,可以记录用户敲击键盘的动作,心想这要在后台记录QQ密码,那那.......,嘿嘿,真是不亦乐乎!于是,打开QQ.......


靠!现在只能挂账号不能挂密码,QQ是有防范了。那回想当年,键盘钩子还不为人所知时,有多少QQ用户受害啊!(当年?我还没见过computer呢,嗯)。故事到这里好像停止了,因为我没有挂到QQ。

嗯,那我们拉出终极武器吧,当当当当......键盘过滤器。

看到密码写得是什么了吧,没错,就是91234

也许你是现在来了兴致(如果你没有那我就当你有,O(∩_∩)O),好现在我就教你如何挂接设备,我要发功了,接好啊!

                                             正文

      过滤驱动就用来挂到接某设备的,那它的原理是什么呢?嗯,这个很不好说啊^_^,不过这个原理你是知道的,只你没有发现罢了。人们都用以知的事物来记未知的事物,好,那Windows的消息机制你该知道吧(不知道?! 我倒),比如你用鼠标点击按钮,文本框,窗体之类的东西都会产生相应的message(诶,你为什么要用英文呢? 嗯,就是为了与中文不同,这不还醒目吗)。你写的应用程序就是要“拦截”这些message再加以处理。那过滤驱动就是要拦截一个叫作IRP的东西,它可以看作是ring3到ring0的message。

      马哥的《城里城外看SSDT》真是经典,我也借用一下。Ring3的应用程序受到诸多限制(当然这不是Windows可以管的,CPU就那样),到Ring0层才可以使用各各管态指令。那用户是如何将文件保存在硬盘上的呢?马哥说内核调用都必须穿过SSDT这道城墙,那从驱动来看,从Ring3到Ring0是需要一个信使的。

      我们要在IRP到达device前拦截并处理,对于NT式驱动,仅仅需要一个函数就可以了IoAttachDevice,这个函数将一个设备附加到另一个设备上。我们可以拿一个驱动模板在创建设备后使用这个函数,就形成了下图
 
     靠!就这么简单。对,挂接一个设备就是这么简单!你看看图,HookDevice与device之间我用的是虚线,为什么?当然是有原因的。刚才我们只是随便找来个驱动模板,加了一个IoAttachDevice,一般的驱动模板都会将IRP终止,即HookDevice不会将IRP发给device,这就产生了IRP的断流。我们想让IRP穿过HookDevice到达device。

那就用IoSkipCurrentIrpStackLocation和IoCallDriver好了。 

我一直说“挂接设备”,没说“挂接驱动”。因为在Ring3层,只知Device而不知Driver,知道Device也只不过是它的影子罢了(符号链接)。那Ring3发送的IRP只是针对设备的,而我们要拦击IRP,所以我说是“挂接设备”。我只有XP,所以.....大家可以参照原代码体会一下,被挂接设备是用汇编写的,挂接设备是用C写的。不是出于什么目的,刚开始是用汇编,可写到挂接设备老出问题,所以改为C了,这样也好,突出了本文最重,只有三个函数。

      本文纯属小人愚见,如有误导,尽请见谅。有人会觉得这“很黑,很暴力”,这就没人管了吗!不是的,你可以看一下device的设备对象,它有一个指向HookDevice设备对象的指针。我们只需查一下挂接该设备的附加设备是否属于常规设备不就行了,这是杀软的问题了。

最后看看效果吧
 
挂接后(将IRP1替换成了IRP2)

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