自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

網(wǎng)絡(luò)安全編程:調(diào)試API函數(shù)之產(chǎn)生斷點(diǎn)

安全
產(chǎn)生中斷的方法是設(shè)置斷點(diǎn)。常見(jiàn)的產(chǎn)生中斷的斷點(diǎn)方法有3種,分別是中斷斷點(diǎn)、內(nèi)存斷點(diǎn)和硬件斷點(diǎn)。下面介紹這3種斷點(diǎn)的不同。

 [[398092]]

Windows中有些API函數(shù)是專門用來(lái)進(jìn)行調(diào)試的,被稱作Debug API,或者是調(diào)試API。利用這些函數(shù)可以進(jìn)行調(diào)試器的開(kāi)發(fā),調(diào)試器通過(guò)創(chuàng)建有調(diào)試關(guān)系的父子進(jìn)程來(lái)進(jìn)行調(diào)試,被調(diào)試進(jìn)程的底層信息、即時(shí)的寄存器、指令等信息都可以被獲取,進(jìn)而用來(lái)分析。

OllyDbg調(diào)試器的功能非常強(qiáng)大,雖然有眾多的功能,但是其基礎(chǔ)的實(shí)現(xiàn)就是依賴于調(diào)試API。調(diào)試API函數(shù)的個(gè)數(shù)雖然不多,但是合理使用會(huì)產(chǎn)生非常大的作用。調(diào)試器依賴于調(diào)試事件,調(diào)試事件有著非常復(fù)雜的結(jié)構(gòu)體。調(diào)試器有著固定的流程,由于實(shí)時(shí)需要等待調(diào)試事件的發(fā)生,其過(guò)程是一個(gè)調(diào)試循環(huán)體,非常類似于SDK開(kāi)發(fā)程序中的消息循環(huán)。無(wú)論是調(diào)試事件還是調(diào)試循環(huán),對(duì)于調(diào)試或者說(shuō)調(diào)試器來(lái)說(shuō),其最根本、最核心的部分是中斷,或者說(shuō)其最核心的部分是可以捕獲中斷。

產(chǎn)生中斷的方法是設(shè)置斷點(diǎn)。常見(jiàn)的產(chǎn)生中斷的斷點(diǎn)方法有3種,分別是中斷斷點(diǎn)、內(nèi)存斷點(diǎn)和硬件斷點(diǎn)。下面介紹這3種斷點(diǎn)的不同。

中斷斷點(diǎn),這里通常指的是匯編語(yǔ)言中的int 3指令,CPU執(zhí)行該指令時(shí)會(huì)產(chǎn)生一個(gè)斷點(diǎn),因此也常稱之為INT3斷點(diǎn)?,F(xiàn)在演示如何使用int 3來(lái)產(chǎn)生一個(gè)斷點(diǎn),代碼如下: 

  1. int main(int argc, char* argv[])  
  2.  
  3.   __asm int 3  
  4.   return 0;  

代碼中使用了asm,在asm后面可以使用匯編指令。如果想添加一段匯編指令,方法是asm{}。通過(guò)asm可以在C語(yǔ)言中進(jìn)行內(nèi)嵌匯編語(yǔ)言。在__asm后面直接使用的是int 3指令,這樣會(huì)產(chǎn)生一個(gè)異常,稱為斷點(diǎn)中斷異常。對(duì)這段簡(jiǎn)單的代碼進(jìn)行編譯連接,并且運(yùn)行。運(yùn)行后出現(xiàn)錯(cuò)誤對(duì)話框,如圖1所示。

圖1  異常對(duì)話框

圖1所示的異常對(duì)話框中通過(guò)鏈接“請(qǐng)單擊此處”可以打開(kāi)詳細(xì)的異常報(bào)告。如果電腦與此處顯示的對(duì)話框不同,請(qǐng)依次進(jìn)行如下設(shè)置:在“我的電腦”上單擊右鍵,在彈出的菜單中選擇“屬性”,打開(kāi)“屬性”對(duì)話框,選擇“高級(jí)”選項(xiàng)卡,選擇“錯(cuò)誤報(bào)告”按鈕,打開(kāi)“錯(cuò)誤匯報(bào)”界面,在該界面上選擇“啟用錯(cuò)誤匯報(bào)”單選按鈕,然后單擊確定。通過(guò)這樣的設(shè)置,就可以啟動(dòng)“異常對(duì)話框”了。對(duì)于分析程序的BUG、挖掘軟件的漏洞,彈出異常對(duì)話框界面是非常有用的。

這個(gè)對(duì)話框可能常常見(jiàn)到,而且見(jiàn)到以后多半會(huì)很讓人郁悶,通常情況是直接單擊“不發(fā)送”按鈕,然后關(guān)閉這個(gè)對(duì)話框。在這里,這個(gè)異常是通過(guò)int 3導(dǎo)致的,不要忙著關(guān)掉它。通常在寫自己的軟件時(shí)如果出現(xiàn)這樣的錯(cuò)誤,應(yīng)該去尋找更多的幫助信息來(lái)修正錯(cuò)誤。單擊“請(qǐng)單擊此處”鏈接,出現(xiàn)如圖2所示的對(duì)話框。

圖2  “異常基本信息”對(duì)話框

彈出“異?;拘畔?rdquo;對(duì)話框,因?yàn)檫@個(gè)對(duì)話框給出的信息實(shí)在太少了,繼續(xù)單擊“要查看關(guān)于錯(cuò)誤報(bào)告的技術(shù)信息”后面的“請(qǐng)單擊此處”鏈接,打開(kāi)如圖3所示的對(duì)話框。

圖3  “錯(cuò)誤報(bào)告內(nèi)容”對(duì)話框

通常情況下,在這個(gè)報(bào)告中只關(guān)心兩個(gè)內(nèi)容,一是Code,二是Address。在圖3中,Code后面的值為0x80000003,Address后面的值為0x0000000000401028。Code的值為產(chǎn)生異常的異常代碼,Address是產(chǎn)生異常的地址。在Winnt.h中定義了關(guān)于Code的值,在這里0x80000003的定義為STATUS_BREAKPOINT,也就是斷點(diǎn)中斷。在Winnt.h中的定義為:

  1. #define STATUS_BREAKPOINT ((DWORD)0x80000003L) 

可以看出,這里給的Address是一個(gè)VA(虛擬地址),用OD打開(kāi)這個(gè)程序,直接按F9鍵運(yùn)行,如圖4和圖5所示。

圖4  在OD中運(yùn)行后被斷下

圖5  OD狀態(tài)欄提示

從圖4中可以看到,程序執(zhí)行停在了00401029位置處。從圖5看到,INT3命令位于00401028位置處。再看一下圖3中Address后面的值,為00401028。這也就證明了在系統(tǒng)的錯(cuò)誤報(bào)告中可以給出正確的出錯(cuò)地址(或產(chǎn)生異常的地址)。這樣在以后寫程序的過(guò)程中可以很容易地定位到自己程序中有錯(cuò)誤的位置。

在OD中運(yùn)行自己的int 3程序時(shí),可能OD不會(huì)停在00401029地址處,也不會(huì)給出類似圖4的提示。在實(shí)驗(yàn)這個(gè)例子的時(shí)候需要對(duì)OD進(jìn)行設(shè)置,在菜單中選擇“選項(xiàng)”→“調(diào)試設(shè)置”,打開(kāi)“調(diào)試選項(xiàng)”對(duì)話框,選擇“異常”選項(xiàng)卡,取消“INT3中斷”復(fù)選框的選中狀態(tài),這樣就可以按照該例子進(jìn)行測(cè)試了。

回到中斷斷點(diǎn)的話題上,中斷斷點(diǎn)是由int 3產(chǎn)生的,那么要如何通過(guò)調(diào)試器(調(diào)試進(jìn)程)在被調(diào)試進(jìn)程中設(shè)置中斷斷點(diǎn)呢?看圖4中00401028地址處,在地址值的后面、反匯編代碼的前面,中間那一列的內(nèi)容是匯編指令對(duì)應(yīng)的機(jī)器碼??梢钥闯觯琁NT3對(duì)應(yīng)的機(jī)器碼是0xCC。如果想通過(guò)調(diào)試器在被調(diào)試進(jìn)程中設(shè)置INT3斷點(diǎn)的話,那么只需要把要中斷的位置的機(jī)器碼改為0xCC即可。當(dāng)調(diào)試器捕獲到該斷點(diǎn)異常時(shí),修改為原來(lái)的值即可。

內(nèi)存斷點(diǎn)的方法同樣是通過(guò)異常產(chǎn)生的。在Win32平臺(tái)下,內(nèi)存是按頁(yè)進(jìn)行劃分的,每頁(yè)的大小為4KB。每一頁(yè)內(nèi)存都有其各自的內(nèi)存屬性,常見(jiàn)的內(nèi)存屬性有只讀、可讀寫、可執(zhí)行、可共享等。內(nèi)存斷點(diǎn)的原理就是通過(guò)對(duì)內(nèi)存屬性的修改,本該允許進(jìn)行的操作無(wú)法進(jìn)行,這樣便會(huì)引發(fā)異常。

在OD中關(guān)于內(nèi)存斷點(diǎn)有兩種,一種是內(nèi)存訪問(wèn),另一種是內(nèi)存寫入。用OD隨便打開(kāi)一個(gè)應(yīng)用程序,在其“轉(zhuǎn)存窗口”(或者叫“數(shù)據(jù)窗口”)中隨便選中一些數(shù)據(jù)點(diǎn)后單擊右鍵,在彈出的菜單中選擇“斷點(diǎn)”命令,在“斷點(diǎn)”子命令下會(huì)看到“內(nèi)存訪問(wèn)”和“內(nèi)存寫入”兩種斷點(diǎn),如圖6所示。

圖6  內(nèi)存斷點(diǎn)類型

下面通過(guò)簡(jiǎn)單例子來(lái)看如何產(chǎn)生一個(gè)內(nèi)存訪問(wèn)異常,代碼如下: 

  1. #include <Windows.h>  
  2. #define MEMLEN 0x100  
  3. int main(int argc, char* argv[])  
  4.  
  5.   PBYTE pByte = NULL 
  6.   pByte = (PBYTE)malloc(MEMLEN);  
  7.   if ( pByte == NULL )  
  8.   {  
  9.     return -1;  
  10.   }  
  11.   DWORD dwProtect = 0 
  12.   VirtualProtect(pByte, MEMLEN, PAGE_READONLY, &dwProtect);  
  13.   BYTE bByte = '\xCC' 
  14.   memcpy(pByte, (const char *)&bByte, MEMLEN);  
  15.   free(pByte);  
  16.   return 0;  

這個(gè)程序中使用了VirtualProtect()函數(shù),該函數(shù)與VirtualProtectEx()函數(shù)類似,不過(guò)VirtualProtect()是用來(lái)修改當(dāng)前進(jìn)程的內(nèi)存屬性的。

對(duì)這個(gè)程序編譯連接,并運(yùn)行起來(lái)。熟悉的出錯(cuò)界面又出現(xiàn)在眼前,如圖7所示。

圖7  “異常基本信息”對(duì)話框

按照前面介紹的步驟打開(kāi)“錯(cuò)誤報(bào)告內(nèi)容”對(duì)話框,如圖8所示。

圖8  “錯(cuò)誤報(bào)告內(nèi)容”對(duì)話框

按照上面的分析方法來(lái)看一下Code和Address這兩個(gè)值。Code后面的值為0xc0000005,這個(gè)值在Winnt.h中的定義如下:

  1. #define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L) 

這個(gè)值的意義表示訪問(wèn)違例。Address后面的值為0x0000000000403093,這個(gè)值是地址,但是這里的地址根據(jù)程序來(lái)考慮,值是用malloc()函數(shù)申請(qǐng)的,用于保存數(shù)據(jù)的堆地址,而不是用來(lái)保存代碼的地址。這個(gè)地址就不進(jìn)行測(cè)試了,因?yàn)槭莿?dòng)態(tài)申請(qǐng),很可能每次不同,因此大家了解就可以了。

硬件斷點(diǎn)是由硬件進(jìn)行支持的,它是硬件提供的調(diào)試寄存器組。通過(guò)這些硬件寄存器設(shè)置相應(yīng)的值,然后讓硬件斷在需要下斷點(diǎn)的地址。在CPU上有一組特殊的寄存器,被稱作調(diào)試寄存器。該調(diào)試寄存器有8個(gè),分別是DR0—DR7,用于設(shè)置和管理硬件斷點(diǎn)。調(diào)試寄存器DR0—DR3用于存儲(chǔ)所設(shè)置硬件斷點(diǎn)的內(nèi)存地址,由于只有4個(gè)調(diào)試寄存器可以用來(lái)存放地址,因此最多只能設(shè)置4個(gè)硬件斷點(diǎn)。寄存器DR4和DR5是系統(tǒng)保留的,并沒(méi)有公開(kāi)其用處。調(diào)試寄存器DR6被稱為調(diào)試狀態(tài)寄存器,記錄了上一次斷點(diǎn)觸發(fā)所產(chǎn)生的調(diào)試事件類型信息。調(diào)試寄存器DR7用于設(shè)置觸發(fā)硬件斷點(diǎn)的條件,比如硬件讀斷點(diǎn)、硬件訪問(wèn)斷點(diǎn)或硬件執(zhí)行斷點(diǎn)。 

 

責(zé)任編輯:龐桂玉 來(lái)源: 計(jì)算機(jī)與網(wǎng)絡(luò)安全
相關(guān)推薦

2021-02-07 10:55:01

網(wǎng)絡(luò)安全文件API

2021-03-31 11:35:00

網(wǎng)絡(luò)安全OllyDbg分析工具

2021-04-14 15:53:58

網(wǎng)絡(luò)安全C語(yǔ)言wcslen

2021-02-15 15:23:03

網(wǎng)絡(luò)安全注冊(cè)表API

2016-10-10 00:18:27

2021-04-06 11:04:54

網(wǎng)絡(luò)安全C語(yǔ)言代碼

2021-05-24 11:55:55

網(wǎng)絡(luò)安全Windows鉤子函數(shù)

2011-03-17 13:32:45

2021-04-26 10:32:38

網(wǎng)絡(luò)安全PE編程工具

2021-03-03 12:20:42

網(wǎng)絡(luò)安全DLL編程

2021-04-30 18:50:44

網(wǎng)絡(luò)安全PE編程添加節(jié)區(qū)

2021-04-25 21:25:09

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全編程PE編程

2021-12-28 00:11:40

網(wǎng)絡(luò)安全攻擊

2021-01-26 13:45:03

網(wǎng)絡(luò)安全Winsock編程

2021-03-05 13:46:56

網(wǎng)絡(luò)安全遠(yuǎn)程線程

2021-02-23 10:20:07

網(wǎng)絡(luò)安全進(jìn)程代碼

2021-03-19 10:23:45

網(wǎng)絡(luò)安全內(nèi)核文件

2021-12-21 06:07:10

網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)威脅

2021-02-21 18:19:43

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全編程創(chuàng)建進(jìn)程

2021-04-13 11:15:54

網(wǎng)絡(luò)安全C語(yǔ)言循環(huán)結(jié)構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)