首页 > 编程知识 正文

软件测试搜索框测试点,gitlab钩子程序编写

时间:2023-05-05 11:20:13 阅读:114456 作者:1530

(本文最初发表在《电脑编程技巧与维护》杂志上) ) )。

另一方面,引言Windows系统是通过事件驱动机制构建的,其中每个事件都是消息,每个运行中的程序(所谓的进程)维护一个或多个消息队列,消息队列的数量是进程该进程至少需要一个线程,因此该进程至少需要一个消息队列。 Windows系统上的消息派单以线程为单位,但不是所有线程都有消息队列。 新创建的线程没有消息队列。 只有当线程第一次调用GDI或USER32库函数时,Windows才会为线程创建消息队列。 消息最终在属于线程的窗口中处理,普通APP应用程序只能检索自身线程的消息队列中的消息,也就是属于系统分配的自身线程的消息。 换句话说,一个线程不知道在运行过程中其他线程发生了什么。 但是,有一个特殊程序可以访问其他线程的消息队列。 那就是挂钩程序。

编写挂接程序是Windows系统为用户提供的介入Windows运行进程的机制,通过挂接程序,Windows向用户公开内部流动的消息,用户访问窗口管理器例如,在调试调试器时跟踪消息进程。 但凡事都有两面性,有些密码窃取工具就是利用系统的键盘钩子拦截其他程序的键盘消息,获取用户输入的密码,非法的钩子程序会导致计算机信息安全本文针对挂接程序安装和运行的特点,设计了一种检测系统中安装挂接程序的方案,开发了检测挂接程序的开源软件AntiHook。

二.吊钩检查原理

在分析挂钩检测原理之前,必须了解挂钩程序。 Windows系统上的挂接程序根据作用范围,包括只能检索本进程中某个线程消息的本地挂接Thread Local Hook,以及可以检索当前系统中所有线程消息的全局挂接Global Hook 本地挂接可以位于与线程相关的exe可执行文件或dll动态链接库中。 全局挂接只能以由全局挂接加载方法决定的dll动态链接库的形式使用。 详细情况将在后面叙述。 挂接程序根据定义方式和实现目的可以分为键盘挂接、鼠标挂接、系统外壳挂接、消息过滤挂接等类型,研究MSDN中有关SetWindowsHookEx ()函数的说明

对于本地挂接,可以访问的消息仅限于该进程中的消息队列,并且必须指定在安装挂接时剪切哪个线程的消息。 对应的全局挂接没有范围限制,可以从整个桌面环境中的所有线程截获邮件。 用于窃取密码的键盘钩子通常将自己安装为全局钩子。 要安装本地和全局挂接,请使用相同的API函数: SetWindowsHookEx (),但只是传递的参数不同,关于该API函数的使用并不是本文的重点,因此在此有详细说明对挂接程序感兴趣的人请参阅MSDN和其他相关文档。

一般来说,APP应用程序安装的本地线程挂接不会影响其他程序,但危害最大的是全局挂接。 由于只有全局挂接才能“染指”其他程序的消息队列,因此系统安全检查也是以检测全局挂接为主要目的。 全局挂接检测的原理其实也非常简单,这是由Windows操作系统加载全局挂接的方式决定的,所以我们先来了解一下全局挂接的加载方式。

所有32位Windows程序都在保护模式下运行,每个进程都有独立的进程空间,不能在进程之间直接共享内存地址。 这意味着进程之间的资源受到严格保护,一个进程不能直接访问另一个进程的资源。 当然也包括消息队列。 Windows受到如此严密的保护,挂钩程序如何实现这一点呢? 能超越操作系统吗? 不,挂接程序与常规windows APP应用程序一样,只能在Ring3安全级别运行。 其秘密是如何将Windows加载到挂接程序中。 挂接安装程序调用SetWindowsHookEx )函数在系统上安装全局挂接后,Windows对挂接程序所做的特殊处理是将每个APP应用程序加载到单独的进程空间中。 也就是说,Windows“强制”将挂接程序(模块)的副本装载到系统中每个程序(包括系统程序)的进程空间中,挂接模块与其他依赖模块一样,在进程空间中图1显示了Windows如何加载全局挂接。

图1全局挂钩加载映像

如上所述,全局挂接必须采用DLL动态链接库的形式。 这里说明其理由。 这是因为全局挂钩不是作为独立运行的程序,而是作为其他程序的一部分加载运行的。 原理是如此简单,以致在安装全局挂接后,挂接程序的模块将被强制加载到在系统上运行的每个进程中。 这提供了一种观点,即为了检测挂接,挂接模块也会作为在系统上运行的常见程序强制加载。 如果挂接检测程序能够发现强制加载到自己的进程空间中的未知模块,则可以怀疑挂接程序正在系统中运行。

当前的问题是允许挂钩检测程序发现加载到自己进程空间的未知模块。 使用API HOOK介入模块的运行,直接分析二进制代码可能是最直接有效的方法,但这种方法并不容易破坏系统运行的稳定性,仅靠二进制代码的逻辑分析并不是少量代码就能实现的。 那么,有稍微简单一点的人吗

法呢?其实,绕开这些技术层面上的问题的纠缠,还有更简单的方法能够检测不明模块,那就是“模块比较法”。和普通的Windows应用程序一样,钩子检测程序运行时也需要很多系统模块的支持,这些模块是运行钩子检测程序所必须的,也被认为是安全的模块。而被Windows “强行”加载的钩子模块则不是钩子检测程序运行必须的模块,所以被认为是不明模块。钩子检测程序一旦编译完成,就已经决定了它在运行中需要哪些支持模块,有一点需要注意,那就是模块的名称和数量在Windows 95/98/Me系统下和基于Windows NT技术构建的Windows 2000/XP系统下有很大的不同,但是对于特定的Windows 版本来说是一定的,这也是“模块比较法”的主要理论依据。“模块比较法”的原理就是定期查看钩子检测程序进程中加载的模块列表,将这个列表与安全模块列表做对比,检查是否有不属于安全模块的不明模块被加载到检测程序的进程空间中,如果发现不明模块就发出告警,提示用户作出相应的处理。剩下的问题就是创建安全模块列表并将其保存到程序配置文件中,利用Depends工具或进程模块查看工具可以很容易地获取钩子检测程序所必须的支持模块(安全模块),唯一需要注意的是要在一个“干净”的Windows 系统上执行这些操作。
    似乎可以大功告成了,且慢,好像还有什么问题?对了,那就是钩子模块被加载到进程中的时机问题。并不是所有类型的全局钩子都会立即被Windows加载到其它进程中,根据Windows的调度策略,有一些类型的钩子安装以后立即就会被Windows加载到其它进程中开始运行,比如WH_SHELL和WH_SYSMSGFILTER类型的钩子,而WH_KEYBOARD和WH_MOUSE类型的钩子则不会立即加载,这种类型的钩子是有条件加载的,或者称之为“延时加载”。比如,WH_KEYBOARD类型的钩子只在进程第一次接收到键盘消息的时候才会被加载到进程中,而WH_MOUSE则只在进程有鼠标消息的时候才会被加载到进程中。对于这种类型的全局钩子,如果检测程序只是在后台运行,没有任何键盘或鼠标操作,Windows就不会将其加载到检测程序进程中,检测程序也就不能发现这种类型的钩子,所以对这种类型的钩子程序要特殊处理。笔者在AntiHook的开发过程中发现,只有真正地操作键和鼠标,通过硬件中断产生的键盘和鼠标事件才能促使Windows 向接收事件的进程“挂接”钩子模块,而使用SendMessage或PostMessage发送模拟的WM_KEYDOWN和WM_KEYUP事件不能达到相同的效果。AntiHook为此设计了一个事件采集界面,“邀请”用户进行一些简单的键盘和鼠标操作,协助查找这种有条件加载的钩子程序,这种方法虽然很笨,但是简单有效。

三、钩子检测程序AntiHook介绍

    做为一个后台运行的小程序,AntiHook使用WTL作为应用程序框架。WTL是一个轻量级的应用程序框架,与MFC相比,WTL不依赖额外的程序库,运行时占用的资源也很少,特别适合小程序的构建。AntiHook是一个基于对话框的应用程序,主要功能集中在主对话框中,从图 2 可以看出它的程序结构非常简单,CMainDlg类是整个程序的主界面也是核心类,其它的类模块都从属于CMainDlg,为其提供功能支持或软件界面支持。CPsapiFunc和CToolhelp32Func类用于查询进程模块,这两个类分别适用于Windows 2000/XP系统和Windows 95/98系统,CTrayIconImpl类为CMainDlg提供了系统托盘图标功能,CWzButtonImpl和CButtonHelp类配合向CMainDlg提供了自画按钮功能,CCtrlColor类丰富了CMainDlg的背景颜色和控件文字颜色,CMenuHelp类提供了自画菜单的支持,CColorListCtrl则使CMainDlg使用的列表控件颜色更加好看。


图 2 AntiHook类模块关系图

    软件的主要功能就是在CMainDlg窗口的定时器的驱动下,周期性地遍历程序当前加载的所有模块,通过与配置文件AntiHook.ini中记录的安全模块列表做对比,判断是否加载了不明模块。对于有条件加载的钩子程序,AntiHook设计了一个事件采集界面,“邀请”用户做一些敲击键盘或点击鼠标的操作,通过这些动作触发相应的事件,欺骗Windows将钩子加载到AntiHook的进程空间中,使得AntiHook能够检测到它们的存在。这个事件采集界面并没有什么实质性的代码,它只是一个“小把戏”,用于产生欺骗性的事件。图 3 演示了事件采集窗口的作用,当用户向采集窗口的编辑框输入随意的字符串时,AntiHook检测到了“紫光拼音输入法”模块被加载到自己的进程空间中了。

图 3 事件采集窗口的作用演示

四、总结

    除了本文提到的方法,对付恶意钩子程序还有一种主动进攻的方法,那就是用钩子对付钩子,不过实现起来比较麻烦,需要有系统调试的权限并且不支持Windows 95/98/Me这样的操作系统。本文提到的方法虽然只是一种被动的检测方法,但是实现起来简单,不仅适用于Windows 2000和Windows XP系统,还适用于Windows 95/98。AntiHook工具就是在本文的钩子检测原理指导下开发的,针对操作系统的差异做了区别处理,具有一定的实用性,另外,这个工具还是一个开源软件,软件爱好者还可以遵循GNU的原则对其进行修改、完善。本文的程序和代码下载网址是:http://blog.csdn.net/orbit/。


代码使用Visual C++ 6.0为开发工具,为了使程序小巧灵活,本人使用了WTL而不是MFC实现软件的界面,所以编译源代码需要安装WTL库。WTL库是微软发布的基于ATL构建的工具库,随源代码一起发布,可以从微软网站下载,也可以从http://www,winmsg.com/cn/orbit.htm下载。本程序使用WTL 7.1,应该也可用WTL 7.5。编译WTL程序需要安装微软的Platform SDK,最好是2002年以后的版本,如果使用Visual Studio 2002或以后的版本可不用安装Platform SDK,因为它们已经包含了Platform SDK。

下载AntiHook软件:http://blog.csdn.net/images/blog_csdn_net/orbit/antihook_exe.zip
下载AntiHook源代码:http://blog.csdn.net/images/blog_csdn_net/orbit/antihook_src.zip

 

 

 

 

>

 

>

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。