日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AppVerifier的功能和原理

發布時間:2024/4/11 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AppVerifier的功能和原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下基本上都是有關MS官網的文檔介紹,覺得講得挺好的就記下來:

?

在軟件開發生命周期中使用應用程序驗證器

發布日期 : 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 API?CreateFileA?方法的地址被替換為一個內部的 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 將使用大量虛擬內存,而且它具有個優勢,即當上溢或下溢發生時,將實時緩存堆損壞事件。謹記,該模式中的內存可能如下所示

[AppVerifier Read-Only Heap Page (4k)] [Amount of memory requested by Application under test] or like this [Amount of memory requested by Application under test] [AppVerifier Read-Only Heap Page (4k)]。

堆檢查將根據?Backward?屬性在分配的開始或結尾放置一個保護頁。如果?Backward?設置為 False(默認值),則它將在分配的末尾放置一個保護頁以捕獲緩沖區溢出。如果它設置為 True,則該保護頁放置在分配的開始以捕獲緩沖區的不足。

當使用特殊標記(通過清除堆屬性中的"Full"復選框項來啟動)填充所需的內存時,如果釋放該內存,AppVerifier 將進行檢查并向您發出警告。使用這些技巧時的主要問題是,有時內存損壞只能在內存釋放時(最小的內存塊是 8 字節)進行檢測,因此操作一個 3 字節的變量或發生 5 字節溢出時,不會立即檢測到它。

對于一個下溢事件,將嘗試寫入一個只讀頁。這將引發一個異常。請注意,僅當目標應用程序在調試器中執行時才引發該異常。還需注意,完整的頁面堆模式也將檢測這些錯誤,因為它使用填充+保護頁。使用輕量級頁面堆的原因是,防止計算機無法承受完整頁面堆的高內存約束。

對于內存密集型應用程序,或者需要長期使用 AppVerifier 時(例如,壓力測試),最好運行常規(輕量)堆測試而非完整的模式,以防止性能降低。但當您遇到問題時,請打開完整的頁面堆進行深入研究。

總結

以上是生活随笔為你收集整理的AppVerifier的功能和原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。