天天看點

elf section類型_ELF Format 筆記(四)—— 節(Section)

ilocker:關注 Android 安全(新入行,0基礎) QQ: 2597294287

ELF 檔案可以包含很多 section,所有的 section 都在 section header table 中有對應的一項,每個 section header 都是一個 Elf32_Shdr 結構,用于描述相應 section 的資訊。

ELF Header 中的 e_shoff 給出了 section header table 在 ELF 檔案中的位元組偏移量,e_shentsize 指明在 section header table 中的每一項的位元組大小,e_shnum 指明共有多少項。

Elf32_Shdr 結構:

1 typedef struct{2 Elf32_Word sh_name;3 Elf32_Word sh_type;4 Elf32_Word sh_flags;5 Elf32_Addr sh_addr;6 Elf32_Off sh_offset;7 Elf32_Word sh_size;8 Elf32_Word sh_link;9 Elf32_Word sh_info;10 Elf32_Word sh_addralign;11 Elf32_Word sh_entsize;12 } Elf32_Shdr;

sh_name:section 的名字。這裡其實是一個索引,指出 section 的名字存儲在 .shstrtab 的什麼位置。.shstrtab是一個存儲所有 section 名字的字元串表。

sh_type:section 的類型,上一篇筆記已經學習過。

sh_flags:通過 1-bit flag 定義一些屬性。

elf section類型_ELF Format 筆記(四)—— 節(Section)

SHF_WRITE:此 section 中包含的資料,在程序運作時可寫。

SHF_ALLOC:此 section 在程序運作時要占用記憶體。

一些控制用的 section 在程序運作時是不占用記憶體的,比如動态連結器可能隻把 section 中的一些資訊讀出來,用完就拉倒了,沒必要再存儲到程序鏡像中。

SHF_EXECINSTR:此 section 存儲的是可執行的機器碼。

SHF_MASKPROC:保留的,不用管。

sh_addr:如果此 section 需要映射到程序空間,此成員指定映射的起始位址。如不需映射,此值為 0。

sh_offset: 此 section 相對于檔案開頭的位元組偏移量。如果 section 類型為 SHT_NOBITS,表明該 section 在檔案中不占空間,這時 sh_offset 沒什麼用。

sh_size:此 section 的位元組大小。如果 section 類型為 SHT_NOBITS,就不用管 sh_size 了。

不同類型的 section 中 sh_link 和 sh_info 的意義不同:

elf section類型_ELF Format 筆記(四)—— 節(Section)

基本上就是針對不同的 section 類型,分别給出字元串表、符号表等所在的 section 在 section header table 中的索引。

sh_addralign:指明此 section 的 sh_addr 向幾位元組對齊,sh_addralign 應該是 2 的正整數倍。如果為 0 或 1,表明此 section 沒有位元組對齊限制。

sh_entsize:有些節的内容是一張表,其中每個表項的大小固定,比如符号表。對于這種表,本成員指定其每個表項的大小。如果此值為 0,表明本 section 不好含 XX 表。

section header table 中的索引為 0(SHN_UNDEF) 的這一項特殊,内容為:

elf section類型_ELF Format 筆記(四)—— 節(Section)