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
在選定了要驗證的選項後,你會發現提示需要調試器配合,如何做呢?看下面:
1)首先安裝windbg,運行windbg目錄下的gflags.exe,選擇image file標籤,針對測試進程掛上調試器,如下圖:
OK,此時運行測試進程qqmusic.exe,會發現調試器已運行,當檢測到程序出現問題,windbg將斷下來,此時便可根據堆棧信息找到問題。
此外,還有兩篇文章可以做參考: