共用方式為


應用程式驗證器 - 概觀

摘要

應用程式驗證器 (AppVerifier) 是 Unmanaged 程式代碼的運行時間驗證工具,可協助找出細微的程式設計錯誤、安全性問題和有限的使用者帳戶許可權問題,而無法透過一般應用程式測試技術來識別。

概觀

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

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

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

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

ARM64EC支援

應用程式驗證器不支援ARM64EC。

安裝 AppVerifier

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

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

您可以單獨使用應用程式驗證器,或與使用者模式調試程式搭配使用。 目前用戶必須是電腦上的Administrators群組成員。

AppVerifier 會檢查什麼?

AppVerifier 是一種工具,旨在偵測及協助偵錯記憶體損毀、重大安全性弱點,以及有限的使用者帳戶許可權問題。 AppVerifier 藉由監視應用程式與Microsoft Windows 操作系統的互動,以及分析其使用物件、登錄、檔案系統和 Win32 API(包括堆積、句柄和鎖定)來建立可靠且安全的應用程式。 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() 之前呼叫網路 API,或在平衡成功的 WSACleanup() 呼叫之後呼叫。 如需詳細資訊,請參閱 應用程式驗證器內的應用程式驗證器- 測試

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)不會引入回歸。

區段主題

此章節包含下列主題。

應用程式驗證器 - 功能

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

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

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

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

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