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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

《Linux内核分析》实践4

發布時間:2025/5/22 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Linux内核分析》实践4 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《Linux內核分析》 實踐四——ELF文件格式分析

20135211李行之

一、概述

1.ELF全稱Executable and Linkable Format,可執行連接格式,ELF格式的文件用于存儲Linux程序。ELF文件(目標文件)格式主要三種:

  • 可重定向文件:文件保存著代碼和適當的數據,用來和其他的目標文件一起來創建一個可執行文件或者是一個共享目標文件。(目標文件或者靜態庫文件,即linux通常后綴為.a和.o的文件)
  • 可執行文件:文件保存著一個用來執行的程序。(例如bash,gcc等)
  • 共享目標文件:共享庫。文件保存著代碼和合適的數據,用來被下連接編輯器和動態鏈接器鏈接。(linux下后綴為.so的文件。)
    目標文件既要參與程序鏈接又要參與程序執行:

一般的 ELF 文件包括三個索引表:ELF header,Program header table,Section header table。

  • ELF header:在文件的開始,保存了路線圖,描述了該文件的組織情況。
  • Program header table:告訴系統如何創建進程映像。用來構造進程映像的目標文件必須具有程序頭部表,可重定位文件不需要這個表。
  • Section header table:包含了描述文件節區的信息,每個節區在表中都有一項,每一項給出諸如節區名稱、節區大小這類信息。用于鏈接的目標文件必須包含節區頭部表,其他目標文件可以有,也可以沒有這個表。

二、分析ELF文件頭(ELF header)

  • 進入終端輸入:cd /usr/include 進入include文件夾后查看elf.h文件,查看ELF的文件頭包含整個文件的控制結構
  • 寫一個小程序(hello 20135211)進行編譯,生成hello可執行文件。
    使用‘readelf –a hello’命令,都得到下面的ELF Header頭文件的信息,如下圖:
  • 通過上圖信息,可以得出Elf Header的Size為64bytes,所以可以使用hexdump工具將頭文件的16進制表打開。
    如下圖使用:‘hexdump –x hello –n 64’命令來查看hello文件頭的16進制表(前64bytes)對格式進行分析。
  • 第一行,對應e_ident[EI_NIDENT]。實際表示內容為7f454c46020101000000000000000000,前四個字節7f454c46(0x45,0x4c,0x46是'e','l','f'對應的ascii編碼)是一個魔數,表示這是一個ELF對象。接下來的一個字節02表示是一個64位對象,接下來的一個字節01表示是小端法表示,再接下來的一個字節01表示文件頭版本。剩下的默認都設置為0.
  • 第二行,e_type值為0x0002,表示是一個可執行文件。e_machine值為0x003e,表示是Advanced Micro Devices X86-64處理器體系結構。e_version值為0x00000100,表示是當前版本。e_entry值為0x 004003f0,表示入口點。
  • 第三行,e_phoff值為0x40,表示程序頭表。e_shoff值為0x1278,表示段表的偏移地址。
  • 第四行,e_flags值為0x00000000,表示未知處理器特定標志。e_ehsize值為0x0040,表示elf文件頭大小(正好是64bytes)。e_phentsize表示一個program header表中的入口的長度,值為0x0038。e_phnum的值為0x0008,給出program header表中的入口數目。e_shentsize值為0x0040表示段頭大小為64個字節。e_shnum值為0x001f,表示段表入口有31個。e_shstrndx值為0x001c,表示段名串表的在段表中的索引號。

三、通過文件頭找到section header table,理解其內容

  • file elf1顯示生成的目標文件hello的類型
  • elf1是一個可執行文件。輸入:ls –l hello查看hello的大小:
  • 如圖可知,hello大小為6712字節。
    輸入:hexdump –x hello來用16進制的數字來顯示hello的內容
    (其中,第二列是16進制表示的偏移地址)
  • 輸入:objdump –x hello來顯示hello中各個段以及符號表的相關信息:
  • 輸入:readelf –a hello來查看各個段信息:
  • ELF文件頭信息:
  • 段表Section header table:
  • 符號表 Symbol table:

四、通過section header table找到各section

在一個ELF文件中有一個section header table,通過它我們可以定位到所有的 section,而 ELF header 中的e_shoff 變量就是保存 section header table 入口對文件頭的偏移量。而每個 section 都會對應一個 section header ,所以只要在 section header table 中找到每個 section header,就可以通過 section header 找到你想要的 section。

下面以可執行文件hello為例,以保存代碼段的 section 為例來講解讀取某個section 的過程。
使用‘vi /usr/include/elf.h ’命令查看Sections Header的結構體:

由上面分析可知,section headers table中的每一個section header所占的size均為64字節,ELF header得到了e_shoff變量的值為0X1278,也就是table入口的偏移量,通過看e_shnum值為0x001f,表示段表入口有31個。
所以從0x00001278開始有31個段,每個段占64個字節大小,輸入 hexdump elf1查看:

  • 第一個段,其中內容全部為0,所以不表示任何段。
  • 第二個段,為.interp段,段偏移sh_offset為0X200,段大小sh_size為0X1c。
  • 第三個段,為.note.ABI-tag段,段偏移sh_offset為0X21c,段大小sh_size為0X 20。
  • 第四個段,為.note.gnu.build-i段,段偏移sh_offset為0X 23c,段大小sh_size為0X 24。
  • 第五個段,為.gnu.hash段,段偏移sh_offset為0X 260,段大小sh_size為0X 1c。

…………

  • 第十四個段,為.text段, 段偏移sh_offset為0X 3f0, 段大小sh_size為0X 182。
  • 第二十五個段,為.data段, 段偏移sh_offset為0X 8d8, 段大小sh_size為0X 10。
  • 第二十六個段,為.bss段, 段偏移sh_offset為0X 8e8(紅線),段大小sh_size為0X 08。
  • 第二十九個段, 為.symtab段,段偏移sh_offset為0X910,段大小sh_size為0X0648。
  • 第三十個段, 為.strtab段,段偏移sh_offset為0Xf58,段大小sh_size為0X214.

我們用readelf 命令去查看.text這個 section 中的內容,
輸入readelf –x 14 hello,(.text前面的標號為14)對14索引號的.text的section的內容進行查看:

下面用 hexdump 的方法去讀取.text這個 section 中的內容,通過看section header中.text中offset和size分別是0x3f0和0x182,通過16進制向10進制轉換得到offset:1008和size:386。
輸入 hexdump –s 1008 –n 386 –C hello

得到了和上面的readelf得到的相同。
使用下面命令對hello的文本段(.text)進行反匯編:
objdump –d hello 得到如下圖:

可以看出,使用反匯編的16進制數據和前面查找到的是相同的。

五、理解常見.text .strtab .symtab .rodata等section

①.text section是可執行指令的集合,.data和.text都是屬于PROGBITS類型的section,這是將來要運行的程序與代碼。查詢段表可知.text section的位偏移為0x00003f0,size為0x0000182。

②.strtab section是屬于STRTAB類型的section,可以在文件中看到,它存著字符串,儲存著符號的名字。位偏移為0x0000f58,size為0x0000214。

③.symtab section存放所有section中定義的符號名字,比如“data_items”,“start_loop”。 .symtab section是屬于SYMTAB類型的section,它描述了.strtab中的符號在“內存”中對應的“內存地址”。 位偏移為0x0000910,size為0x0000648。

④.rodata section,ro代表read only。位偏移為0x0000580,size為0x0000013。

轉載于:https://www.cnblogs.com/shadow135211/p/5528828.html

總結

以上是生活随笔為你收集整理的《Linux内核分析》实践4的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。