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,挂你没商量
- 作 者:uniking
- 时 间:2010-02-23 20:14:51
- 链 接:http://bbs.pediy.com/showthread.php?t=107662