應用程式驗證器 - 概觀

摘要

應用程式驗證程式 (AppVerifier) 是非受控程式碼的執行時間驗證工具,可協助尋找細微的程式設計錯誤、安全性問題和有限的使用者帳戶許可權問題,而難以透過一般應用程式測試技術加以識別。

概觀

程式設計人員、軟體架構設計人員、測試人員和安全性顧問面臨的最大挑戰之一,就是了解部署至生產環境時應用程式的變數執行路徑。 即使有原始程式碼的存取權,仍難以掌握執行期間發生的所有專案,例如,因為各種相依性 (。參與程式碼或利用外部元件) 的多個群組。 Microsoft AppVerifier 可以扮演有用的角色,協助管理這種複雜度和 Bug 的潛在副作用。 AppVerifier 可協助尋找程式設計錯誤、安全性問題和使用者帳戶許可權問題,在一般測試階段期間難以識別。

應用程式驗證器 (AppVerif.exe) 是使用者模式應用程式的 動態驗證 工具。 此工具會在應用程式執行時監視應用程式動作、將應用程式受限於各種壓力和測試,並產生應用程式執行或設計中潛在錯誤的報告。

應用程式驗證器可以在任何不是以 Managed 程式碼為基礎的使用者模式應用程式中偵測錯誤,包括使用者模式驅動程式。 它發現在標準應用程式測試或驅動程式測試期間可能難以偵測的細微程式設計錯誤。

您可以單獨或搭配使用者模式偵錯工具使用應用程式驗證器。 目前使用者必須是電腦上的 Administrators 群組成員。

安裝 AppVerifier

應用程式驗證程式包含在 Windows 軟體發展工具組 (SDK) 中。 若要安裝應用程式驗證器,請在 SDK 安裝期間核取其方塊。

應用程式驗證器主功能表的螢幕擷取畫面,其中已選取單一測試應用程式並列在右側的測試。

什麼是 AppVerifier?

AppVerifier 是一種工具來偵測並協助偵錯記憶體損毀、重大安全性弱點,以及有限的使用者帳戶許可權問題。 AppVerifier 透過監視應用程式的與 Microsoft Windows 作業系統的互動,以及分析其使用物件、登錄、檔案系統和 WIN32 API (,包括堆積、控制碼和鎖定) ,協助建立可靠且安全的應用程式。 AppVerifier 也包含用來預測應用程式在非系統管理環境中執行效能的檢查。

在軟體發展生命週期中使用時,AppVerifier 可以帶來開發工作的成本優勢,因為它有助於在問題較容易且較便宜時找出問題。 它也有助於偵測可能未注意到的錯誤,並確保最終應用程式可以在限制 (例如非系統管理員) 環境中執行。

AppVerifier 識別的問題

AppVerifier 有助於判斷:

當應用程式正確使用 API 時:

  • Unsafe TerminateThread API。
  • 正確使用執行緒本機儲存體 (TLS) API。
  • 正確使用虛擬空間操作 (例如 VirtualAlloc、MapViewOfFile) 。
  • 應用程式是否使用結構化例外狀況處理來隱藏存取違規。
  • 應用程式是否嘗試使用不正確控制碼。
  • 堆積中是否有記憶體損毀或問題。
  • 應用程式是否會在低資源下用盡記憶體。
  • 是否發生重大區段的正確使用方式。
  • 在系統管理環境中執行的應用程式是否會在具有較少許可權的環境中正常執行。
  • 當應用程式以有限的使用者身分執行時,是否有潛在問題。
  • 執行緒內容中未來函式調用中是否有未初始化的變數。

AppVerifier 測試

AppVerifier 包含一組稱為「驗證層」的測試。針對要測試的每個應用程式,都可以開啟或關閉這些專案。 藉由展開測試區域內的驗證層,就會顯示特定的測試。 若要開啟應用程式的測試,請選取它旁邊的核取方塊。 若要開啟整個驗證層,例如 [基本] ,請選取最上層的核取方塊。

AppVerifier 可以執行十三種不同類型的測試。

基本概念 - 您至少應該執行應用程式驗證程式,並選取 [基本] 設定。 這其中每一個都會測試會導致當機或其他負面案例的區域,這些案例對客戶體驗有直接且重大的影響。 如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

相容性 - 相容性 驗證層測試有助於識別可能有 Microsoft Windows 作業系統問題的應用程式。 其中許多檢查也可以用來測試標誌需求。 如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

Cuzz - 並行模糊 (Cuzz) 驗證層會偵測並行錯誤和資料競爭狀況。 Cuzz 會藉由在應用程式程式碼中的關鍵點插入隨機延遲來調整執行緒排程。 如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

低資源模擬 - 低 資源模擬會嘗試模擬低資源下的環境,例如記憶體不足。 此模擬會識別記憶體不足狀況中發生的 Bug。 這也稱為錯誤插入。如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

LuaPriv - 有限的使用者帳戶許可權預測器 (LuaPriv) 測試都是預測性與診斷工作,以呈現與以系統管理許可權執行應用程式相關的問題,以及該應用程式在一般使用者) (的情況下,是否也能運作。如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

其他 - 其他包含各種測試的測試,例如採取不安全動作之危險 API 的測試。 如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

網路 - 網路 測試會尋找不適當的 WinSock API 使用方式。 例如,如果在成功 WSAStartup () 之前或平衡成功的 WSACleanup () 呼叫之後呼叫網路 API。 如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

NTLM - 監視驗證 API AcquireCredentialsHandle 和 InitializeSecurityCoNtext 的使用,以偵測 NTLM 通訊協定的使用。 NTLM 是過時的驗證通訊協定,其瑕疵可能會危害應用程式和作業系統的安全性。 如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

列印 - 列印 驗證器可協助尋找和疑難排解應用程式呼叫列印子系統時可能造成的問題。 列印驗證器會以列印子系統的兩層為目標:PrintAPI 層和 PrintDriver 層。 如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

Webservices - Windows Webservices API (WWSAPI) 驗證層的運作方式是檢查是否適當地使用 WWSAPI,例如呼叫的 WWSAPI 會參考不正確內建 WWSAPI 物件,或使用已使用中單一線程物件的參考呼叫 WWSAPI。 如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器 - 測試

服務 - 服務 測試,檢查是否適當地使用 Windows 服務。 例如,正在啟動和停止服務。 如需這些測試所產生的停止程式碼例外狀況資訊,請參閱 應用程式驗證程式 - 停止程式碼和定義

Perf - Perf 測試會檢查是否有效率地使用會影響系統效能和耗電量的 API,例如呼叫使用不正確等候期間的 Windows 函式。 如需這些測試所產生的停止程式碼例外狀況資訊,請參閱 應用程式驗證程式 - 停止程式碼和定義

Hangs - Hangs 會測試使用會導致系統沒有回應的 API,例如當 DllMain 執行緒正在等候另一個封鎖的執行緒時。 如需這些測試所產生的停止程式碼例外狀況資訊,請參閱 應用程式驗證程式 - 停止程式碼和定義

AppVerifier 如何運作?

AppVerifier 的運作方式是修改 Unmanaged DLL 方法資料表,以便在執行實際函式之前執行必要的檢查, (這也稱為「函式勾點」) 。 例如,WIN32 API CreateFileA 方法的位址會取代為內部 AppVerifier 方法,以觸發一系列的測試,當記錄為正數時。

啟動新的進程時,AppVerifier 的 Method Table Hooking 技術會受到特定登錄機碼中所做的專案所控制。 如果登錄專案存在,則 AppVerifier DLL 將會載入新建立的進程,以處理現有和後續載入 DLL 中的方法資料表取代。 由於載入 DLL 時會建立這些勾點,因此無法在已在執行的進程上使用 AppVerifier。

AppVerifier 使用者介面 (UI) 可用來控制登錄機碼設定,並提供現有記錄的相關資訊。 在 UI 中設定應用程式和測試,然後按一下 [儲存] 按鈕之後,就會進行登錄設定。 然後,必須重新開機應用程式,以啟動監視。 請務必注意,設定會保存,直到應用程式從 AppVerifier 中移除為止。

識別問題時,將會發生驗證程式停止。 所提供的數位是用來識別其發生確切的本質和原因。

在軟體發展生命週期中使用應用程式驗證器

您應該在整個軟體發展生命週期中使用應用程式驗證器。

需求階段 - AppVerifier 應該進行規劃和時間配置,以供其執行和後續操作。

設計階段 - 規劃使用應用程式驗證器,並定義將測試哪些元件 (模組、DLL 或 EXE) 。

實作階段 - 在穩定組建上執行應用程式驗證器, (從 Alpha 到 RTM) 開發中的不同元件, (請務必個別且共同) 測試元件。

驗證階段 - 測試人員應該使用應用程式驗證器執行其所有測試, (手動和自動) ,因為這是第一次將應用程式推送至限制和非預期的行為,且將會提交資料。 AppVerifier 也是一項功能強大的工具,可供安全性顧問執行稽核 (黑色方塊和白色方塊) ,因為它可快速列舉實際 (或潛在的) 攻擊/惡意探索媒介。

發行階段 - 用戶端和安全性顧問可以在發行的二進位檔上使用 AppVerifier 來識別潛在的安全性弱點。

支援與服務階段 - 使用應用程式驗證器來確保程式碼變更 (例如更新、Service Pack) 不會引入回歸。

章節主題

此章節包含下列主題。

應用程式驗證器 - 功能

應用程式驗證器 - 測試應用程式

應用程式驗證器 - 應用程式驗證器內的測試

應用程式驗證器 - 停止代碼和定義

應用程式驗證器 - 對應用程式驗證器停止進行偵錯

應用程式驗證器 - 常見問題