應(yīng)用程序驗(yàn)證器(Application Verifier)這個工具是做什么的?
說明:Application Verifier是來自微軟官方的一款應(yīng)用程序驗(yàn)證工具,主要用于幫助用戶檢測和調(diào)試內(nèi)存損壞、危險的安全漏洞、Run-time檢測等;是一款輔助開發(fā)工具,不用修改源碼;在程序退出時報告未釋放的資源等,程序正常退出才會有報告
類比:linux下的
valgrind
工具包中的memcheck
(常用命令:valgrind --tool=memcheck --leak-check=full --log-file=保存路徑 ./程序
)獲取:可以通過windows software development Kit 管理器來下載最新版
推薦:
WinDbg
和應(yīng)用程序驗(yàn)證器在很多場景下配合使用、參考中的文章也可以都讀一下原理:hook掉分配和釋放資源的API,做一些檢查和記錄
前置知識:最好會使用
WinDbg
、gflags.exe,可以直接點(diǎn)擊查看介紹、懂得堆的基本知識…,不懂也沒有關(guān)系,百度一下就知道了
使用WinDbg這么長時間居然不知道
AV
,還是在看《軟件調(diào)試》第2版,第19章時發(fā)現(xiàn)的,下面是對當(dāng)時的筆記進(jìn)行的整理。
重要的事情說3遍:
筆記更新?lián)Q位置了!
筆記更新?lián)Q位置了!
筆記更新?lián)Q位置了!
新位置
:我寫的新系列,剛開始寫沒幾天,后續(xù)文章主要在新地址更新(點(diǎn)擊跳轉(zhuǎn),歡迎收藏)
0x01 Introdution
如果第一次接觸這個工具,建議讀一下
appverif.chm
的How to use Application Verifier
部分,可以當(dāng)成應(yīng)用程序驗(yàn)證器的介紹文檔,包括應(yīng)用時機(jī)、安裝和配置、選擇64還是32位版本、基本測試、結(jié)果分析等
當(dāng)一個Release版本軟件出現(xiàn)bug時,可以使用操作系統(tǒng)提供的驗(yàn)證機(jī)制;校驗(yàn)機(jī)制中有2個常用工具:
- 驅(qū)動程序驗(yàn)證器(
verifier.exe
):用戶態(tài)工具 - 應(yīng)用程序驗(yàn)證器(
appverif.exe
):內(nèi)核態(tài)工具
應(yīng)用程序驗(yàn)證器(appverif.exe
)是windows本地代碼的運(yùn)行時
分析工具,依賴于操作系統(tǒng)的支持來捕獲常見的系統(tǒng)API誤使用,工具可以自動捕獲很多難以重現(xiàn)的代碼錯誤;是一個設(shè)置應(yīng)用驗(yàn)證機(jī)制參數(shù)的工具
工具主要包括2個部分:實(shí)現(xiàn)在verifier.dll
等dll中的avf
開頭的函數(shù)和一個設(shè)置工具(appverif.exe
)
應(yīng)用程序驗(yàn)證器(appverif.exe
)本質(zhì)上就是一個工具,下面通過問答和一個示例來講解
0x02 常見問題
提示:
appverif.chm
的Frequently Asked Questions about the Application Verifier
章節(jié)里面有很多新手遇到的問題解答
下面通過問答的形式說明工具的一些使用疑惑(主要是第一次使用會有),其實(shí)多操作幾次自然就記住了
Q1:使用時機(jī)?
什么情況下可以使用應(yīng)用程序驗(yàn)證機(jī)制呢?通常有2種情況:
- 1.在開發(fā)中為所有相關(guān)進(jìn)程啟動,缺點(diǎn)是影響程序執(zhí)行效率
- 2.修改產(chǎn)品中的bug時,可以確保修改錯誤不會引入新的問題
Q2:怎么開始和停止?
下面給出了開始和停止的方法
=========================Start==================================
#Start Testing an Application
To test an application you must first add the Application to the verifier tool.
You can then select the tests you want enabled, save your test setup, and run your application.
1.On the File menu, select Add Application.Browse to the application and click Open
2.select the tests to run
3.When the tests you want enabled have all been selected, click Save
Note:設(shè)置好后,不論appvrif.exe是否運(yùn)行(主要是修改注冊表中某項(xiàng),繼續(xù)運(yùn)行程序會讀取注冊表),應(yīng)用程序每次運(yùn)行都會執(zhí)行相應(yīng)的校驗(yàn)
=========================Stop==================================
#To remove an application from Application Verifier
1.Select the name of the application
2.On the File menu, select Delete Application .
3.Click Save .
Note: 即使刪除了相應(yīng)的程序, 以前產(chǎn)生log文件也不會刪除
Q3:怎么查看測試設(shè)置項(xiàng)?
每個測試項(xiàng)都是有一些屬性的,可以通過下面的方式詳細(xì)進(jìn)行查看
1.顯示屬性設(shè)置區(qū)
#To view the Property window
On the View menu, select Property Window . A check mark while appear next to the Property Window selection.
屬性設(shè)置區(qū)默認(rèn)是關(guān)閉的,可以用下面方式開啟;里面會顯示具體某個測試項(xiàng)目的詳細(xì)參數(shù)設(shè)置和描述信息
2.鼠標(biāo)右鍵停在測試項(xiàng)上
- 選擇
Properties
:允許控制測試設(shè)置的屬性,注意并不是所有的測試設(shè)置都有
- 選擇
Verifier Stop Options
:設(shè)置驗(yàn)證停頓相關(guān)屬性
其中:Not Continuable
表示驗(yàn)證停頓被觸發(fā)時,將中斷到調(diào)試器中且不會從驗(yàn)證停頓中恢復(fù)過來(效果就是停在調(diào)試器里)
提示:其他具體屬性不用詳細(xì)介紹,一看就明白;具體每一個暫停碼的相關(guān)信息可以參考
appverif.chm的Stop Codes and Definitions
章節(jié)下面是
驗(yàn)證停頓碼7
的詳細(xì)信息,包含產(chǎn)生的可能原因和產(chǎn)生結(jié)果的格式
Q4:測試結(jié)果怎么查看?
正常應(yīng)用程序驗(yàn)證器使用流程:對某個程序用驗(yàn)證器(appverif.exe
)啟動相應(yīng)設(shè)置,啟動程序,此時驗(yàn)證器(appverif.exe
)會在后臺運(yùn)行;觀察測試結(jié)果有2種方式:
- 1.查看相應(yīng)的日志文件
View
菜單下面的Logs
可以查看
- 2.調(diào)試器查看:即配合WinDbg等工具進(jìn)行調(diào)試,在WinDbg里查看;這個就先不說了,后面會看到調(diào)試器中的錯誤信息發(fā)生了變化
提示:鼠標(biāo)直接停在相應(yīng)測試設(shè)置上查看簡短描述,會看到測試結(jié)果需要
log查看
還是調(diào)試器查看
Q5:完全頁堆和普通頁堆?
注意:默認(rèn)是開啟完全頁堆的,所以需要說明一下頁堆,頁堆是什么?
作用:就是可以
在堆被破壞時立刻發(fā)現(xiàn)問題
,而不是等到下次調(diào)用堆函數(shù)時才發(fā)現(xiàn)原理:簡單理解是在堆塊后面增加專門用于檢測的柵欄頁(fense page),一旦用戶數(shù)據(jù)區(qū)溢出并觸發(fā)到柵欄頁(fense page)就會立刻觸發(fā)異常,而不是等到下次調(diào)用堆函數(shù)才發(fā)現(xiàn)問題,會立刻發(fā)現(xiàn)問題;堆塊前面也可以添加?xùn)艡陧?/p>
資料:如果想詳細(xì)了解一下頁堆的知識,可以看這里
文檔:
appverif.chm
的Debugging Heap Errors
章節(jié)有介紹頁堆,頁堆實(shí)際上有2種:完全頁堆和普通頁堆,下面是《軟件調(diào)試》中的截圖中兩者的區(qū)別
Q6:修改被進(jìn)程捕獲時機(jī)?
下面是應(yīng)用程序驗(yàn)證配置后,程序的的大致流程:
- 1.進(jìn)程加載模塊
進(jìn)程加載器會先將可執(zhí)行程序(exe)和ntdll.dll
這個2個模塊進(jìn)行加載,ntdll.dll
中ldr
開頭的函數(shù)負(fù)責(zé)主要加載工作
- 2.加載器初始化
會從下面的注冊表鍵下尋找當(dāng)前程序的可執(zhí)行選項(xiàng)(捕獲位置
)
\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\程序名.exe
- 3.根據(jù)可執(zhí)行設(shè)置,決定動態(tài)修改IAT
- 4.找到EP處執(zhí)行程序
0x03 釋放同一塊內(nèi)存2次示例
下面使用1個堆內(nèi)存釋放二次的示例來講解應(yīng)用程序驗(yàn)證器的使用,將代碼build成名字為heap_test
的可執(zhí)行文件
//兩次釋放同一塊內(nèi)存
//直接運(yùn)行現(xiàn)象:單獨(dú)運(yùn)行,程序會崩潰;如果指定了JIT調(diào)試器會觸發(fā)
//調(diào)試器中運(yùn)行現(xiàn)象:如果被應(yīng)用程序驗(yàn)證器配置過,會發(fā)現(xiàn)錯誤的準(zhǔn)確類型(雙重釋放)
#include "StdAfx.h"
#include <stdio.h>
void main(int argc, char* args[]) {
char *psz = NULL;
psz = new char[10];
delete[] psz;
delete[] psz; //二次釋放
return;
}
下圖是沒有開啟應(yīng)用程序驗(yàn)證器相關(guān)驗(yàn)證功能的調(diào)試信息,可以看到是因?yàn)橹噶町惓V袛嗟秸{(diào)試器(錯誤碼(0x80000003
)和提示信息沒有什么有價值的信息)
提示:這個截圖是使用WinDbg查bug的經(jīng)典截圖,先記住它;和后面的開啟應(yīng)用程序校驗(yàn)后的WinDbg截圖對比查看,看看哪個效果更好?
想要進(jìn)一步定位沒有思路怎么辦?
通常都是kb
等一系列WinDbg,這里就不介紹了
如果你對WinDbg也不是非常熟悉,有沒有什么傻瓜式的操作可以獲得程序崩潰時更多的信息呢?下面介紹的應(yīng)用程序驗(yàn)證器或許你可以試試
提示:下面用2種方法來介紹應(yīng)用程序校驗(yàn)
- 1.應(yīng)用程序驗(yàn)證器(
appverif.exe
)方法:主要側(cè)重對應(yīng)用程序校驗(yàn)的初步認(rèn)識- 2.
gflags.exe
方法:主要為了擴(kuò)展應(yīng)用程序校驗(yàn)的配置方法和理解校驗(yàn)器鉤子(原理)
直接先總結(jié)2種方法的區(qū)別:應(yīng)用程序驗(yàn)證器(
appverif.exe
)設(shè)置一個程序后,注冊表項(xiàng)會出現(xiàn)GlobalFlag
和VerifierFlags
等值;gflags.exe
只會影響GlobalFlag
這一個注冊表值
0x04 應(yīng)用程序驗(yàn)證器應(yīng)用
先簡單介紹一下工具的基本使用
step 1.配置
生效
對源碼生成的執(zhí)行文件(heap_test.exe
)進(jìn)行默認(rèn)配置截圖如下
提示:第一次使用的話,一般將Basics配置上就行,后續(xù)熟練了根據(jù)自己的要求進(jìn)行配置,此時頁堆也會被默認(rèn)打開
注冊表影響
配置實(shí)際上會影響全局標(biāo)志,注冊表中查看的截圖如下,可以看到應(yīng)用程序驗(yàn)證器中設(shè)置的測試項(xiàng)目和注冊表都是一一對應(yīng)的
其中的部分信息使用WinDbg在全局變量中也可以查到
取消
想要使某一個進(jìn)程的設(shè)置失效,有下面簡單的2種方式:
-
在
appverif.exe
中使用Ctrl + D
注意:此時注冊表中還會有一點(diǎn)殘留,最好也一起刪除,防止后續(xù)使用WinDbg開啟進(jìn)程出現(xiàn)問題
- 直接在注冊表中刪除對應(yīng)的項(xiàng)(因?yàn)楣ぞ邔?shí)際就是影響了注冊表中的項(xiàng)而已)
step 2.WinDbg調(diào)試
配置好驗(yàn)證的項(xiàng)后,WinDbg下重新運(yùn)行一下程序,發(fā)現(xiàn)頁堆和應(yīng)用程序都使能了
0:000> vercommand
command line: '"C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\windbg.exe" '
#查看全局標(biāo)志
0:000> !gflag
Current NtGlobalFlag contents: 0x02000100
vrf - Enable application verifier #應(yīng)用程序驗(yàn)證器生效,0x00000100
hpa - Place heap allocations at ends of pages #頁堆生效,0x02000000
繼續(xù)讓程序運(yùn)行,這次看看出問題時的提示信息是否會有變化?
錯誤提示信息更加具體了
,再也不是錯誤碼(0x80000003)這種沒啥有用信息的提示了,就沖這一點(diǎn),就一定要學(xué)習(xí)應(yīng)用程序驗(yàn)證器使用
#運(yùn)行,會產(chǎn)生異常中斷到調(diào)試器,檢測出現(xiàn)問題的信息更全面
0:000> g
=======================================
VERIFIER STOP 00000007: pid 0x16630: Heap block already freed. #堆塊已經(jīng)被釋放過了
07F71000 : Heap handle for the heap owning the block.
07F72BFC : Heap block being freed again.
0000000A : Size of the heap block. #堆塊大小
00000000 : Not used
=======================================
This verifier stop is not continuable. Process will be terminated
when you use the `go' debugger command.
=======================================
(16630.16634): Break instruction exception - code 80000003 (first chance) #指令異常
eax=7c4e03a0 ebx=00000000 ecx=000001a1 edx=006ff2a1 esi=07f71000 edi=7c4ddda0
eip=7c4d3bf8 esp=006ff58c ebp=006ff794 iopl=0 nv up ei pl nz na po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
vrfcore!VerifierStopMessageEx+0x5c8:
7c4d3bf8 cc int 3
-
解釋:VERIFIER STOP
00000007
,停頓碼7代表重復(fù)釋放的堆塊;如果對同一個堆塊釋放2次,就會觸發(fā)這個停頓(這也太直接了吧…) -
根因:應(yīng)用程序驗(yàn)證器已經(jīng)將哪個堆塊(07F72BFC),什么原因(如果對同一個堆塊釋放2次)產(chǎn)生的指令異常顯示出來
推薦:如果這個二次釋放是在特殊場景下才觸發(fā)且程序代碼量很大,VS調(diào)試可執(zhí)行程序時是很難發(fā)現(xiàn)的,因此推薦使用應(yīng)用程序驗(yàn)證器配合調(diào)試器查問題的bug
提示:都提示出二次釋放導(dǎo)致程序崩潰了,那剩下的操作就是review代碼里能引起二次釋放的代碼;如果有源碼可以使用
k
等命令查看棧幀0:000> k # ChildEBP RetAddr 00 006ff794 7c4d83c0 vrfcore!VerifierStopMessageEx+0x5c8 #停止消息 01 006ff7b8 7935df34 vrfcore!VfCoreRedirectedStopMessage+0x80 02 006ff80c 7935bb4f verifier!VerifierStopMessage+0x84 03 006ff878 793589dd verifier!AVrfpDphReportCorruptedBlock+0x1cf #堆塊異常 04 006ff8dc 79358b35 verifier!AVrfpDphFindBusyMemoryNoCheck+0x7d 05 006ff900 7935cde1 verifier!AVrfpDphFindBusyMemory+0x15 06 006ff918 79362572 verifier!AvrfpDphCheckPageHeapAllocation+0x41 07 006ff928 7c526123 verifier!VerifierCheckPageHeapAllocation+0x12 08 006ff970 00b61314 vfbasics!AVrfpHeapFree+0x53 #調(diào)用vfbasics.dll版本的釋放函數(shù) 09 006ff984 00b61016 heap_test!free+0x1c [f:\dd\vctools\crt_bld\self_x86\crt\src\free.c @ 51] 0a 006ff998 00b61298 heap_test!main+0x16 [c:\...\heap_test.cpp @ 11]
擴(kuò)展:驗(yàn)證結(jié)果在調(diào)試器中輸出的格式
#驗(yàn)證結(jié)果在調(diào)試器中輸出的基本:其中的參數(shù)列表取決于被執(zhí)行的驗(yàn)證類型
=======================================
VERIFIER STOP <stop-code>: <porcess-ID>: 對故障的簡單描述
parameter -1 : 描述
parameter -2 : 描述
parameter -3 : 描述
parameter -4 : 描述
=======================================
step 3.擴(kuò)展命令(!avrf)
下面介紹一個WinDbg中非常有用的擴(kuò)展命令
NT全局標(biāo)志可以使用擴(kuò)展命令!gflag
進(jìn)行查看,WinDbg中命令!avrf
可以用來查看所有調(diào)試進(jìn)程的校驗(yàn)標(biāo)志
#官網(wǎng)中關(guān)于!avrf的部分摘要
The !avrf extension controls the settings of Application Verifier and displays a variety of output produced by Application Verifier.
#語法:
!avrf
The !avrf command without any parameters shows the Application Verifier settings and information about the current and previous Application Verifier breaks if any.
!avrf -hp { Length | -a Address }
Displays the heap operation log. Address specifies the heap address. Records of the heap operations containing this heap address will be displayed.
...
#Comments
#展示驗(yàn)證配置
When the !avrf extension is used with no parameters, it displays the current Application Verifier options.
#獲取驗(yàn)證停頓碼和相關(guān)原因
If an Application Verifier Stop has occurred, the !avrf extension with no parameters will reveal the nature of the stop and what caused it.
#缺少符號信息
If symbols for ntdll.dll and verifier.dll are missing, the !avrf extension will generate an error message.
提示:如果
!avrf
命令顯示失敗,大概率是因?yàn)?code>vfbasics.dll的路徑問題(老版本微軟的符號服務(wù)器有這個dll的公共符號,但是沒有函數(shù)擴(kuò)展所需要的類型,因此會解析失敗,新版沒有遇到這個問題);因?yàn)?code>vfbasics.dll放入符號會一同安裝在system32目錄下,所以解決的辦法是設(shè)置符號路徑時,使本地system32的路徑出現(xiàn)在微軟的符號服務(wù)器前
下面是命令使用的截圖,省去了還要查找錯誤碼的過程,直接給出了簡要信息
#查看NT全局標(biāo)志
0:000> !gflag
Current NtGlobalFlag contents: 0x02000100
vrf - Enable application verifier
hpa - Place heap allocations at ends of pages
#查看所有調(diào)試進(jìn)程的校驗(yàn)標(biāo)志(為了顯示全面,下面是使用appverif.exe默認(rèn)檢查項(xiàng)設(shè)置的結(jié)果)
0:000> !avrf
Verifier package version >= 3.00
Application verifier settings (81643027):
- full page heap #與appverif.exe默認(rèn)檢查項(xiàng)一一對應(yīng)
- Handles
- Locks
- Memory
...
- SRWLock
*******************************************************************************
* Exception Analysis *
*******************************************************************************
APPLICATION_VERIFIER_HEAPS_DOUBLE_FREE (7) #原因:堆被釋放二次
Heap block already freed.
This situation happens if the block is freed twice. Freed blocks are marked in a
special way and are kept around for a while in a delayed free queue. ...
Arguments:
Arg1: 08051000, Heap handle for the heap owning the block. #得到的詳細(xì)信息
Arg2: 08052c64, Heap block being freed again.
Arg3: 0000000a, Size of the heap block.
Arg4: 00000000, Not used
NTGLOBALFLAG: 2000100
ExceptionAddress: 799e3bf8 (vrfcore!VerifierStopMessageEx+0x000005c8)
ExceptionCode: 80000003 (Break instruction exception)
FAILURE_BUCKET_ID: BREAKPOINT_AVRF_80000003_vrfcore.dll!VerifierStopMessageEx
0x05 系統(tǒng)支持的校驗(yàn)器
下面主要介紹一下通過gflags.exe
設(shè)置程序的校驗(yàn)器
提示:gflags也是一個很強(qiáng)大的工具,有時間最好也要學(xué)習(xí)一下
step 1.配置
gflags.exe
工具為示例程序啟動操作系統(tǒng)支持的默認(rèn)校驗(yàn)器
上面實(shí)際上是設(shè)置了進(jìn)程映像的NT全局標(biāo)志為0x100(vrf
,應(yīng)用程序驗(yàn)證器),即告訴操作系統(tǒng)我們想要進(jìn)程后續(xù)實(shí)例啟動公共應(yīng)用程序校驗(yàn)器鉤子
(hook,簡單理解就是會hook掉一部分函數(shù))
上面設(shè)置會影響2個地方:
- 1.全局標(biāo)志GlobalFlag映像文件執(zhí)行選項(xiàng)(
Image File Execution Options
)
- 2.一個叫
verifier.dll
的dll緊隨ntdll.dll
被加載(使用appverif.exe
設(shè)置也會影響)
當(dāng)在用戶態(tài)調(diào)試器下運(yùn)行目標(biāo)進(jìn)程,verifier.dll
緊隨ntdll.dll
被加載,并映射到進(jìn)程的地址空間中;這個verifier.dll
模塊包含了操作系統(tǒng)的核心校驗(yàn)引擎
#查看NT全局標(biāo)志
0:000> !gflag
Current NtGlobalFlag contents: 0x02000100
vrf - Enable application verifier
hpa - Place heap allocations at ends of pages
#列出模塊
0:000> lm
start end module name
00b70000 00b8d000 heap_test (deferred)
75590000 7578f000 KERNELBASE (deferred)
76900000 769e0000 KERNEL32 (deferred)
77510000 776aa000 ntdll (pdb symbols) c:\symbols\...\wntdll.pdb
79350000 793b3000 verifier (deferred) #這個模塊 應(yīng)用程序校驗(yàn)器 相關(guān)模塊
#查看verifier.dll模塊的詳細(xì)信息
0:000> lmv m verifier
Browse full module list
start end module name
79350000 793b3000 verifier (deferred)
Image path: C:\WINDOWS\SysWOW64\verifier.dll
Image name: verifier.dll
FileDescription: Standard application verifier provider dll
頁堆默認(rèn)設(shè)置?
- 提示
細(xì)心的話會發(fā)現(xiàn),
hpa(頁堆)
也被打開了,但是全局標(biāo)志GlobalFlag
映像文件執(zhí)行選項(xiàng)(Image File Execution Options
)和gflags /p
查詢都沒有開啟hpa的進(jìn)程
- 關(guān)聯(lián)
實(shí)際是應(yīng)用程序驗(yàn)證器的默認(rèn)測試設(shè)置中的heap里面默認(rèn)選取了頁堆
step 2.系統(tǒng)默認(rèn)啟動項(xiàng)
當(dāng)設(shè)置NT全局標(biāo)志中應(yīng)用程序校驗(yàn)位時,操作系統(tǒng)會默認(rèn)啟動相關(guān)的校驗(yàn)位,處理檢查就是系統(tǒng)默認(rèn)的啟動項(xiàng)
step 3.校驗(yàn)器檢查原理
在調(diào)試器下繼續(xù)運(yùn)行程序,會命中一個校驗(yàn)中斷,顯示的類型是 block already freed
的錯誤
0:000> g
===========================================================
VERIFIER STOP 00000007: pid 0x18424: block already freed
066E1000 : Heap handle
06893968 : Heap block
0000000A : Block size
00000000 :
===========================================================
(18424.183a4): Break instruction exception - code 80000003 (first chance)
verifier!VerifierBreakin+0x42:
7935dd72 cc int 3
0:000> k
# ChildEBP RetAddr
00 007ef84c 7935de70 verifier!VerifierBreakin+0x42 #中斷是verifier.dll產(chǎn)生
01 007efb74 7935e16d verifier!VerifierCaptureContextAndReportStop+0xf0
02 007efbb8 7935bb4f verifier!VerifierStopMessage+0x2bd
03 007efc24 7935c09a verifier!AVrfpDphReportCorruptedBlock+0x1cf
04 007efc80 7935ce0b verifier!AVrfpDphCheckNormalHeapBlock+0x11a
05 007efca0 79362572 verifier!AvrfpDphCheckPageHeapAllocation+0x6b
06 007efcb0 79377cd6 verifier!VerifierCheckPageHeapAllocation+0x12
07 007efd08 00b71314 verifier!AVrfpHeapFree+0x56 #free被改變轉(zhuǎn)向verifier.dll的同名函數(shù)
08 007efd1c 00b71016 heap_test!free+0x1c [f:\...\free.c @ 51]
09 007efd30 00b71298 heap_test!main+0x16 [c:...\heap_test.cpp @ 8]
校驗(yàn)器檢查原理:主要是更新部分常見win32 API函數(shù)調(diào)用對應(yīng)的導(dǎo)入表(IAT
)項(xiàng)來截取對API的調(diào)用,驗(yàn)證是否符合約定的使用方法,因此會有應(yīng)用程序校驗(yàn)鉤子的說法
下面是運(yùn)行時的截圖,可以看到free
由原本調(diào)用HeapFree函數(shù)
,被hook到調(diào)用verifier.dll的AVrfpHeapFree函數(shù)
提示:這些hook方法只針對用戶態(tài)代碼上下文,內(nèi)核驅(qū)動程序則與另一個工具相關(guān)(驅(qū)動校驗(yàn)工具
verifier.exe
)
0x06 總結(jié)
- 1.hook常見API
應(yīng)用程序驗(yàn)證工具將常見操作系統(tǒng)API的導(dǎo)入表替換成特定調(diào)用來實(shí)現(xiàn),在執(zhí)行真實(shí)功能前,會先執(zhí)行額外的校驗(yàn)檢查來發(fā)現(xiàn)API誤使用
- 2.本地特性
應(yīng)用程序驗(yàn)證器(appverif.exe
)只在本地用戶態(tài)運(yùn)行時分析使用,內(nèi)核態(tài)要用驅(qū)動校驗(yàn)工具(verifier.exe
)文章來源:http://www.zghlxwxcb.cn/news/detail-460419.html
- 3.目標(biāo)程序最好運(yùn)行在調(diào)試器中
應(yīng)用程序校驗(yàn)中斷作為運(yùn)行時斷言(SEH異常)提出,如果沒有運(yùn)行在調(diào)試器下且沒有設(shè)置JIT調(diào)試器,異常不會
被處理只會簡單掛掉;因此盡量使目標(biāo)程序最好運(yùn)行在調(diào)試器中,這樣可以捕獲到任何檢驗(yàn)而停止文章來源地址http://www.zghlxwxcb.cn/news/detail-460419.html
0x07 參考
- 1.《Windows編程調(diào)試技術(shù)內(nèi)幕》6.2章節(jié)
- 2.《Windows高級調(diào)試》中相關(guān)部分
- 3.《軟件調(diào)試》第2版,第19章
- 4.應(yīng)用驗(yàn)證器的幫助文檔(appverif.chm)
到了這里,關(guān)于調(diào)試工具:應(yīng)用程序驗(yàn)證器Application Verifier一頁紙(appverif+WinDbg+gflags)- 詳細(xì)版的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!