国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

32位Windows系統(tǒng)下PE文件格式的漏洞研究

2011-03-26 07:32:16陳明葉培順
電子設(shè)計(jì)工程 2011年14期
關(guān)鍵詞:字段漏洞代碼

陳明,葉培順

(1.西安文理學(xué)院計(jì)算機(jī)科學(xué)系,陜西西安710065;2.榆林學(xué)院信息工程學(xué)院,陜西榆林719000)

可移植的執(zhí)行體(Portable Executable,PE)文件格式是微軟制定的一種文件標(biāo)準(zhǔn),它是從普遍運(yùn)用于UNIX操作系統(tǒng)的COFF(Common Object File Format)發(fā)展而來,是目前Windows平臺(tái)上的主流可執(zhí)行文件的文件格式,應(yīng)用于所有的32位Windows[1]。

從某種意義上講,可執(zhí)行文件的格式是操作系統(tǒng)本身執(zhí)行機(jī)制的反映?;赑E文件格式的研究層出不窮,及這方面的漏洞分析不容忽視,本文就此作了探討。

1 PE文件框架結(jié)構(gòu)

PE文件主要由DOS部首,PE文件頭,節(jié)表,節(jié)和輔助結(jié)構(gòu)等5部分組成,如圖1所示。其中的數(shù)據(jù)結(jié)構(gòu)通常定義在WINNT.H[2]。

2 基于PE文件格式研究的應(yīng)用

圖1 PE文件架構(gòu)Fig.1 PE file structure

行信息嵌入的方法,但只適用于未編譯的PE文件源代碼中進(jìn)行信息隱藏)和文件病毒領(lǐng)域。

2.1 向PE文件中添加可執(zhí)行代碼

PE文件的數(shù)據(jù)結(jié)構(gòu)在磁盤和內(nèi)存中是一樣的,裝載一個(gè)可執(zhí)行文件到內(nèi)存中,它不是作為單一內(nèi)存映射文件被載入內(nèi)存的,Windows加載器遍歷PE文件并決定文件的哪一部分被映射。依據(jù)PE文件的存儲(chǔ)結(jié)構(gòu)及其加載過程,得出兩種典型的向PE文件中添加代碼的方法[3]。

2.1.1 插 入方式

PE文件在磁盤中,節(jié)與節(jié)之間必須遵循文件對(duì)齊原則,

結(jié)合PE文件自身的結(jié)構(gòu)特點(diǎn),2.1闡述PE文件的修改思想,很多進(jìn)一步的應(yīng)用開發(fā)都是建立在此原理之上,比如在加密解密領(lǐng)域(在PE文件的冗余空間中插入加密解密程序的代碼),信息隱藏領(lǐng)域(主流的方法是利用PE文件中存在的冗余空間和冗余字段進(jìn)行信息嵌入,該方法不會(huì)改變PE文件長度和結(jié)構(gòu)。也可利用靜態(tài)分配字符串存儲(chǔ)空間進(jìn)以利于PE文件快速定位,而程序的代碼或數(shù)據(jù)可能沒有占滿該節(jié),造成冗余空間,可乘機(jī)插入代碼,實(shí)現(xiàn)思想如下:

由DOS頭結(jié)構(gòu)字段e_lfanew定位PE頭結(jié)構(gòu)位置;讀取PE頭,得到節(jié)個(gè)數(shù)字段Number Of Sections;依據(jù)節(jié)個(gè)數(shù)分配節(jié)表緩沖區(qū)讀取所有節(jié)表到緩沖區(qū);遍歷每個(gè)節(jié),空白區(qū)的文件偏移等于(Pointer To Raw Data+Virtual Size);空白區(qū)大小為該節(jié)實(shí)際占用磁盤空間減去該節(jié)實(shí)際大?。⊿ize Of Raw Data-Virtual Size);修改節(jié)表結(jié)構(gòu)讓緩沖區(qū)中每個(gè)節(jié)表的字段Virtual Size等于字段Size Of Raw Data;將緩沖區(qū)數(shù)據(jù)寫入。

2.1.2 附 加方式

對(duì)于絕大多數(shù)編譯器生成的PE文件,在最后一個(gè)節(jié)表結(jié)構(gòu)和第一個(gè)節(jié)數(shù)據(jù)區(qū)之間存在一個(gè)空白區(qū),如圖1所示的UNUSED區(qū)。往往足以插入一個(gè)新的節(jié)表結(jié)構(gòu)(每個(gè)節(jié)表結(jié)構(gòu)大小是28HB),實(shí)現(xiàn)思想如下:

計(jì)算Number Of Sections*0x28+e_l fanew+size of(IMAGE_NT_HEADER),得到要添加新節(jié)頭的起始地址;根據(jù)Pointer To Raw Data=(最后一節(jié)的Pointer To Raw Data+最后一節(jié)的Size Of Raw Data)和Size Of Raw Data/Virtual Size=((要添加的代碼長度/File Alignment+1)*File Alignment)賦值給節(jié)頭結(jié)構(gòu)中的對(duì)應(yīng)變量。修改Number Of Sections,Size Of Image等字段。在這里一定要注意,依照Section Alignment對(duì)齊Virtual Size和Virtual Address同樣依照File Alignment Size Of Raw Data和Pointer To Raw Data;根據(jù)不同需要設(shè)置屬性字段等。

2.2 文件病毒領(lǐng)域

以插入方式添加的病毒代碼,如CIH病毒。對(duì)于存在空白空間的節(jié),可以通過修改節(jié)表結(jié)構(gòu),讓Virtual Size等于Size Of Raw Data,然后在空白空間中插入隨機(jī)數(shù)據(jù)欺騙病毒,使它無法以這種方式感染PE文件。

以附加方式添加的病毒代碼,如勞拉病毒。修改PE文件時(shí)在最后一個(gè)節(jié)表和第一個(gè)節(jié)數(shù)據(jù)區(qū)的空白區(qū)插入了一個(gè)新的節(jié)表結(jié)構(gòu),用以描述在文件尾部附加一個(gè)新的節(jié)存放病毒代碼。由于PE頭文件、節(jié)表結(jié)構(gòu)是相連的,如果將這兩個(gè)結(jié)構(gòu)往下移動(dòng)到與第一個(gè)節(jié)數(shù)據(jù)區(qū)相連,病毒就無法插入。PE頭文件和節(jié)表結(jié)構(gòu)在文件中的位置是由DOS頭結(jié)構(gòu)中的字段e_lfanew決定,修改該值并把兩個(gè)結(jié)構(gòu)向下移動(dòng)到連接第一個(gè)節(jié)就可以防范病毒插入節(jié)表結(jié)構(gòu),有效禁止了添加新節(jié)。

最新的研究是建立自免疫防病毒系統(tǒng):在文件中某個(gè)不固定的空白位置存儲(chǔ)文件的重要數(shù)據(jù),如果非覆蓋型文件病毒修改文件的任何一個(gè)字節(jié),程序啟動(dòng)時(shí)會(huì)計(jì)算當(dāng)前的CRC32校驗(yàn)值并和原來存儲(chǔ)的CRC32值相比較,若相等,則跳轉(zhuǎn)到原來程序入口繼續(xù)運(yùn)行,否則從自身釋放出一個(gè)修復(fù)程序,并關(guān)閉當(dāng)前程序由修復(fù)程序?qū)ξ募M(jìn)行恢復(fù)操作,完成修復(fù)后調(diào)用被修復(fù)文件然后刪除自己,刪除方法是是先生成一個(gè)批處理文件,然后用函數(shù)ShellExecute調(diào)用批處理文件后退出進(jìn)程,在批處理文件中循環(huán)刪除主文件,直到主文件的進(jìn)程退出,批處理程序才能刪除主文件,然后讓批處理文件刪除自身。

3 漏洞分析

3.1 應(yīng)用程序接口(API)函數(shù)地址的獲取

PE文件在編譯和連接成功后,會(huì)有一個(gè)IAT。當(dāng)需要執(zhí)行API的時(shí)候,會(huì)先在IAT中得到API的地址,然后調(diào)用它。當(dāng)往PE文件中插入可執(zhí)行代碼時(shí),情況不同,可執(zhí)行代碼是在PE文件編譯好之后才插入,它本身沒有導(dǎo)入表,為了在插入代碼中調(diào)用API函數(shù),必須獲取API函數(shù)的線性地址[4]。(某些情況下可以搜索宿主的導(dǎo)入表獲得GetProcAddress和GetModuleHandleA函數(shù),然后通過它們返回系統(tǒng)的DLL,進(jìn)而獲得其中的API函數(shù),但在宿主沒有使用GetProcAddree函數(shù)的時(shí)候,這種方法行不通。)而要得到API的地址,必須用到Loadlibrary和GetProcAddress函數(shù),這兩個(gè)函數(shù)在Kernel32.dll中。如圖2,CreatProcess函數(shù)在完成裝載應(yīng)用程序后,會(huì)將一個(gè)返回地址壓入堆棧并轉(zhuǎn)而執(zhí)行應(yīng)用程序,這個(gè)保存在堆棧頂?shù)臄?shù)據(jù)就在Kernal32.dll中的返回地址。因此只要從返回地址按照頁對(duì)齊的邊界一頁頁地往低地址搜索,就必然可以找到Kernel32.dll文件頭地址,搜索它的導(dǎo)出表,并從導(dǎo)出表的信息中查找到Loadlibrary和GetProcAddress函數(shù)的地址,利用這兩個(gè)函數(shù)得到想要的API函數(shù)。(對(duì)于給定的API函數(shù),也可以直接在Kernel32.dll的導(dǎo)出表中搜索其地址。)

圖2 Win32可執(zhí)行文件的執(zhí)行過程Fig.2 Executing process of Win32 EXE files

3.2 Win32體系結(jié)構(gòu)下基于PE文件格式的4個(gè)漏洞

上面的研究表明:由于節(jié)的對(duì)齊粒度固定,造成節(jié)與節(jié)之間可能存在虛擬自由空間,這些空間成為嵌入代碼的隱藏地和更具規(guī)模的移動(dòng)代碼的發(fā)射臺(tái),從而引起安全危機(jī)。具體漏洞如下所示:

1)模糊的將DLL可執(zhí)行體鏈接到進(jìn)程,尤其是GetProcAddress和LoadLibrary這兩個(gè)API函數(shù),在方便了普通程序開發(fā)者鏈接到他們的DLL之外有更深遠(yuǎn)的影響。這兩個(gè)API函數(shù)使得挖掘代碼,嵌入代碼,及其他高度移動(dòng)代碼的行為成為可能。

2)完整的PE頭信息,包括導(dǎo)入導(dǎo)出庫信息,留在進(jìn)程的內(nèi)存中方便了GetProcAddress函數(shù)和Kernel32模塊基礎(chǔ)獲得信息,埋下隱患[5]。

3)在發(fā)布可執(zhí)行文件的準(zhǔn)備時(shí)期,對(duì)運(yùn)行在操作系統(tǒng)(和/或者,防病毒程序)的可執(zhí)行文件的整體性缺乏檢測機(jī)制,或者很薄弱的不充分的檢測機(jī)制,這使得修改可執(zhí)行文件和運(yùn)行新的可移動(dòng)代碼相對(duì)容易,很多組件都沒能檢測到對(duì)可行性文件的修改。

4)可執(zhí)行體一旦被編譯,鏈接并傳送,就易于被其他程序修改,大部分沒有實(shí)施運(yùn)行時(shí)自我保護(hù)機(jī)制[6]。這一缺陷不局限于Win32應(yīng)用程序,許多其他操作系統(tǒng)的可執(zhí)行文件也同樣未能在運(yùn)行時(shí)進(jìn)行自檢,但Win32提供的動(dòng)態(tài)鏈接機(jī)能使移動(dòng)代碼的嵌入尤其危險(xiǎn)。

4 結(jié)束語

掌握PE文件的結(jié)構(gòu)和裝入機(jī)理,不僅可以幫助深層了解32位的Windows操作系統(tǒng),而且是在Win32下開發(fā)信息隱藏,加密解密,PE病毒等應(yīng)用程序的重要基礎(chǔ)知識(shí)。結(jié)合在探索Win32PE病毒的過程中的認(rèn)知,提出了Win32體系結(jié)構(gòu)下基于PE文件格式的若干漏洞,由于這些漏洞屬于基礎(chǔ)型的,因此修復(fù)問題有待解決。

[1]Microsoft Corporation.Microsoft portable exectuable and common object file format specification[M].MSDN.2002.

[2]羅云彬.Windows環(huán)境下32位匯編語言程序設(shè)計(jì)[M].北京:電子工業(yè)出版社,2002.

[3]Danehkar A.Inject your code to a portable executable file[EB/OL].(2005)http://www.codeproject.com/.

[4]Richter J.Windows核心編程[M].北京:機(jī)械工業(yè)出版社,2005.

[5]何迎生,段明秀.32位Windows系統(tǒng)下的PE文件結(jié)構(gòu)及其應(yīng)用[J].吉首大學(xué)學(xué)報(bào):自然科學(xué)版,2003(1):77-79.

HE Ying-sheng,DUAN Ming-xiu.PE structure under the 32-bit Windows system and its application[J].Journal of Jishou University:Natural Science Edition 2003(1):77-79.

[6]胡珊.向PE文件中插入可執(zhí)行代碼的研究[J].鞍山科技大學(xué)學(xué)報(bào),2005(2):119-122.HU Shan.Study on inserting executable codes into PE files[J].Journal of Anshan University of Science and Technology,2005(2):119-122.

猜你喜歡
字段漏洞代碼
漏洞
圖書館中文圖書編目外包數(shù)據(jù)質(zhì)量控制分析
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
三明:“兩票制”堵住加價(jià)漏洞
漏洞在哪兒
高鐵急救應(yīng)補(bǔ)齊三漏洞
CNMARC304字段和314字段責(zé)任附注方式解析
大埔县| 莱西市| 安福县| 山阳县| 杭锦旗| 阿拉善左旗| 阿城市| 芒康县| 永春县| 五华县| 玛沁县| 涟源市| 千阳县| 汝州市| 靖远县| 枣庄市| 冕宁县| 广汉市| 凤庆县| 长白| 本溪| 搜索| 福安市| 石楼县| 精河县| 措勤县| 公主岭市| 武邑县| 错那县| 岢岚县| 册亨县| 襄汾县| 阳西县| 航空| 新干县| 保康县| 申扎县| 南华县| 宝兴县| 崇义县| 新绛县|