版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第9卷第7期2010年7月軟件導刊SoftwareGuide基于32位IntelCPU的反匯編引擎設計與實現(xiàn)閆培寧1,張戈2,謝狀平2(1.河南大學軟件學院,河南開封475001;2.河南大學計算機與信.g-工程學院,河南開封475001摘要:通過對IntelIA一32機器指令與中斷調(diào)試機制等技術(shù)的研究,采用動態(tài)反匯編技術(shù),設計了基于32位Intel系列CPU的反匯編引擎.并在此基礎(chǔ)上開發(fā)動態(tài)調(diào)試器,以實現(xiàn)應用程序的反匯編與動態(tài)調(diào)試功能。關(guān)鍵詞:反匯編;動態(tài)調(diào)試;機器指令;匯編語言中圖分類號:TP312文獻標識碼:A文章編號:1672—7800(201007-0069-03O引言反匯編技術(shù)在程序優(yōu)化、數(shù)據(jù)解密、軟件漢化、逆向軟件工程和匯編語言教學等領(lǐng)域發(fā)揮著重要的作用。主要是將編譯、封裝后的應用程序反匯編成為匯編語言代碼。供開發(fā)研究人員進行分析優(yōu)化等?;谥髁鞯牟僮飨到y(tǒng)為32位,且Intel系列及其兼容CPU應用廣泛的現(xiàn)狀.筆者根據(jù)高校在教學科研工作中的實際需要。采用動態(tài)反匯編技術(shù)設計了基于32位Intel系列CPU的反匯編引擎。并應用此反匯編引擎開發(fā)了動態(tài)調(diào)試器,實現(xiàn)了應用程序的反匯編與動態(tài)調(diào)試功能.在實際應用和教學過程中起到了良好的作用。1反匯編引擎概述反匯編引擎主要功能是將可執(zhí)行的文件中的二進制機器指令經(jīng)過分析轉(zhuǎn)變?yōu)閰R編程序。其分析轉(zhuǎn)變的依據(jù)是機器指令格式,也是機器代碼和匯編語言格式之間的橋梁。不同類型的CPU的指令格式是不同的.本文主要探討的為常用的Intel系列兼容CPU機器指令格式。以此為基石設計和開發(fā)反匯編引擎。Intel機器指令一般分為Intel64和IA一32,分別是64位指令和32位指令.本文僅討論32位指令的情況,但其中的很多內(nèi)容對于intel64也是同樣適用的。Intel64及IA一32機器指令格式如圖1所示。一條指令包括可選的指令前綴、主操作碼、由ModR/M和SIB字節(jié)組成的地址格式描述符、偏移量以及立即數(shù)。I前綴}操作碼ModR/MSIB偏移營立即數(shù)l最多4個123字節(jié)1字節(jié)1字節(jié)124字節(jié)124字節(jié)前綴每個(可選(可選(可選(可選Jl字節(jié)f可選/\765320765320匝正亟互三團區(qū)五固圖lIntel64及IA-32機器指令格式其中前綴是指令操作的輔助說明;主操作碼表示操作的類型:ModR/M字節(jié)用于編碼操作數(shù)的類型:SIB是ModR/M的擴展,SIB用于編碼尋址方式;偏移量用于編碼指令中的偏移量部分;立即數(shù)用于編碼指令中的立即數(shù)部分。匯編指令格式一般分為Intel和AT&T格式.Intel格式一般用于Windows系統(tǒng),而AT&T則用于Unix和類Unix系統(tǒng)。其中Intel匯編有著固定的格式:Label:mnemonicopemndl、operand2、?operand3。其中:(重label:為一條指令的開始.代表該條指令在內(nèi)存中的起始位置;(至mnemonic:為助記符。表示機器碼代表的操作;(要operandl、operand2、operand3:為操作數(shù).Intel指令最多可以有3個操作數(shù),當只有兩個操作碼的時候。一般第1個為目標操作碼,第2個為源操作碼。反匯編引擎的目的是將上述目標機器代碼翻譯為匯編格式指令。一般來說可以采用以下兩種方法:①設計一張龐大的操作碼表格,里面包含解析所需要的所有信息,設計一個通用的解析函數(shù)。該函數(shù)查詢操作碼在表內(nèi)對應的條目.以解析機器指令:②分別設計函數(shù)解析指令的每一組成部分,反匯編時分析讀取到的操作碼。若指令存在某組成部分則調(diào)用解析該部分的函數(shù),最后合成各組成部分的解析結(jié)果,得到最終的反匯編的指令助記符字符串。這種架構(gòu)是不依賴于表格的。作者簡介:閏培寧(1983一,男,河南鄭州人.河南大學軟件學院碩士研究生,研宄方向為軟件工程、電子政務;張戈(1983一,男,河南開封人,河南大學計算機與信息工程學院碩士研究生.研究方向為軟件工程;謝狀乎(1987一,男,湖南邵陽人,河南大學計算機與信息工程學院本科生。研究方向為Windows系統(tǒng)軟件研發(fā)。萬方數(shù)據(jù)?70?軟件導刊2010矩由于第1種方式需要維護龐大的操作碼表格,且靈活性和擴展性上不如第2種,本文采用第2種分段解析方法實現(xiàn)反匯編引擎:2反匯編引擎的設計實現(xiàn)Intel指令集是典型的CISC指令系統(tǒng)。由于計算機發(fā)展早期內(nèi)存設備昂貴,設計師充分利用了指令編碼的每一比特。對Intd指令集的解析相對復雜。指令的每個組成部分都應該設計相應的解析函數(shù),解析函數(shù)返回解析的字符串,將這些字符串組合起來反匯編為指令助記符。下面就指令主要組成部分的解析進行探討。在設計中,將一條指令對應著一個指令對象。指令對象的成員變量由其格式?jīng)Q定,具體實現(xiàn)時將指令對象設計為如下所示的結(jié)構(gòu):typedefstruct_INSTRUCrllON{CharPrefixRepeat;//重復和鎖定前綴charPrefixOperand;//操作數(shù)尺寸重載前綴charPrefixAddress;//地址尺寸重載前綴charModRM;//ModR/M字節(jié)charSIB;//SIB字節(jié)unsignedintDisplacement;//偏移量umignedintLinearAddress;//指令起始的線性地址charFlagD,nagW,FlagS;/Id,W,s位}INSTRUCTION,*PINSTRUCTION;結(jié)構(gòu)的每個成員對應著指令格式的每一個組成部分。且大小足以容納該組成部分。先將解析出的機器指令各個部分.并賦值給該指令對象相應的成員變量,最終由指令對象轉(zhuǎn)化成匯編指令格式。北指令前綴的解析解析前綴的任務是解析出當前的指令前綴并保存,供后續(xù)的解析代碼使用。解析前綴主要依據(jù)指令格式,但也會出現(xiàn)特殊情況。如對于機器代碼序列:6667266667AC。其中AC是LODSB的機器碼.但66和67都出現(xiàn)了兩次,但依據(jù)格式指令前綴分為4組.并且每組最多可以有一個前綴被使用。本文采用重復掃描的辦法來解決這個問題。具體的說,第_二遍對操作碼序列進行掃描,若檢測到上述情形則記錄重復的前綴.重新掃描該序列。當出現(xiàn)該被記錄的前綴時,將該處設為該指令的結(jié)束位置,下一指令從該處后一個位置開始掃描,如此反復。第1遍:66672666,掃描到第四個字節(jié)時發(fā)現(xiàn)66重復。則記錄該前綴;第2遍:66。當掃描第一個字節(jié)時發(fā)現(xiàn)被記錄的前綴,于是將該處設為當前指令結(jié)束處。下一條指令從67266667AC開始。對操作碼的識別是依據(jù)Intel操作碼表進行的。Intel機器碼表由數(shù)張表格組合而成,包括:單字節(jié)操作碼表,雙字節(jié)操作碼表,3字節(jié)操作碼表,組指令操作碼表.轉(zhuǎn)義操作碼表,在識別過程中需要結(jié)合使用。在設計過程中,對操作碼表的識別應當盡量抓住指令之間的規(guī)律,比如域d.w、S、reg、sre92與sre93等.此外還應盡量將操作數(shù)屬性一致的指令合并解析為一處,這樣不僅可以縮小代碼量,也易于代碼的閱讀。如以下的棧操作指令機器碼:機器碼指令助記符06pushES0EpushCS16pushSS1EpushDS07popES17popSSIFpopDS分析可知其中編碼了sre92域(包含兩位的段寄存器域,通過sre92域可以將其合并解析。對偏移量的解析是內(nèi)置于操作碼的識別過程中的,具體解析時讀取固定大小的內(nèi)容即可。立即數(shù)的解析和偏移量類似,不過立即數(shù)受s位的影響,根據(jù)S位的值進行不同的處理。SIB的解析是依據(jù)Intel體系結(jié)構(gòu)手冊中帶SIB的尋址模式表進行。因為存在re@opcede可能表現(xiàn)為操作碼擴展的情形,對ModR/M的解析一般分為R/M域和reg/opeode域進行。對32位M0dm伽解析的依據(jù)是Intel體系結(jié)構(gòu)手冊中帶ModMH的32位尋址模式表。反匯編引擎采用C“編寫,實現(xiàn)方式采用SDK的方式,即直接調(diào)用API完成所需的功能,最終的反匯編引擎為動態(tài)鏈接庫的形式。該動態(tài)鏈接庫導出一個名為Disassemble的函數(shù)供外界(如動態(tài)調(diào)試器、反編譯軟件等調(diào)用。3動態(tài)調(diào)試器的設計實現(xiàn)在實現(xiàn)反匯編引擎的基礎(chǔ)上,通過對CPU中斷、調(diào)試機制和文件格式的研究,設計實現(xiàn)動態(tài)調(diào)試器??梢赃M行可執(zhí)行程序的動態(tài)反匯編與調(diào)試,并實現(xiàn)了指令斷點設置、單步步進、單步步過、內(nèi)存與寄存器查看等功能。為了方便與用戶交互,動態(tài)調(diào)試器采用圖形界面的形式。調(diào)試事件的檢測應當是在一個無限循環(huán)里進行的,這里稱該循環(huán)為調(diào)試循環(huán)。由于圖形界面程序的緣故,程序的主線程主要用于處理圖形界面相關(guān)的一些工作的,因此將調(diào)試循環(huán)作為一個獨立的線程。具體設計是,主線程創(chuàng)建圖形界面并接受用戶的輸入。如萬方數(shù)據(jù)第7期閆培寧。張戈,謝狀平:基于32位IntelCPU的反匯編引擎設計與實現(xiàn)?71?程序在調(diào)試循環(huán)中檢測到系統(tǒng)的調(diào)試事件,此時應當將目標進程的當前狀況以某種方式反饋給用戶。并等待用戶的操作命令,即應當與用戶界面進行交互。具體的實現(xiàn)是,調(diào)試循環(huán)檢測到目標進程產(chǎn)生的調(diào)試事件,此時目標進程已被系統(tǒng)掛起,調(diào)試循環(huán)應當?shù)却脩敉ㄟ^用戶界面發(fā)出的命令,當接收到命令后做出相應的反應。特別需要注意的是,由于存在兩個線程互相等待的情形,應當進行線程同步實現(xiàn)。調(diào)試循環(huán)的偽代碼如下所示:DEBUG_EVENTstDbgEvent;while(true{WaitForDebugEvent(&stDbgEvent,INFINITE;if(stDbgEvent.dwDebugEverItCode==EXCEPn0N—DEBUGEVENTCode{cageEXCEVIION_SINGLE_STEP://將系統(tǒng)當前狀態(tài)反饋給用戶WaitForsingleObject(g_hEvent.INFINITE;//等待命令break;}}循環(huán)中首先用WaitForDebugEvent函數(shù)獲取調(diào)試事件。然后用一個分支語句檢測事件類型,當發(fā)現(xiàn)事件代碼為EXIT_PROCEKS_DEBUG_EVENT(進程退出時,用break語句結(jié)束循環(huán);在其他情況下.程序根據(jù)不同的事件碼進行不同的處理。其中WaitForSingleObject函數(shù)測試事件對象。相應的,應當在主線程向調(diào)試循環(huán)所在線程發(fā)出命令時設置事件對象SetEvent(g_hEvent。這樣調(diào)試循環(huán)所在線程的WaitForSingle動態(tài)調(diào)試器的運行效果如圖2所示。可以通過菜單或者對應的系統(tǒng)熱鍵進行操作。上圖中左上部分列出的是指令地址、指令對應的機器碼、指令助記符以及注記:右上部分列出的是運行時各寄存器的值;左下部分顯示的是目標程序的內(nèi)存數(shù)據(jù);右下部分列出的是當前的堆棧狀態(tài)。通過動態(tài)調(diào)試器可以對可執(zhí)行程序進行斷點設置、單步步進、單步步過等方式的調(diào)試。4結(jié)束語圖2動態(tài)調(diào)試器運行效果本文設計的反匯編引擎。以及在其基礎(chǔ)上實現(xiàn)的動態(tài)調(diào)試器在實際應用中起到了良好的作用。但還存在改進的空間,如反匯編引擎目前還暫不支持SIMD和浮點指令,反匯編的格式也僅支持Intel格式。對花指令、反調(diào)試技術(shù)還需要進行深入的研究。參考文獻:【1]Intel64andIA一32ArchitecturesSoftwareDeveloper'sManual[M].Volume,1999.[2]楊慕晗.一種基于中斷處理機制的動態(tài)反匯編算法[J].計算機科學,2008(12.[3]蔣烈輝,周博,費勤福,等.反匯編結(jié)果代碼結(jié)構(gòu)分析算法研究[J].小型微型計算機系統(tǒng),2007(6.[4]許敏,陳前斌.靜態(tài)反匯編算法研究[J].計算機與數(shù)字工程,2007(5.[5]楊慕晗.一種基于中斷處理機制的動態(tài)反匯編算法[J].計算機科學。2008(12.[6]羅云彬.Windows環(huán)境下32位匯編語言程序設計(第2版[M】.北京:電子工業(yè)出版社.2006.(責任編輯:王釗DesignandImplementationofDisassemblyEngineBasedon32-BitIntelCPUAbstract:Throughtheresegl'choftheIntelIA-32machineinstructionandinterruptdebuggingmechanism,thispaperadoptsthedynamicdisassemblytechnologyanddesignsthedisassemblyeng/newhichisbasedon32-bitIntelCPU.Onthebasisoftheaboveresearch,thispaperdevelopsthedynamicdebuggingtoimplementthedisassemblyanddynamicdebuggingofapplicationpr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年湖南湘潭市公安局招聘30名留置看護巡邏警務輔助人員備考考試試題附答案解析
- 2026年度臺州玉環(huán)農(nóng)商銀行招聘備考考試題庫附答案解析
- 造林安全生產(chǎn)管理制度
- 車間級安全生產(chǎn)會議制度
- 獸藥生產(chǎn)工藝管理制度
- 周生產(chǎn)交班會制度
- 充電樁安全生產(chǎn)責任制度
- 紙巾廠生產(chǎn)規(guī)章制度
- 鎮(zhèn)安全生產(chǎn)值班制度
- 工業(yè)革命新生產(chǎn)制度
- 鋼梁現(xiàn)場安裝施工質(zhì)量通病、原因分析及應對措施
- 兒童肱骨髁上骨折術(shù)
- 腰椎常見病變課件
- 對賬單模板完整版本
- 工業(yè)互聯(lián)網(wǎng)安全技術(shù)(微課版)課件全套 項目1-7 工業(yè)互聯(lián)網(wǎng)及安全認識-工業(yè)互聯(lián)網(wǎng)安全新技術(shù)認識
- 甲狀腺乳腺外科診療規(guī)范
- 退換貨方案及措施
- 麻醉科常用耗材分類與管理要點
- 材料力學性能檢驗工安全教育培訓手冊
- 小說影視化改編的深度解析
- JJF 2214-2025 機動車檢測用氣象單元校準規(guī)范
評論
0/150
提交評論