国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種訪問(wèn)vm_io地址空間的方法和用戶態(tài)調(diào)試器的制作方法

      文檔序號(hào):6581396閱讀:301來(lái)源:國(guó)知局
      專利名稱:一種訪問(wèn)vm_io地址空間的方法和用戶態(tài)調(diào)試器的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及調(diào)試技術(shù),具體涉及一種使用用戶態(tài)調(diào)試器對(duì)VM_IO地址空間的調(diào)試方法以及一種用戶態(tài)調(diào)試器。
      背景技術(shù)
      調(diào)試是指開發(fā)人員分析和定位程序故障,在被調(diào)試進(jìn)程中設(shè)置斷點(diǎn)、查看變量和寄存器、顯示堆棧和求表達(dá)式值,對(duì)被調(diào)試進(jìn)程進(jìn)行單步進(jìn)入、單步跳過(guò)、單步返回、暫掛、繼續(xù)運(yùn)行等操作,或?qū)Ρ徽{(diào)試進(jìn)程內(nèi)存進(jìn)行讀寫操作。而調(diào)試器則是執(zhí)行上述操作的一種工具性軟件。
      內(nèi)存讀取和修改是調(diào)試器的重要功能之一。在用戶態(tài)調(diào)試器中,主要通過(guò)調(diào)用ptmce()函數(shù)來(lái)實(shí)現(xiàn)對(duì)被調(diào)試進(jìn)程內(nèi)存進(jìn)行讀寫操作。ptrace()函數(shù)的定義為long ptrace(enum _ptrace_request request, pid—t pid, void *addr,void *data),其中第一個(gè)參數(shù)決定了 ptrace()函數(shù)的行為和其他參數(shù)的使用方法。當(dāng)?shù)谝粋€(gè)參數(shù)為PTRACE—PEEKTEXT時(shí),ptrace()函數(shù)就實(shí)現(xiàn)在pid進(jìn)程空間中讀取內(nèi)存地址addr的值,并將讀取到的值存入地址data中。當(dāng)?shù)谝粋€(gè)參數(shù)為PTRACE_POKETEXT時(shí),ptrace()函數(shù)就實(shí)現(xiàn)將地址data的值寫入pid進(jìn)程的內(nèi)存地址addr中。
      在嵌入式軟件開發(fā)中,往往涉及到對(duì)外部設(shè)備I/O地址空間的訪問(wèn)。以類UNIX系統(tǒng)為例,用戶進(jìn)程通過(guò)^f吏用mmap()系統(tǒng)調(diào)用,從而調(diào)用系統(tǒng)內(nèi)核中與之對(duì)應(yīng)的mmap方法。該方法是file_operations結(jié)構(gòu)體的一部分,用于請(qǐng)求將外部i殳備內(nèi)存映射到用戶進(jìn)程地址空間。成功調(diào)用mmap方法后,內(nèi)核在用戶進(jìn)程的虛擬地址空間查找一塊VMA( Virtual Memory Area,虛擬機(jī)區(qū)域)。VMA是一種位標(biāo)志,它定義在vm_area—struct結(jié)構(gòu)中。和物理頁(yè)的訪問(wèn)權(quán)限不同,VMA標(biāo)志反映了內(nèi)核處理頁(yè)面所需要遵守的行為準(zhǔn)則。同時(shí),還要對(duì)該內(nèi)存區(qū)域置上VM一IO ( Virtual Memory InputOutput,虛擬內(nèi)存輸入輸出)標(biāo)志,表明用戶程序具有能夠直接訪問(wèn)外部設(shè)備i/o地址空間的能力。通過(guò)以上的操作,就完成了用戶進(jìn)程空間的一 段地址與外部設(shè)備1/0空間的關(guān)聯(lián)。當(dāng)前用戶進(jìn)程在這段分配的地址空間
      內(nèi)進(jìn)行讀操作或?qū)懖僮?,?shí)際上就實(shí)現(xiàn)了對(duì)外部設(shè)備的訪問(wèn)。
      然而,具有VM—10標(biāo)志的內(nèi)存空間只允許當(dāng)前進(jìn)程進(jìn)行訪問(wèn),如圖 1所示,在調(diào)試狀態(tài)下,即使用戶態(tài)調(diào)試器對(duì)被調(diào)試進(jìn)程進(jìn)行 PTRACE一ATTACH操作后,也無(wú)法使用ptrace()函數(shù)對(duì)被調(diào)試進(jìn)程VM一IO 地址空間進(jìn)行讀寫操作。
      在目前的用戶態(tài)調(diào)試器中還沒(méi)有實(shí)現(xiàn)訪問(wèn)^皮調(diào)試進(jìn)程VM—IO地址空 間的功能。

      發(fā)明內(nèi)容
      本發(fā)明要解決的技術(shù)問(wèn)題是提供一種能夠訪問(wèn)VM—IO地址空間的調(diào) 試方法以及用戶態(tài)調(diào)試器。
      本發(fā)明的技術(shù)問(wèn)題通過(guò)以下技術(shù)方案加以解決
      一種訪問(wèn)VM一IO地址空間的方法,包括在被調(diào)試進(jìn)程空間中建立與 外部設(shè)備I/O地址空間關(guān)聯(lián)的VM—IO地址空間的第 一過(guò)程,還包括由分配 單元在被調(diào)試進(jìn)程空間中分配與所述VM_IO地址空間關(guān)聯(lián)的第一地址空 間,并通過(guò)調(diào)試單元對(duì)所述第一地址空間的調(diào)試實(shí)現(xiàn)對(duì)VM_IO空間進(jìn)4亍 讀訪問(wèn)或?qū)懺L問(wèn)的第二過(guò)程。
      所述第二過(guò)程實(shí)現(xiàn)對(duì)VM一IO空間進(jìn)行讀訪問(wèn)具體包括以下步驟步 驟Al.在被調(diào)試進(jìn)程空間中分配第一地址空間;步驟Bl.將所述VMjO 地址空間的數(shù)據(jù)拷貝到所述第一地址空間中;步驟Cl.用戶態(tài)調(diào)試器讀取 經(jīng)所述步驟Bl拷貝后的第一地址空間中的數(shù)據(jù)。
      所述第二過(guò)程實(shí)現(xiàn)對(duì)VM_IO空間進(jìn)行寫訪問(wèn)具體包括以下步驟步 驟A2.在被調(diào)試進(jìn)程空間中分配第一地址空間;步驟B2.用戶態(tài)調(diào)試器將 需要修改的數(shù)據(jù)寫入所述第一地址空間;步驟C2.將所述第一地址空間的 數(shù)據(jù)拷貝到所述VMJtO地址空間中。
      所述數(shù)據(jù)拷貝具體通過(guò)用戶態(tài)調(diào)試器調(diào)用Memcpy函數(shù)實(shí)現(xiàn)。
      所述第一地址空間的分配具體通過(guò)用戶態(tài)調(diào)試器調(diào)用Malloc函數(shù)實(shí)現(xiàn)。一種用戶態(tài)調(diào)試器,用于調(diào)試外部I/O地址空間,在祐 調(diào)試進(jìn)程空間 中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM一IO地址空間,包括分配單元, 用于在被調(diào)試進(jìn)程空間中分配與所述VM一IO地址空間關(guān)聯(lián)的第一地址空 間;調(diào)試單元,用于通過(guò)對(duì)所述第一地址空間的調(diào)試實(shí)現(xiàn)對(duì)VMjO空間 進(jìn)4亍讀^方問(wèn)或?qū)慯方問(wèn)。
      當(dāng)對(duì)VMJO空間進(jìn)行讀訪問(wèn)時(shí),所述分配單元還用于在被調(diào)試進(jìn)程 空間中分配第一地址空間,將所述VM_IO地址空間的數(shù)據(jù)拷貝到所述第 一地址空間中;所述調(diào)試單元還用于讀取經(jīng)所述分配單元拷貝后的第 一地 址空間中的數(shù)據(jù)。
      當(dāng)對(duì)VMJO空間進(jìn)行寫訪問(wèn)時(shí),所述分配單元還用于在被調(diào)試進(jìn)程 空間中分配第一地址空間,將需要^fi務(wù)改的數(shù)據(jù)寫入所述第一地址空間;所 述調(diào)試單元還用于將所述第一地址空間的數(shù)據(jù)拷貝到所述VM—IO地址空 間中。
      所述調(diào)試單元還用于通過(guò)調(diào)用Memcpy函數(shù)實(shí)現(xiàn)數(shù)據(jù)拷貝。
      所述分配單元還用于通過(guò)調(diào)用Malloc函數(shù)實(shí)現(xiàn)所述第一地址空間的 分配。
      本發(fā)明與現(xiàn)有技術(shù)相比較的有益效果是
      本發(fā)明通過(guò)在^皮調(diào)試進(jìn)程中分配第一地址空間,將VMJO地址空間 的數(shù)據(jù)拷貝至該第一地址空間,通過(guò)調(diào)試進(jìn)程對(duì)第一地址空間數(shù)據(jù)的讀取 實(shí)現(xiàn)了對(duì)VM_IO地址空間數(shù)據(jù)的讀??;本發(fā)明通it^被調(diào)試進(jìn)程中分配 第一地址空間,將需要^"改的凄t據(jù)寫入至該地址空間,并通過(guò)當(dāng)前進(jìn)程將 該地址空間的數(shù)據(jù)拷貝到VMJO地址空間,實(shí)現(xiàn)了對(duì)VM—IO地址空間數(shù) 據(jù)的4務(wù)改;可見(jiàn),本發(fā)明通過(guò)在被調(diào)試進(jìn)程中分配與VM—IO地址空間關(guān) 聯(lián)的第一地址空間,對(duì)該地址空間的調(diào)試間接實(shí)現(xiàn)對(duì)VM_IO地址空間的 讀/寫訪問(wèn),從而解決了現(xiàn)有技術(shù)中無(wú)法在調(diào)試中訪問(wèn)VMJO地址空間 的問(wèn)題;并通過(guò)VM_IO地址空間與設(shè)備地址空間的關(guān)聯(lián),實(shí)現(xiàn)對(duì)外部設(shè) 備的調(diào)試。
      本發(fā)明通過(guò)使用Malloc來(lái)分配空間、使用Memcpy來(lái)拷貝數(shù)據(jù),實(shí)現(xiàn) 簡(jiǎn)單、方便。


      圖l是現(xiàn)有技術(shù)用戶態(tài)調(diào)試器結(jié)構(gòu)示意圖2是本發(fā)明用戶態(tài)調(diào)試器一種具體實(shí)施方式
      結(jié)構(gòu)示意圖3是本發(fā)明調(diào)試方法實(shí)施例1讀取^皮調(diào)試進(jìn)程VM_IO地址空間的 流程圖4是本發(fā)明調(diào)試方法實(shí)施例1對(duì)訪問(wèn)內(nèi)存地址進(jìn)行分析的流程圖5是本發(fā)明調(diào)試方法實(shí)施例1在被調(diào)試進(jìn)程空間中運(yùn)行malloc()函 數(shù)的流程圖6是本發(fā)明調(diào)試方法實(shí)施例1在被調(diào)試進(jìn)程空間中運(yùn)行malloc()函 數(shù)的堆棧構(gòu)建布局示意圖7是本發(fā)明調(diào)試方法實(shí)施例1返回信號(hào)處理的流程圖; 圖8是本發(fā)明調(diào)試方法實(shí)施例1在被調(diào)試進(jìn)程空間中運(yùn)行memcpy() 函數(shù)的流程圖9是本發(fā)明調(diào)試方法實(shí)施例1在被調(diào)試進(jìn)程空間中運(yùn)行memcpy() 函數(shù)的堆棧構(gòu)建布局示意圖10是發(fā)明調(diào)試方法實(shí)施例2修改被調(diào)試進(jìn)程VM_IO地址空間的流 程圖。
      具體實(shí)施例方式
      下面用具體實(shí)施方式
      結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步詳細(xì)說(shuō)明。
      本發(fā)明一種用戶態(tài)調(diào)試器,其一種具體實(shí)施方式
      ,如圖2所示,用于 調(diào)試外部I/O地址空間,在用戶進(jìn)程中建立與外部設(shè)備I/O地址空間關(guān)聯(lián) 的VM—IO地址空間,該調(diào)試器包括分配單元,用于在凈皮調(diào)試地址空間 中分配與所述VM—IO地址空間關(guān)聯(lián)的第一地址空間;調(diào)試單元,用于通 過(guò)對(duì)所述第一地址空間的調(diào)試實(shí)現(xiàn)對(duì)VM—IO空間進(jìn)行讀或?qū)懺L問(wèn)。
      當(dāng)對(duì)VM一IO空間進(jìn)行讀訪問(wèn)時(shí),分配單元還用于在^f皮調(diào)試進(jìn)程空間 中分配第 一地址空間,將VM_IO地址空間的數(shù)據(jù)拷貝到第 一地址空間中; 調(diào)試單元還用于讀取經(jīng)分配單元拷貝后第一地址空間中的數(shù)據(jù)。
      當(dāng)對(duì)VMJO空間進(jìn)行寫訪問(wèn)時(shí),分配單元還用于在凈皮調(diào)試進(jìn)程空間 中分配第一地址空間,將需要修改的數(shù)據(jù)寫入第一地址空間;調(diào)試單元還用于將第一地址空間的數(shù)據(jù)拷貝到VM—IO地址空間中。對(duì)VM—IO空間進(jìn) 行讀訪問(wèn)時(shí)分配的第一地址空間,和對(duì)VM—IO空間進(jìn)行寫訪問(wèn)時(shí)分配的 第 一地址空間可以是同 一地址空間,也可以是不同的地址空間。
      調(diào)試單元還用于通過(guò)調(diào)用Memcpy函數(shù)實(shí)現(xiàn)數(shù)據(jù)拷貝。
      分配單元還用于通過(guò)調(diào)用Malloc函數(shù)實(shí)現(xiàn)所述第一地址空間的分配。
      本發(fā)明使用用戶態(tài)調(diào)試器的調(diào)試方法,其一種具體實(shí)施方式
      ,包括在 用戶進(jìn)程中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM一IO地址空間的笫一過(guò) 程,還包括在被調(diào)試地址空間中分配與VM—IO地址空間關(guān)聯(lián)的第一地址 空間,并通過(guò)對(duì)第一地址空間的調(diào)試實(shí)現(xiàn)對(duì)VM—IO空間進(jìn)行讀或?qū)懺L問(wèn) 的第二過(guò)程。
      該第二過(guò)程實(shí)現(xiàn)對(duì)VM_IO空間進(jìn)行讀訪問(wèn)具體包括以下步驟
      步驟Al.在^皮調(diào)試進(jìn)程空間中分配第一地址空間;
      步驟B1.將VM_IO地址空間的數(shù)據(jù)拷貝到第 一地址空間中;
      步驟Cl.用戶態(tài)調(diào)試器讀取經(jīng)步驟Bl拷貝后第一地址空間中的數(shù)據(jù)。
      該第二過(guò)程實(shí)現(xiàn)對(duì)VM_IO空間進(jìn)行寫訪問(wèn)具體包括以下步驟
      步驟A2.在被調(diào)試進(jìn)程空間中分配第一地址空間;
      步驟B2.用戶態(tài)調(diào)試器將需要^^改的數(shù)據(jù)寫入第一地址空間;
      步驟C2.將第一地址空間的數(shù)據(jù)拷貝到VM_IO地址空間中。
      數(shù)據(jù)拷貝具體可通過(guò)用戶態(tài)調(diào)試器調(diào)用Memcpy函數(shù)實(shí)現(xiàn)。
      第一地址空間的分配具體通過(guò)用戶態(tài)調(diào)試器調(diào)用Malloc函數(shù)實(shí)現(xiàn)。
      本發(fā)明使用用戶態(tài)調(diào)試器的調(diào)試方法,其另一種具體實(shí)施方式
      ,以在 x86體系中運(yùn)用為例,包括讀取被調(diào)試進(jìn)程VM_IO地址空間的實(shí)施例1 和修 文被調(diào)試進(jìn)程VM—IO地址空間的實(shí)施例2。
      實(shí)施例1:
      如圖3所示,讀取4皮調(diào)試進(jìn)程VM—IO地址空間的整個(gè)流程包括以下 步驟
      步驟301:讀取凈皮調(diào)試進(jìn)程的maps文件內(nèi)容,分析待讀取的內(nèi)存地址;
      步驟302:判斷待讀取的內(nèi)存地址是否有效,即是否在被調(diào)試進(jìn)程的 虛擬地址空間中并且具有可讀屬性,若有效轉(zhuǎn)入步驟303,否則轉(zhuǎn)入步驟
      8311;
      步驟303:分析符號(hào)表通過(guò)調(diào)用BFD庫(kù)(Binary File Descriptor, 二 進(jìn)制文件描述符)的相關(guān)4妄口,讀取被調(diào)試進(jìn)程的可執(zhí)行文件和加載的所 有動(dòng)態(tài)庫(kù),獲取所有符號(hào)的名稱、虛擬地址和符號(hào)類型信息,并把這些符 號(hào)信息以符號(hào)名為關(guān)鍵字,建立hash表;
      步驟304:在符號(hào)hash表中查找malloc()函數(shù)的入口地址; 步驟305:判斷malloc()函數(shù)是否存在,若存在轉(zhuǎn)入步驟306,否則轉(zhuǎn) 入步驟311;
      步驟306:在被調(diào)試進(jìn)程中運(yùn)行malloc()函數(shù),分配一塊新的內(nèi)存空間
      作為第一地址空間;
      步驟307:在符號(hào)hash表中查找memcpy()函數(shù)的入口地址; 步驟308:判斷memcpy()函數(shù)是否存在,若存在轉(zhuǎn)入步驟309,否則
      轉(zhuǎn)入步驟311;
      步驟309:在被調(diào)試進(jìn)程中運(yùn)行memcpy()函數(shù),拷貝VMJO地址空 間的數(shù)據(jù)到第 一地址空間;
      步驟310:按照一般讀取被調(diào)試進(jìn)程內(nèi)存的方式,用戶態(tài)調(diào)試器調(diào)用 ptrace()函數(shù),從被調(diào)試進(jìn)程第 一地址空間中獲取到的值即是VM_IO地址 空間中的值,流程結(jié)束;
      步驟311:報(bào)警,流程結(jié)束。
      本實(shí)施例中,步驟301對(duì)訪問(wèn)內(nèi)存地址分析流程,其一種實(shí)施方式如 圖4所示,包括以下步驟
      步驟401:判斷打開被調(diào)試進(jìn)程m叩s文件是否成功,若成功轉(zhuǎn)入步驟 402,否則流程結(jié)束;
      步驟402:判斷被調(diào)試進(jìn)程maps文件內(nèi)容是否讀取完畢,是則結(jié)束流 程,否則轉(zhuǎn)入步驟403;
      步驟403:讀取被調(diào)試進(jìn)程maps文件的一條記錄;
      步驟404:獲取虛擬內(nèi)存的屬性和地址范圍;
      步驟405:判斷虛擬地址是否可讀或可寫,是則轉(zhuǎn)入步驟406;否則轉(zhuǎn) 入步驟402;步驟406:判斷訪問(wèn)內(nèi)存地址是否有效,有效則轉(zhuǎn)入步驟407;否則轉(zhuǎn) 入步驟402;
      步驟407:將訪問(wèn)內(nèi)存地址屬性置為真,即為有效,流程結(jié)束。
      本實(shí)施例中,步驟306運(yùn)行malloc()分配第一地址空間的流程,其一 種實(shí)施方式,如圖5所示,進(jìn)一步包括以下步驟
      步驟501:停止^皮調(diào)試進(jìn)程的運(yùn)行;
      步驟502:保存當(dāng)前所有寄存器的值;
      步驟503:根據(jù)CPU的類型,本例為X86,在^皮調(diào)試進(jìn)程的堆棧上構(gòu) 建運(yùn)行malloc()函數(shù)的參數(shù)及返回地址,或者獲取當(dāng)前sp寄存器(堆棧寄 存器)的值,將malloc()函數(shù)的參數(shù)size及返回地址寫入當(dāng)前堆棧;
      步驟504:將新的棧頂?shù)刂穼懭雜p寄存器,構(gòu)建后的堆棧如圖6所示, 其中參數(shù)size為分配內(nèi)存空間的大小,返回地址為一個(gè)非法地址,用于返 回異常信號(hào);再將pc寄存器(程序計(jì)數(shù)寄存器)的值改為malloc()函數(shù)的 入口地址;
      步驟505:恢復(fù)被調(diào)試進(jìn)程的運(yùn)行;
      步驟506:獲取異常信號(hào)。由于構(gòu)建malloc()函數(shù)的堆棧時(shí),將返回地 址設(shè)為一個(gè)非法地址。當(dāng)運(yùn)行malloc()函數(shù)結(jié)束時(shí),進(jìn)程會(huì)返回一個(gè)異常 信號(hào)。用戶態(tài)調(diào)試器獲取到該信號(hào),說(shuō)明被調(diào)試進(jìn)程運(yùn)行malloc()函數(shù)成
      功;
      步驟507:從eax寄存器中獲取malloc()函數(shù)的返回值,該值就是在被 調(diào)試進(jìn)程空間中新分配的內(nèi)存起始地址;
      步驟508:恢復(fù)運(yùn)行malloc()函數(shù)前所有寄存器的值,流程結(jié)束。 本實(shí)施例中,步驟506獲取異常信號(hào)的流程,如圖7所示,包括以下 步驟
      步驟701:等待被調(diào)試進(jìn)程的異步信號(hào);
      步驟702:判斷是否為異常信號(hào),是則轉(zhuǎn)入步驟704;否則轉(zhuǎn)入步驟
      703;
      步驟703:處理異步信號(hào),轉(zhuǎn)入步驟701; 步驟704:獲:^行函數(shù)返回值,流程結(jié)束。本實(shí)施例的步驟309使用memcpy()拷貝數(shù)據(jù)的流程,如圖8所示,包 括以下步驟
      步驟801:停止被調(diào)試進(jìn)程的運(yùn)行;
      步驟802:保存當(dāng)前所有寄存器的值;
      步驟803:根據(jù)CPU的類型,本例為X86,在被調(diào)試進(jìn)程的堆棧上構(gòu) 建運(yùn)行memcpy()函數(shù)的參數(shù)及返回地址,或者獲取當(dāng)前sp寄存器(堆棧 寄存器)的值,將memcpy()函數(shù)的參數(shù)to、 from、 size及返回地址寫入當(dāng)
      前堆棧;
      步驟804:將新的棧頂?shù)刂穼懭雜p寄存器,構(gòu)建后的堆棧如圖9所示, 將返回地址設(shè)為一個(gè)非法地址;再將pc寄存器(程序計(jì)數(shù)寄存器)的值改 為memcpy()函數(shù)的入口地*址;
      步驟805:恢復(fù)被調(diào)試進(jìn)程的運(yùn)行;
      步驟806:獲取異常信號(hào)。由于構(gòu)建memcpy()函數(shù)的堆棧時(shí),同樣將 返回地址設(shè)為一個(gè)非法地址,當(dāng)運(yùn)行memcpy()函數(shù)結(jié)束時(shí),進(jìn)程會(huì)返回一 個(gè)異常信號(hào)。用戶態(tài)調(diào)試器獲取到該信號(hào),說(shuō)明被調(diào)試進(jìn)程運(yùn)行memcpy() 函數(shù)成功;
      步驟807:恢復(fù)運(yùn)行memcpy()函數(shù)前所有寄存器的值,流程結(jié)束 這樣就將凈皮調(diào)試進(jìn)程VM一IO地址空間中的值拷貝到第一地址空間中了。
      實(shí)施例2:
      如圖IO所示,修 文被調(diào)試進(jìn)程VMjO地址空間的整個(gè)流程包括以下 步驟
      步驟1001:讀取4皮調(diào)試進(jìn)程的maps文件內(nèi)容,分析待讀取的內(nèi)存地
      址;
      步驟1002:判斷內(nèi)存地址是否有效,即待修改的內(nèi)存地址是否在被調(diào) 試進(jìn)程的虛擬地址空間中并且具有可寫屬性,若有效轉(zhuǎn)入步驟1003,否則 轉(zhuǎn)入步驟1011;
      步驟1003:分析符號(hào)表通過(guò)調(diào)用BFD庫(kù)的相關(guān)接口 ,讀取被調(diào)試 進(jìn)程的可執(zhí)^f亍文件和加栽的所有動(dòng)態(tài)庫(kù),獲取所有符號(hào)的名稱、虛擬地址
      和符號(hào)類型信息,并把這些符號(hào)信息以符號(hào)名為關(guān)鍵字,建立hash表;步驟1004:在符號(hào)hash表中查找malloc()函數(shù)的入口地址;
      步驟1005:判斷malloc()函數(shù)是否存在,若存在轉(zhuǎn)入步驟1006,否則 轉(zhuǎn)入步驟1011;
      步驟1006:在被調(diào)試進(jìn)程中運(yùn)行malloc()函數(shù),分配一塊新的內(nèi)存空 間作為第 一地址空間;首先停止被調(diào)試進(jìn)程的運(yùn)行并且保存當(dāng)前所有寄存 器的值。然后獲取當(dāng)sp寄存器(堆棧寄存器)的值,將malloc()函數(shù)的參 數(shù)size及返回地址寫入當(dāng)前堆棧,并將新的棧頂?shù)刂穼懭雜p寄存器。構(gòu)建 后的堆棧,其中參數(shù)size為分配內(nèi)存空間的大小,返回地址為一個(gè)非法地 址,用于返回異常信號(hào);再將pc寄存器(程序計(jì)數(shù)寄存器)的值改為malloc() 函數(shù)的入口地址;最后恢復(fù)被調(diào)試進(jìn)程的運(yùn)行;
      由于構(gòu)建malloc()函數(shù)的堆棧時(shí),將返回地址設(shè)為一個(gè)非法地址。當(dāng) 運(yùn)行malloc()函數(shù)結(jié)束時(shí),進(jìn)程會(huì)返回一個(gè)異常信號(hào)。用戶態(tài)調(diào)試器獲取 到該信號(hào),說(shuō)明被調(diào)試進(jìn)程運(yùn)行malloc()函數(shù)成功。然后從eax寄存器中 獲取malloc()函數(shù)的返回值,該值就是在被調(diào)試進(jìn)程空間中新分配的內(nèi)存 起始地址,同時(shí)恢復(fù)運(yùn)行malloc()函數(shù)前所有寄存器的值;
      步驟1007:按照一般修改被調(diào)試進(jìn)程內(nèi)存的方式,用戶態(tài)調(diào)試器調(diào)用
      ptrace()函數(shù),將數(shù)據(jù)寫入被調(diào)試進(jìn)程的第一地址空間;
      步驟1008:在符號(hào)hash表中查找memcpy()函數(shù)的入口地址;
      步驟1009:判斷memcpy()函數(shù)是否存在,若存在轉(zhuǎn)入步驟1010,否
      則轉(zhuǎn)入步驟1011;
      步驟1010:在被調(diào)試進(jìn)程中運(yùn)行memcpy()函數(shù),將第一地址空間的 數(shù)據(jù)拷貝到VM—10地址空間。首先停止被調(diào)試進(jìn)程的運(yùn)行并且保存當(dāng)前 所有寄存器的值。然后獲取當(dāng)sp寄存器(堆棧寄存器)的值,將memcpy() 函數(shù)的參數(shù)to、 from、 size及返回地址寫入當(dāng)前堆棧,并將新的棧頂?shù)刂?寫入sp寄存器。再將pc寄存器(程序計(jì)數(shù)寄存器)的值改為memcpy() 函數(shù)的入口地址,最后恢復(fù)被調(diào)試進(jìn)程的運(yùn)行;
      由于構(gòu)建memcpy()函數(shù)的堆棧時(shí),同樣將返回地址設(shè)為一個(gè)非法地 址。當(dāng)運(yùn)行memcpy()函數(shù)結(jié)束時(shí),進(jìn)程會(huì)返回一個(gè)異常信號(hào)。用戶態(tài)調(diào)試 器獲取到該信號(hào),說(shuō)明被調(diào)試進(jìn)程運(yùn)行memcpy()函數(shù)成功。同時(shí)恢復(fù)運(yùn)行 memcpy()函數(shù)前所有寄存器的值。此時(shí)就將被調(diào)試進(jìn)程新分配的內(nèi)存空間中的值拷貝到VM—IO地址空間中,完成用戶態(tài)調(diào)試器修改被調(diào)試進(jìn)程 VMJO地址空間的才喿作;流程結(jié)束。
      步驟1011:報(bào)警,流程結(jié)束。
      權(quán)利要求
      1.一種訪問(wèn)VM_IO地址空間的方法,包括在被調(diào)試進(jìn)程空間中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM_IO地址空間的第一過(guò)程,其特征在于,還包括由分配單元在被調(diào)試進(jìn)程空間中分配與所述VM_IO地址空間關(guān)聯(lián)的第一地址空間,并通過(guò)調(diào)試單元對(duì)所述第一地址空間的調(diào)試實(shí)現(xiàn)對(duì)VM_IO空間進(jìn)行讀訪問(wèn)或?qū)懺L問(wèn)的第二過(guò)程。
      2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述第二過(guò)程實(shí)現(xiàn)對(duì)VM_IO空間進(jìn)行讀訪問(wèn)具體包括以下步驟步驟Al.在被調(diào)試進(jìn)程空間中分配笫一地址空間;步驟Bl.將所述VM—IO地址空間的數(shù)據(jù)拷貝到所述第一地址空間中;步驟Cl.用戶態(tài)調(diào)試器讀取經(jīng)所述步驟B1拷貝后的第一地址空間中的數(shù)據(jù)。
      3. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述第二過(guò)程實(shí)現(xiàn)對(duì)VM_IO空間進(jìn)行寫訪問(wèn)具體包括以下步驟步驟A2.在被調(diào)試進(jìn)程空間中分配第一地址空間;步驟B2.用戶態(tài)調(diào)試器將需要修改的數(shù)據(jù)寫入所述第一地址空間;步驟C2.將所迷第一地址空間的數(shù)據(jù)拷貝到所述VM—IO地址空間中。
      4. 根據(jù)權(quán)利要求2或3所述的方法,其特征在于,所述數(shù)據(jù)拷貝具體通過(guò)用戶態(tài)調(diào)試器調(diào)用Memcpy函數(shù)實(shí)現(xiàn)。
      5. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述第一地址空間的分配具體通過(guò)用戶態(tài)調(diào)試器調(diào)用Malloc函數(shù)實(shí)現(xiàn)。
      6. —種用戶態(tài)調(diào)試器,用于調(diào)試外部1/0地址空間,在凈皮調(diào)試進(jìn)程空間中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM—IO地址空間,其特征在于,包括分配單元,用于在祐L調(diào)試進(jìn)程空間中分配與所述VM_IO地址空間關(guān)聯(lián)的第一地址空間;調(diào)試單元,用于通過(guò)對(duì)所述第一地址空間的調(diào)試實(shí)現(xiàn)對(duì)VM_IO空間進(jìn)4亍讀訪問(wèn)或?qū)懺L問(wèn)。
      7. 根據(jù)權(quán)利要求6所述的調(diào)試器,其特征在于,當(dāng)對(duì)VM—IO空間進(jìn)行讀訪問(wèn)時(shí),所述分配單元還用于在被調(diào)試進(jìn)程空間中分配第一地址空間,將所述VM—10地址空間的數(shù)據(jù)拷貝到所述第一地址空間中;所述調(diào)試單元還用于讀取經(jīng)所述分配單元拷貝后的第一地址空間中的數(shù)據(jù)。
      8. 根據(jù)權(quán)利要求6所述的調(diào)試器,其特征在于,當(dāng)對(duì)VM—IO空間進(jìn)行寫訪問(wèn)時(shí),所述分配單元還用于在凈皮調(diào)試進(jìn)程空間中分配第一地址空間,將需要修改的數(shù)據(jù)寫入所述第一地址空間;所述調(diào)試單元還用于將所述第一地址空間的數(shù)據(jù)拷貝到所述VMJO地址空間中。
      9. 根據(jù)權(quán)利要求7或8所述的調(diào)試器,其特征在于,所述調(diào)試單元還用于通過(guò)調(diào)用Memcpy函數(shù)實(shí)現(xiàn)數(shù)據(jù)拷貝。
      10. 根據(jù)權(quán)利要求6所述的調(diào)試器,其特征在于,所述分配單元還用于通過(guò)調(diào)用Malloc函數(shù)實(shí)現(xiàn)所述第一地址空間的分配。
      全文摘要
      本發(fā)明公開了一種訪問(wèn)VM_IO地址空間的方法,包括在被調(diào)試進(jìn)程空間中建立與外部設(shè)備I/O地址空間關(guān)聯(lián)的VM_IO地址空間的第一過(guò)程,還包括由分配單元在被調(diào)試進(jìn)程空間中分配與所述VM_IO地址空間關(guān)聯(lián)的第一地址空間,并通過(guò)調(diào)試單元對(duì)所述第一地址空間的調(diào)試實(shí)現(xiàn)對(duì)VM_IO空間進(jìn)行讀訪問(wèn)或?qū)懺L問(wèn)的第二過(guò)程。本發(fā)明還公開了一種用戶態(tài)調(diào)試器。本發(fā)明通過(guò)在被調(diào)試進(jìn)程中分配與VM_IO地址空間關(guān)聯(lián)的第一地址空間,對(duì)該地址空間的調(diào)試可以間接實(shí)現(xiàn)對(duì)VM_IO地址空間的讀/寫訪問(wèn),從而解決了現(xiàn)有技術(shù)中無(wú)法在調(diào)試中訪問(wèn)VM_IO地址空間的問(wèn)題。
      文檔編號(hào)G06F11/36GK101650688SQ20091019000
      公開日2010年2月17日 申請(qǐng)日期2009年8月31日 優(yōu)先權(quán)日2009年8月31日
      發(fā)明者紅 向, 吳春江, 程圣宇 申請(qǐng)人:中興通訊股份有限公司
      網(wǎng)友詢問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1