ELF 文件大致分為3個主要部分
1、ELF HEAD --ELF文件頭部分
2、 Program Header Table --程序頭表
3、Section Header Table --節頭表
這個部分稱為“頭”,裏面大致描述在這個文件裏面的組織。如:文件魔術、目標架構體系(如ARM、X86...)、版本信息、各個部分的大小、各個部分的偏移起始地址等等。
下面描述的位置都是固定的,且位置都是緊接著下壹部分的位置。(有誤歡迎指出)
這裏我用的是IDA的android_server文件做演示,來簡單看壹部分內容。
文件的標識信息(e_ident):前16字節 (包括魔術部分:前4字節 如.ELF)
文件類型(e_type ):2字節
目標架構(e_machine ):2字節
版本(e_version):4字節
程序入口虛擬地址(e_entry ):4字節
程序頭部表偏移地址(e_phoff ):4字節
節區頭部表偏移地址(e_shoff ):4字節
保存與文件相關的,特定於處理器的標誌(e_flags ):4字節
ELF頭的大小(e_ehsize ):2字節
每個程序頭部表的大小(e_phentsize ):2字節
程序頭部表的數量(e_phnum ):2字節
每個節區頭部表的大小(e_shentsize):2字節
節區頭部表的數量(e_shnum ):2字節
節區字符串表位置(e_shstrndx):2字節
......
程序頭表描述的是程序裏面各個段的信息。
這裏來舉例看壹下
比如程序頭,第壹部分, 這個部分描述程序頭的信息,比如類型、大小、偏移等等;這個部分描述的就是程序頭的信息。
壹個程序中到底有多少節信息,取決於這壹部分,節頭表。
比較經典的,就是這裏的導出函數信息。