在软件开发生命周期中使用应用程序验证器
轉自https://msdn.microsoft.com/zh-cn/library/aa480483.aspx#EHAA
發布日期 : 2006-6-5?|?更新日期 : 2006-6-5摘要
Microsoft? Application Verifier (AppVerifier) 是針對非托管代碼的運行時驗證工具,它有助于找到細小的編程錯誤、安全問題和受限的用戶帳戶特權問題,使用常規的應用程序測試技術很難識別出這些錯誤和問題。
本頁內容
簡介?
什么是 AppVerifier??
AppVerifier 功能?
何時使用 AppVerifier?
如何使用 AppVerifier?
分析 AppVerifier 數據?
有關 AppVerifier 的要點?
附錄 A:Driver Verifier?
附錄 B:使用 Application Verifier 測試安全功能?
附錄 C:參考站點?
簡介
程序員、軟件架構師、測試人員以及安全咨詢師所面臨的最大難題之一是,了解其應用程序部署到產品時的結果。即使具備對源代碼的訪問,也很難掌握執行過程中將發生的每個操作,這歸咎于存在多種依賴項(例如,服務于代碼或利用外部組件的多個組)。在幫助管理這種復雜性以及錯誤帶來的潛在的副面影響方面,Microsoft AppVerifier 扮演著重要的角色。AppVerifier 有助于找到細小的編程錯誤、安全問題和用戶帳戶特權問題,這些錯誤和問題在典型的測試過程中是很難識別的。
本文提供的信息,涉及 AppVerifier 如何工作以及在軟件開發生命周期 (Software Development Lifecycle) 過程中如何應用 AppVerifier。
返回頁首?什么是 AppVerifier?
AppVerifier 可以免費下載,特別用于檢測和幫助調試內存損壞、危險的安全漏洞以及受限的用戶帳戶特權問題。AppVerifier 有助于創建可靠且安全的應用程序,方法是監視應用程序與 Microsoft? Windows? 操作系統的交互,并配置應用程序使用的對象、注冊表、文件系統和 Win32 API(包括堆、句柄和鎖)。AppVerifier 還包括檢查,以便預測應用程序在非管理員環境中的執行情況。
在整個軟件開發生命周期中使用時,AppVerifier 可節約開發工作的成本,因為它能方便地在早期就識別出問題,而在早期修復錯誤是比較容易且成本較低的。AppVerifier 還有助于檢測出可能被忽視掉的錯誤,并確保最終的應用程序能夠在受限的(例如,非管理員)環境中執行(最后這一點對于 Windows Vista 應用程序更為重要)。
AppVerifier 識別的問題
AppVerifier 有助于確定:
-
應用程序正確地使用 API 的時刻:
-
不安全的 TerminateThread API。
-
正確使用線程本地存儲(Thread Local Storage,TLS)API。
-
正確使用虛擬空間操作(例如,VirtualAlloc 和 MapViewOfFile)。
-
-
應用程序是否使用結構化的異常處理隱藏訪問沖突。
-
應用程序是否試圖使用無效的句柄。
-
堆中是否有內存損壞或存在內存問題。
-
應用程序是否在資源不足的情況下用盡了內存。
-
是否正確使用了臨界區。
-
運行在管理員環境中的應用程序在具有較低特權的環境中是否能良好運行。
-
當應用程序作為受限用戶運行時是否會存在潛在的問題。
-
在線程的上下文中,是否在將來的函數調用中會存在未初始化的變量。
AppVerifier 功能
AppVerifier 創建于 2001 年,在登錄過程中使用。然而,在 Download Center 的 3.0 版中進行了一些更改。用戶界面經過了更改,增加了對安全的關注,更新的體系結構可以提供更健壯的報告(基于 XML 的日志),靈活性方面表現為能添加新的測試(例如,LuaPriv 等更多的新特性)。
AppVerifier 測試
AppVerifier 包含稱為"驗證層"的測試集。可以針對進行測試的每個應用程序打開或關閉它們。通過在測試區域內擴展驗證層,將顯示特定的測試。要打開針對該應用程序的測試,選擇它旁邊的復選框。要打開整個驗證層(例如,Basics),選擇最上層的復選框。
AppVerifier 可以執行四種不同類型的測試(在版本 3.0.28 中):
-
Basics?包含針對以下內容的測試:
-
Exceptions?— 使用結構化的異常處理確保應用程序不隱藏訪問沖突。
-
Handles?— 確保應用程序不嘗試使用無效的句柄。
-
Heaps?— 查看堆中的內存損壞問題。
-
Locks?— 驗證臨界區的正確使用。
-
Memory?— 確保正確使用虛擬空間操作的 API。
-
TLS?— 確保正確使用線程本地存儲 API。
-
-
Low resource simulation?嘗試在資源不足的情況下模擬環境,因此,您可定義一個編號 (0–100) 來指示關于以下內容的錯誤可能性調用:
-
Wait(例如,WaitForXXXX API)。
-
Heap_Alloc(堆分配 API)。
-
Virtual_Alloc(虛擬內存分配 API)。
-
注冊表(注冊表 API)。
-
文件(諸如 CreateFile 的文件 API)。
-
事件(諸如 CreateEvent 的事件 API)。
-
MapView(諸如 CreateMapView MapView API 的 CreateMapView)。
-
Ole_Alloc(諸如 SysAllocString 的 Ole API)。
-
-
LuaPriv?包含 31 種不同的測試,它們可在以下兩種方案中使用:
-
Predictive?— 確定一個以管理權限運行的應用程序如果以較小特權(通常,作為常規用戶)運行時是否能正常工作。例如,如果應用程序對只允許管理員訪問的文件進行寫操作,那么如果該應用程序以非管理員身份運行,則它將無法寫入此類文件。
-
Diagnostic?— 以非管理員身份運行時,將識別可能已經存在于當前運行中的潛在問題。例如,如果應用程序嘗試寫入只允許管理員訪問的文件,則應用程序將產生一個 ACCESS_DENIED 錯誤。
-
-
Miscellaneous?包含針對以下方面的測試:
-
Dangerous API — 進行跟蹤,查看應用程序是否正在使用以下不安全的操作:
-
對 TerminateThread 的危險調用。
-
內存不足情況下潛在的堆棧溢出。
-
在多個線程仍然運行的情況下退出調用的進程。
-
LoadLibrary 在 DllMain 過程中調用。
-
FreeLibrary 在 DllMain 過程中調用。
-
Dirty Stacks?用內存模式填充(周期性地)未使用的堆棧部分。這有助于檢測線程上下文的將來函數調用中未初始化的變量。
-
-
屬性
AppVerifier 中有兩組屬性。一組基于測試,一組基于應用程序。每組屬性按以下方式定義:
-
Name - 針對每個屬性的唯一名稱。
-
Type - Boolean、DWORD、String 和 MultipleString。
-
Value - 基于類型變化的可更改元素。
-
Description - 該描述解釋屬性的內容。
針對每個應用程序編輯屬性
對于每個應用程序,以下屬性可用于編輯:
-
Propagate?— 將驗證器設置從父進程傳播到子進程。False(不選中該框)不傳播這些設置,而 True(選中該框)則傳播這些設置。
-
AutoClr?— 當指定的圖像開始運行之后,驗證的圖像將清除自己的設置。False(不選中該框)不進行此操作;True(選中該框)則進行此操作。
-
AutoDisableStop?— AppVerifier 對于一個錯誤將只解釋一次。如果再次發現該問題,它不會生成錯誤。False 在每次發現問題時都將生成錯誤。True 將只生成一個錯誤。
-
LoggingWithLocksHeld?— 將記錄 dll 加載/卸載事件。驗證器在加載器鎖處于保持狀態時進行 I/O。這可能會掛起應用程序。False 不會記錄該事件,而 True 將記錄該事件。
編輯測試屬性
有關特定測試的屬性的詳細信息,參見 AppVerifier 中的 Help 內容。要編輯這些屬性,可采用以下兩種方法之一:
-
Individual?— 在屬性窗口中,雙擊要編輯的屬性。將顯示一個對話框,允許編輯該項并將其設置回默認內容。更改該項并單擊"OK"。
-
Group?— 從 Test 區域,單擊要編輯的測試或驗證層。使用右鍵單擊選項顯示包含所有屬性的屏幕。更改這些屬性或重置為默認內容,并單擊"OK"。
日志
運行應用程序而且生成錯誤時,創建日志。日志為 XML 格式,可以使用瀏覽器、XML 或 XLST 查看。
返回頁首?何時使用 AppVerifier
您應該在軟件開發生命周期(SDL,又稱為安全開發生命周期 Security Development Lifecycle)的整個過程中使用 AppVerifier:
-
需求?階段?— 規劃 AppVerifier 的使用,并安排它的執行與后續操作。
-
設計階段?— 定義將測試哪些組件(模塊、Dll 或 EXE)。
-
實現階段?— 從開發中不同組件的穩定版本(從 Alpha 到 RTM)運行 AppVerifier(單獨和共同測試組件很重要)。
-
驗證階段?— 測試人員應該使用 AppVerifier 進行他們的所有測試(手動和自動),因為這是第一次對應用程序進行限制,而且將提交意外的行為和數據。AppVerifier 對于安全咨詢師而言也是一個進行審核(黑盒和白盒)的強大工具,因為它能夠快速枚舉實際(或潛在)的攻擊/破壞向量。
-
發布階段?— 客戶和安全咨詢師可以對發布的二進制文件使用 AppVerifier,從而識別出潛在的安全漏洞。
-
支持和服務階段?— 使用 AppVerifier 確保代碼更改(例如,錯誤修復)不會引入回歸。
如何使用 AppVerifier
安裝和配置
-
安裝:從?Microsoft Download Center?下載最新版的 AppVerifier,其中您將發現針對以下支持的體系結構的安裝二進制文件:x86、ia64 和 amd64。
-
調試器安裝:已驗證的應用程序應該運行于用戶模式的調試器中或者系統應該運行于內核調試器中,因為出現錯誤時,將中斷調試器。參閱 Help 內容獲取有關調試器的詳細信息。
-
設置:?對于運行中的進程,不能啟用 AppVerifier。需要按照下面描述的方式創建設置,然后啟動應用程序。除非顯式刪除,否則這些設置將一直保留;無論啟動應用程序多少次,在啟動時都會啟用 AppVerifier,除非刪除這些設置。
注?AppVerifier 也可以在 Visual Studio 2005 Team System 中使用。
使用 AppVerifier Basic 測試
下面的方案展示推薦的命令行和用戶界面選項。這些內容應該在執行代碼的所有測試中運行以確保完全覆蓋。這些方案的預期目標是,應用程序不?中斷調試器,而且所有測試在不啟用 AppVerifier 運行時以相同的通過率通過。
-
針對要測試的應用程序(一個或多個)啟用驗證器,通過:
從命令行:?appverif /verify MyApp.exe
從用戶界面:
-
a. 右鍵單擊 Applications 區域并單擊?Add Application?添加應用程序。
-
b. 從 Tests 區域選擇?Basics。
-
c. 單擊?Save?按鈕。
-
注:
-
/verify?將啟用 Basic 測試。
-
如果要測試一個 DLL 應用程序,必須為執行該 DLL 的測試 .exe 文件啟用 AppVerifier。
-
單獨運行驗證層。例如,在一個會話中啟用所有 Basic,而在另一個會話中啟用所有 LuaPriv 檢查。
-
-
-
運行執行應用程序的所有測試。
-
分析遇到的任何調試器中斷(一個或多個)。如果發生一個中斷,則需要了解中斷的原因以及如何修復它。(Help 內容提供關于中斷的詳細信息以及如何研究它們。)
-
完成時,刪除所有設置:
從命令行:appverif /n MyApp.exe
從用戶界面:
-
a. 右鍵單擊 Applications 區域并單擊?Delete Application?刪除應用程序。
-
b. 單擊?Save?按鈕。
-
使用 AppVerifier 低資源模擬(錯誤注入)
該方案的預期目標是,應用程序不中斷該調試器。這意味著沒有需要解決的錯誤。
由于在常規操作中引入隨機錯誤注入,因此這些測試的通過率可能顯著降低。
-
針對一個或多個應用程序啟用應用程序驗證器低資源模擬(錯誤注入):
從命令行:Appverif /verify MyApp.exe /faults;
從用戶界面:
-
a.?右鍵單擊 Applications 區域并單擊?Add Application?添加應用程序。
-
b. 從 Tests 區域選擇?Low Resource Simulation。
-
c. 單擊?Save?按鈕。
注?如果要測試一個 DLL,可以在特定的 DLL 上(而非整個過程中)應用低資源模擬(錯誤注入)。命令行格式如下所示:
appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL ?]]]]Example: appverif /verify mytest.exe /faults 5 1000 d3d9.dll -
-
運行執行應用程序的所有測試。
-
完成時,刪除所有設置。分析遇到的任何調試器中斷(一個或多個)。如果出現中斷,需要了解中斷的原因以及如何修復它。
-
完成時,刪除所有設置:
從命令行:appverif /n MyApp.exe
從用戶界面:
-
a. 右鍵單擊 Applications 區域并單擊?Delete Application?刪除應用程序。
-
b. 單擊?Save?按鈕。
注?在應用程序中是否使用錯誤注入將導致執行完全不同的代碼路徑,因此為了完全受益于 AppVerifier 必須運行這兩個方案。
-
分析 AppVerifier 數據
在 AppVerifier 分析過程中創建的所有數據存儲在一個二進制格式的 %ALLUSERSPROFILE%\AppVerifierLogs 文件夾中。然后,這些日志可通過用戶界面或命令行轉換為 XML 以供進一步分析。要查看 XML 文件,使用以下方式之一:
-
Web?瀏覽器?— 現在,所有的 Web 瀏覽器都能夠以結構化以及顏色編碼的格式顯示 XML 文件。
-
XSL?轉換?—?創建一個 XSLT,將原始內容轉換為只包含相關信息的報告。
-
導入到?Excel?— 將 XML 文件導入到 Excel,使用篩選器或 Pivot 表識別并分析收集的數據。
-
導入到數據庫?—?保存 XML 文件,并將其導入到一個數據庫中(例如,SQL、Access 數據庫等)。
有關 AppVerifier 的要點
本節提供有關潛在 AppVerifier 用戶遇到的最常見問題的信息:
系統要求
AppVerifier 旨在測試 Windows XP、Windows Server 2003 和 Windows Vista 上的非托管應用程序(例如,非 .NET Framework 應用程序)。當運行一個完整的頁面堆時,建議最少需要 1 GB。
盡管應用程序的符號或調試信息的可用性在所收集數據的質量和有用性方面差異巨大,但 AppVerifier 在執行測試時不需要訪問源代碼。
AppVerifier 將驗證什么?
AppVerifier 用于在 Windows XP、Windows Server 2003 和 Windows Vista 中測試用戶模式的應用程序。
-
要測試驅動程序或內核模塊,使用 Driver Verifier。有關更多信息,請參閱附錄 A:Driver Verifier 以及知識庫文章?How to Use Driver Verifier to Troubleshoot Windows Drivers。
-
要測試 Windows CE,使用 Windows CE Test Kit (CETK) 中包含的特定的 Platform AppVerifier。
-
需要注意的重要一點是,AppVerifier 將只測試在測試執行過程中調用的函數。這意味著,如果單元測試可用(從目標應用程序/模塊),它們應該用于確保最大的代碼覆蓋 - 如果調用生成請求的方法,則只檢測錯誤。
AppVerifier 如何工作?
AppVerifier 的工作方式是修改非托管 DLL Method Table,以便在執行實際函數之前執行所需的檢查(也稱為"函數掛鉤")。例如,Win32 APICreateFileA?方法的地址被替換為一個內部的 AppVerifier 方法,后者將觸發需要記錄的一系列測試。
當新進程啟動時,使用 AppVerifier 的 Method Table Hooking 技術將由在特定注冊表鍵中創建的項進行控制。如果存在注冊表項,那么 AppVerifier DLL 將加載到新創建的進程中,該進程將在現有的以及后續加載的 DLL 中處理 Method Table 替換。由于這些掛鉤在加載 DLL 時生成的,因此在已經運行的進程上使用 AppVerifier 3.0 是可能的。
AppVerifier 用戶界面 (UI) 用于控制注冊表鍵設置并提供關于現有日志的信息。當在 UI 中設置了應用程序和測試并單擊"Save"按鈕時,將進行 Registry 設置。然后需要重新啟動該應用程序,這將啟動監視操作。需要注意的重要一點是,這些設置將一直持續到應用程序從 AppVerifier 中移除。
當發現一個問題時,驗證器將停止。提供的編號用于標識問題發生的實質和原因。要更好地了解停止操作,參見 AppVerifier Help 文件中包含的詳細解釋:appverif.chm。
頁面堆技術細節
為了檢測堆損壞(上溢或下溢),AppVerifier 將修改內存分配方式,方法是在分配內存之前和之后使用完整的不可寫的頁或特殊標記填充所請求的內存。
當使用完整的不可寫的頁填充所請求的內存時(在頁面堆的屬性部分啟用 FULL 設置并使用默認設置),AppVerifier 將使用大量虛擬內存,而且它具有個優勢,即當上溢或下溢發生時,將實時緩存堆損壞事件。謹記,該模式中的內存可能如下所示?
堆檢查將根據?Backward?屬性在分配的開始或結尾放置一個保護頁。如果?Backward?設置為 False(默認值),則它將在分配的末尾放置一個保護頁以捕獲緩沖區溢出。如果它設置為 True,則該保護頁放置在分配的開始以捕獲緩沖區的不足。
當使用特殊標記(通過清除堆屬性中的"Full"復選框項來啟動)填充所需的內存時,如果釋放該內存,AppVerifier 將進行檢查并向您發出警告。使用這些技巧時的主要問題是,有時內存損壞只能在內存釋放時(最小的內存塊是 8 字節)進行檢測,因此操作一個 3 字節的變量或發生 5 字節溢出時,不會立即檢測到它。
對于一個下溢事件,將嘗試寫入一個只讀頁。這將引發一個異常。請注意,僅當目標應用程序在調試器中執行時才引發該異常。還需注意,完整的頁面堆模式也將檢測這些錯誤,因為它使用填充+保護頁。使用輕量級頁面堆的原因是,防止計算機無法承受完整頁面堆的高內存約束。
對于內存密集型應用程序,或者需要長期使用 AppVerifier 時(例如,壓力測試),最好運行常規(輕量)堆測試而非完整的模式,以防止性能降低。但當您遇到問題時,請打開完整的頁面堆進行深入研究。
返回頁首?附錄 A:Driver Verifier
Driver Verifier 是一個在驅動程序運行時在其中(內核模式軟件)檢測錯誤的工具。典型的檢測結果是:池損壞(包括緩沖區溢出)、對不信任數據的錯誤驗證、錯誤的內核模式操作等。無論 Driver Verifier 何時發現問題,它都會以受控方式 (bugcheck) 中斷系統,而內核調試器需要了解該問題。Driver Verifier 是一個操作系統組件,在 Windows 2000 及其更高版本的系統中可用。
Driver Verifier 使用方案
-
安裝:使用 verifier.exe 建立 Driver Verifier 的設置,前者是任何 Windows 系統中默認安裝的系統工具。要運行該用戶界面,打開一個命令窗口并鍵入?verifier.exe,或轉到 windows\system32\verifier.exe。
-
設置:您需要進行如下所述的設置,然后重新啟動系統以便開始測試啟用的 Driver Verifier。這些設置在明確刪除之前一直保留。
使用 Driver Verifier
下面的方案展示推薦的命令行和用戶界面選項。這些選項應該在執行代碼的所有測試中運行以確保完全覆蓋。對于這些方案的預期目標是,驅動程序不?產生系統中斷,而且所有測試具有與不啟用 Driver Verifier 時相同的通過率。
-
啟用要進行測試的驅動程序(一個或多個)的標準設置,然后重新啟動:
從命令行:verifier /flags 0x1FB /driver MyDriver.sys
從用戶界面:
-
a. 單擊初始屏幕上的 Create Standard Settings。
-
b. 單擊 Next 按鈕。
-
c. 單擊 Select driver names from a list。
-
d. 選擇要測試的驅動程序(一個或多個),并單擊?Finish?按鈕。
-
-
運行執行驅動程序(一個或多個)的所有測試。
-
分析遇到的任何系統中斷。任何系統中斷都是驗證器發現的錯誤,您需要了解并修復它。
使用 Driver Verifier Low Resource Simulation(錯誤注入)
這些方案的預期目標是,當啟用 Driver Verifier 時,驅動程序不?產生系統中斷。請注意,由于隨機錯誤引入系統中,這些測試的通過率可能會顯著降低。
-
啟用 Low Resource Simulation(低資源模擬,錯誤注入)并重新啟動:
從命令行:verifier /volatile /flags 7
從用戶界面:
-
a. 在初始屏幕上單擊 Create custom settings [for code developers] 并單擊 Next 按鈕。
-
b. 選擇 Low resource simulation 并單擊 Next。
-
c. 確保像在前面的方案中那樣選擇這些驅動程序并重新啟動。
-
-
再次運行執行該驅動程序的所有測試。
-
分析遇到的任何系統中斷。
-
禁用 Low Resource Simulation(低資源模擬,錯誤注入)并重新啟動:
從命令行:verifier /reset?將刪除所有設置,?verifier /volatile /flags 3?將只關閉錯誤注入。
從用戶界面:
-
a. 單擊?Delete existing settings?并單擊?Finish。
-
b. 重新啟動。
-
要調試驗證器系統中斷,運行調試器命令?!analyze。有關更多信息,請查閱 DDK/LDK (Driver Development Kit) Help。
注?在驅動程序中是否使用錯誤注入將會導致執行完全不同的代碼路徑,因此為了完全受益于 Driver Verifier 必須運行這兩個方案。
返回頁首?附錄 B:使用 Application Verifier 測試安全功能
本節的作者是?Lauren Lavoie?。
摘要:描述使用 Application Verifier 工具識別項目代碼中的常見安全問題。
代碼查看和威脅模型提供優秀的靜態測試工具,有助于發現所測試應用程序中的安全性錯誤。當在應用程序上運行一組常規測試時,AppVerifier 可以在后臺動態運行測試。AppVerifier 監視應用程序的行為,方法是部署 Windows_ shim 引擎以便掛鉤應用程序編程接口 (API) 調用。
最初的 AppVerifier 檢測引起應用程序中斷的行為。然后,該工具的新增功能使它能夠驗證更精細的運行時行為,例如,與 Windows 的兼容,查看通用 API 的正確使用,以及查看與安全有關的基本功能。
有時,開發人員只是錯誤地設置了安全屬性或誤用了通用的 API 功能,從而無意中編寫了容易遭受特洛伊木馬程序攻擊的代碼。AppVerifier 緩存并記錄可能允許惡意代碼執行的那些情況,這樣開發人員可以使他們的代碼更安全。
查看 DACL 的正確使用
開發人員使代碼易受攻擊的最常見情況是不恰當地使用自由訪問控制列表(Discretionary Access Control Lists,DACL),該列表指定哪些組可以訪問特定的資源以及它們具有什么類型的訪問權。很多創建或訪問資源的 API 將 DACL 作為其參數之一。 AppVerifier:
-
截獲這些 API 調用并查看 DACL 參數是有效的。這是 AppVerifier 查看資源具有安全訪問權限的最簡單、最有效的方式之一。
-
無論何時遇到一個 NULL DACL 或為所有用戶提供非必需的權限(例如,允許所有用戶更改訪問權限或刪除資源)的任何 DACL,都會記錄錯誤。此外,AppVerifier 認為允許非管理員的任何用戶更改訪問權限或資源所有者都是錯誤的。
-
當文件打開(因為由其他進程創建的文件在創建時不可能進行上面的 AppVerifier 檢查)或刪除(因為移除文件時不復制文件的安全屬性)時查看訪問權限。
查看 CreateProcess 的正確使用
如果未正確地指定參數,針對 CreateProcess API 函數的調用就容易受到攻擊。如果 CreateProcess(或其他相關的 API 函數)使用 NULL lpApplicationName 參數和包含空格的 lpCommandLine 參數進行調用,則 AppVerifier 將生成一個錯誤。例如,它不允許以下代碼作為命令行參數:
c:\program files\sample.exe –t –g c:\program files\sample\test使用該命令行時,如果一個惡意用戶將其程序安裝到 C:\Program,則應用程序可能會在無意中執行惡意代碼。
強制安全使用套接字 API
AppVerifier 查看調用套接字函數的應用程序是否使用 SO_EXCLUSIVEADDRUSE 標記。這樣做可防止使用 SO_REUSEADDR 的惡意主機綁定到一個端口并對主機進行黑客攻擊。
獲取和使用 AppVerifier
謹記,無需將任何測試添加到測試套件即可利用 AppVerifier。它配置 Windows 以便隨時監視應用程序的所有活動,直到您通知它停止為止。查看 AppVerifier Help 可獲知其測試的詳細信息,以及關于 AppVerifier 如何報告錯誤的信息。最新版本的 AppVerifier 可以從?Microsoft Download Center?下載。
總結
以上是生活随笔為你收集整理的在软件开发生命周期中使用应用程序验证器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USF MSDS501 计算数据科学中文
- 下一篇: Bracket Sequencing