AppVerifier 特别用于检测和帮助调试内存损坏、危险的安全漏洞以及受限的用户帐户特权问题。AppVerifier 有助于创建可靠且安全的应用程序,方法是监视应用程序与Windows操作系统的交互,并配置应用程序使用的对象、注册表、文件系统和 Win32 API(包括堆、句柄和锁)。AppVerifier 还包括检查,以便预测应用程序在非管理员环境中的执行情况。
1、 Appverifier原理
● AppVerifier的原理是hook分配和释放资源的API,在程序调用这些API时记录信息,在程序退出时报告出未释放的资源。
● 只能检测Native代码。
● 程序正常退出才行,强行杀进程不能得到正确的报告。
● 基于原理,只能做Run-time检测。尽量使用程序的所有功能已保证检测到更多代码。
2 Appverifier能识别的问题
● 应用程序正确地使用 API 的时刻:
● 不安全的 TerminateThread API。
● 正确使用线程本地存储(Thread Local Storage,TLS)API。
● 正确使用虚拟空间操作(例如,VirtualAlloc 和 MapViewOfFile)。
● 应用程序是否使用结构化的异常处理隐藏访问冲突。
● 应用程序是否试图使用无效的句柄。
● 堆中是否有内存损坏或存在内存问题。
● 应用程序是否在资源不足的情况下用尽了内存。
● 是否正确使用了临界区。
● 运行在管理员环境中的应用程序在具有较低特权的环境中是否能良好运行。
● 当应用程序作为受限用户运行时是否会存在潜在的问题。
● 在线程的上下文中,是否在将来的函数调用中会存在未初始化的变量。
3、 AppVerifier如何使用
在AppVerifier中增加需要验证的应用程序,对于开发人员,直接选择工程中输出的Debug版的可执行文件,可以添加多个文件,也可以添加动态库DLL。
AppVerifier大致可以验证异常、句柄、堆栈、内存、未初始化参数等多个方面的隐患,选择需要进行测试的项目,并保存设置。
AppVerifier可以命令行也可以UI界面运行,这里我们以UI界面运行为例:
1)、打开appverifier,选择File--Add Application添加应用程序;
添加应用程序完成后,需要在右方对话框选择你想要验证的问题:
1)Basic最基本的验证
● Exceptinons 防止程序做这样的操作,比如程序用异常捕获,以防止错误继续抛出。
● Handles 检测句柄错误
● Heaps 检测内存中的堆栈错误
● InputOutput 检测读写文件,读写网卡数据等的错误
● Locks 检测锁使用情况,确定应用程序是否正确的使用关键段
● Memory 检测应用程序虚拟内存使用情况
● ThreadPool 监控线程池使用,线程池的线程不应该被应用程序关闭
● Tls 检测线程局部存储api是否被正确使用
2)Compatibility 兼容性问题验证
● Filepaths 检测是否正常访问文件目录
● Highversionlie 验证应用程序是否正确检测windows版本
● InterActiveservices 检查一个程序是否运行为可桌面交互的服务,或者向可交互的用户桌面发送过数据。这样的应用程序可能会引发严重的安全问题。
● KernelModeDriverInstall 检测驱动程序安装
3)Low resources simulation 低资源情况下,如内存将耗尽,程序是否能正常运行。
4)Luapriv 检测程序在标准用户权限下是否能正常运行
5)Miscellaneous
● dangerousAPIs 检测应用程序是否使用了危险的API,如TerminateThread
● Dirtystacks 检测应用程序是否使用了未初始化的变量
● TimeRoleOver 模拟使GetTickCount and TimeGetTime APIs 返回的值比实际的大,即时间跑的更快的情况下,程序运行是否正常。
6)Pringting
● PrintAPI
● PrintDriver
AppVerifier的使用步骤
下面结合自己的应用介绍一下它的使用方法(非常简单)。
1。下载AppVerifier
在微软网站下载,并安装软件
http://www.microsoft.com/downloads/details.aspx?FamilyID=bd02c19c-1250-433c-8c1b-2619bd93b3a2&DisplayLang=en
新的下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=20028
2。运行AppVerifier
在AppVerifier中增加需要验证的应用程序,对于开发人员,直接选择工程中输出的Debug版的可执行文件,可以添加多个文件,也可以添加动态库DLL。
3。配置需要验证的项目
AppVerifier大致可以验证异常、句柄、堆栈、内存、未初始化参数等18个方面(3.3版)的隐患,选择需要进行测试的项目,并保存设置。
4。在IDE中调试程序
这些跟以前是一样的,只是在调试过程中AppVerifier会向你报告它检测到的问题,以异常的方式,或者输出信息到输出框中,一般的情况,程序停在发生问题的地方不远处。
5。取消验证
在AppVerifier中取消要验证的程序,否则,验证代码一直挂在程序中。
分析 AppVerifier 数据
在 AppVerifier 分析过程中创建的所有数据存储在一个二进制格式的 %ALLUSERSPROFILE%\AppVerifierLogs 文件夹中。然后,这些日志可通过用户界面或命令行转换为 XML 以供进一步分析。要查看 XML 文件,使用以下方式之一:
-
Web 浏览器 — 现在,所有的 Web 浏览器都能够以结构化以及颜色编码的格式显示 XML 文件。
-
XSL 转换 — 创建一个 XSLT,将原始内容转换为只包含相关信息的报告。
-
导入到 Excel — 将 XML 文件导入到 Excel,使用筛选器或 Pivot 表识别并分析收集的数据。
-
导入到数据库 — 保存 XML 文件,并将其导入到一个数据库中(例如,SQL、Access 数据库等)。
好了,先拿手上的软件试试法吧,以前没有任何错误,现在,多出来了不少的异常,赶紧看看。。。。
与它是同一个系列的另一个软件:Driver Verifier,专门来测试驱动的安全。
感兴趣的同事google一下“Application Verifier”,看看简介。
想学习的同事请阅读MSDN:
《在软件开发生命周期中使用应用程序验证器》
http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/WDdnclinicscripting.mspx?mfr=true
《使用应用程序验证程序排除 Windows XP中的程序问题》
http://support.microsoft.com/default.aspx/kb/286568/zh-cn
《C++ 安全性最佳做法》
http://msdn2.microsoft.com/zh-cn/library/k3a3hzw7(VS.80).aspx
详细的微软官网的说明:
https://docs.microsoft.com/en-us/windows/desktop/Win7AppQual/application-verifier
https://msdn.microsoft.com/en-us/library/ms807121.aspx
--------------------- 本文来自 华秋实 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yockie/article/details/9170901?utm_source=copy