日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

一步步编写操作系统 47 elf格式文件分析实验

發(fā)布時(shí)間:2023/12/10 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步步编写操作系统 47 elf格式文件分析实验 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上一節(jié)中,我們講述了elf格式的部分理論知識(shí),為什么是部分呢?因?yàn)槲覀儽局皦蛴谩钡脑瓌t,只把我們需要了解的部分說完啦。不過,我相信大部分同學(xué)僅僅憑上一節(jié)中的理論知識(shí)還是領(lǐng)悟不到elf本質(zhì),咱們在本節(jié)開始分析前面咱們寫過的“內(nèi)核”,讓大家看清e(cuò)lf文件的每一個(gè)字節(jié)。

為了讓大家看清楚elf文件內(nèi)部,咱們要用之前的xxd命令,為了方便使用,如很久很久以前所述,已經(jīng)將其封裝成了xxd.sh腳本,參數(shù)1是待查看的文件名,參數(shù)2是文件內(nèi)的起始字節(jié),參數(shù)3是查看的連續(xù)字節(jié)數(shù)。腳本是逐字節(jié)輸出文件的內(nèi)容。腳本內(nèi)容很簡單,就是xxd命令而已:xxd -u -a -g 1 -s $2 -l $3 $1,您也看到了,參數(shù)比較多,弄成腳本完全是為了避免每次復(fù)雜的參數(shù)鍵入。為了讓大家方便使用,我已經(jīng)將其放到了tool目錄下,腳本中有參數(shù)說明,這里不再列出。下面是用此腳本處理kernel.bin的輸出,見圖

之前我們就用過多次xxd命令啦,對(duì)于輸出想必大家一定很熟悉啦。腳本的輸出大概分了三部分,最左邊的一列是16進(jìn)制的地址,或者稱為偏移量最為恰當(dāng)。中間這一大塊矩陣似的16進(jìn)制數(shù)字是文件中的內(nèi)容,每兩位16進(jìn)制數(shù)字為一字節(jié),每行共16個(gè)字節(jié)。最右邊那一列,含有點(diǎn)點(diǎn)的、偶爾伴有可讀字符的部分是字符顯示區(qū),這部分將內(nèi)容按照字符編碼顯示,當(dāng)然,前提肯定得是可打印字符,控制字符肯定不行,所以只要不是可顯示的字符便顯示為‘.’。

為了方便大家查看elf文件中各部分屬性,我在各屬性下面用下劃線予以區(qū)分。其中,細(xì)下劃線屬于elf header的范圍,粗下劃線屬于program header table程序頭表的范圍。在各范圍之中的各屬性,又以明顯的下劃線分隔,相信大家一定能一目了然。

咱們按照從上到下的順序,先從細(xì)下劃線的elf header部分說起。

第一行是e_ident數(shù)組,前4字節(jié)是固定的elf魔數(shù),正如您看到的,它們是0x7f、和字符ELF的ascii:0x45、0x4c、0x46。所以您在顯示區(qū)看到了ELF的三個(gè)字符。緊跟其后的三個(gè)1分別是e_ident[4]、e_ident[5]、e_ident[6]三個(gè)成員,代表的意義是32位elf文件、小端字節(jié)序、當(dāng)前版本。后面的9個(gè)00是e_ident[7]~ e_ident[15],這些確實(shí)都已經(jīng)初始化為0。

現(xiàn)在看第二行。

第1個(gè)下劃線處的內(nèi)容是02 00,由于是小端字節(jié)序,所以其值為0x0002。以下為方便陳述,只說該字節(jié)序所表示的數(shù)值。這個(gè)是e_type屬性,它占2字節(jié),值為2表示類型為ET_EXEC,即可執(zhí)行文件(有興趣的同學(xué)可以自行查看linux下的.o目標(biāo)文件,其e_type類型是值為1的ET_REL,即待重定位類型)。

本行的第2個(gè)下劃線處的內(nèi)容是0x0003,占2字節(jié)。該位置是e_machine屬性,即EM_386,表示該elf文件是運(yùn)行在Intel 80386平臺(tái)。

第3個(gè)下劃線處的內(nèi)容是0x00000001,占4字節(jié)。該位置是e_version屬性,即版本信息。

第4個(gè)下劃線處的內(nèi)容是0xc0001500,占4字節(jié),該位置是e_entry屬性,即程序的虛擬入口地址。

第5個(gè)下劃線處的內(nèi)容是0x00000034,占4字節(jié),該位置是e_phoff屬性,表示program header table程序頭表在文件中的偏移量,這里的偏移量是0x34。

現(xiàn)在看第三行。

第1個(gè)下劃線處的內(nèi)容是0x0000055c,占4字節(jié),該位置是e_shoff,表示section header table節(jié)頭表在文件內(nèi)的偏移量,這里的值為0x55c,表示在本文件偏移0x55c字節(jié)處為節(jié)頭表。之前說過啦,若沒有節(jié)頭表,此處便為0。

第2個(gè)下劃線處的內(nèi)容是0x00000000,占4字節(jié),該位置是e_flags屬性。

第3個(gè)下劃線處的內(nèi)容是0x0034,占2字節(jié),該位置是e_ehsize屬性,表示elf header大小是0x34字節(jié)。這和前面e_phoff屬性值大小一致,可見,程序頭表緊跟著elf header之后。

第4個(gè)下劃線處的內(nèi)容是0x0020,占2字節(jié),該位置是e_phentsize屬性,即program header的結(jié)構(gòu):struct Elf32_Phdr的字節(jié)大小,值為0x20字節(jié)。

第5個(gè)下劃線處的內(nèi)容是0x0002,占2字節(jié),該位置是e_phnum屬性,即程序頭表中段的個(gè)數(shù),這里為2個(gè)段。

第6個(gè)下劃線處的內(nèi)容是0x0028,占2字節(jié),該位置是e_shentsize屬性,即節(jié)頭表中各個(gè)節(jié)的大小。

現(xiàn)在看第四行。

第1個(gè)下劃線處的內(nèi)容是0x0006,占2字節(jié),該位置是e_shnum屬性,即節(jié)頭表中節(jié)的個(gè)數(shù),這里表示有6個(gè)節(jié)。

第2個(gè)下劃線處的內(nèi)容是0x0003,占2字節(jié),該位置是e_shstrndx屬性,即string name table在節(jié)頭表中的索引為3。

現(xiàn)在開始分析粗下劃線范圍的程序頭表部分。

從第4行到第8行是程序頭表的范圍,前面說過啦,程序頭表中共有2個(gè)段,每個(gè)段大小是0x20字節(jié)。這有兩個(gè)粗下劃線,每個(gè)占0x20字節(jié)。大家注意圖中,在兩個(gè)粗下劃線間有個(gè)小豎線,這是用來區(qū)分兩個(gè)段的。豎線左右兩邊各是一個(gè)段。

下面咱們按照struct Elf32_Phdr結(jié)構(gòu)來分析,該結(jié)構(gòu)中每個(gè)屬性都占4字節(jié),不再贅述。現(xiàn)在還是繼續(xù)說圖的第4行。

第1個(gè)粗下劃線值為0x00000001,該位置是p_type屬性,值為1,即表示PT_LOAD類型,可加載程序段,由于kernel.bin已經(jīng)是鏈接后的可執(zhí)行程序啦,所以,這PT_LOAD類型符合我們的認(rèn)知。

第2個(gè)粗下劃線值為0x00000000,該位置是p_offset屬性,表示本段在文件內(nèi)的偏移量。這個(gè)偏移量為0,似乎很奇怪,這表示該段的起始是從文件頭開始也算起啦,文件開頭的部分不是elf header嗎?不是代碼啊,這是要鬧哪樣?好吧,到底是什么情況,一會(huì)咱們細(xì)說。

第3個(gè)粗下劃線值為0xc0001000,該位置是p_vaddr屬性,表示本段被加載到內(nèi)存后的起始虛擬地址。看到這里,似乎覺得上面的p_offset為0有那么一點(diǎn)合理啦,結(jié)合elf header中的e_entry的值為0xc0101500,不知您想到了點(diǎn)什么。咱們先把剩下的說完。

第4個(gè)粗下劃線值為0xc0001000,該位置是p_paddr屬性,它通常和p_vaddr值一致,但該屬性是保留項(xiàng),咱們不用關(guān)注。

第5個(gè)粗下劃線值為0x00000505,該位置是p_filesz屬性,表示本段在文件中的字節(jié)大小。

第6個(gè)粗下劃線值也應(yīng)該是0x00000505,該位置是p_memsz屬性,表示本段在內(nèi)存中的大小,因?yàn)槎螣o論在哪里,邏輯大小是不變的,故該值等于p_filesz。

第7個(gè)粗下劃線值為0x00000005,該位置是p_flags屬性,表示與本段相關(guān)的標(biāo)志。5=4+1=PF_R+PF_X,在此表示可讀,可執(zhí)行,根據(jù)此屬性,我們推測此段為代碼段。

第8個(gè)粗下劃線值為0x00001000,該位置是p_align屬性,表示本段對(duì)齊的方式。

第一個(gè)段咱們說完了,第二個(gè)段這里就不解釋啦,留著大家自己練手吧。

總結(jié)

以上是生活随笔為你收集整理的一步步编写操作系统 47 elf格式文件分析实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。