前言:在逆向工作流程中,我們會接觸到so文件,并且在某種情況下會對so文件進(jìn)行處理。 在文件的角度而言,so隸屬于 ELF 文件。 站在ELF文件角度來分析一下so文件。
一、ELF文件的大致組成
ELF 文件大致分為3個主要部分
1、ELF HEAD --ELF文件頭部分
2、 Program Header Table --程序頭表
3、Section Header Table --節(jié)頭表
1、ELF HEAD(ELF頭)
這個部分稱為“頭”,里面大致描述在這個文件里面的組織。如:文件魔術(shù)、目標(biāo)架構(gòu)體系(如ARM、X86...)、版本信息、各個部分的大小、各個部分的偏移起始地址等等。
下面描述的位置都是固定的,且位置都是緊接著下一部分的位置。(有誤歡迎指出)
這里我用的是IDA的android_server文件做演示,來簡單看一部分內(nèi)容。
文件的標(biāo)識信息(e_ident):前16字節(jié) (包括魔術(shù)部分:前4字節(jié) 如.ELF)
文件類型(e_type ):2字節(jié)
目標(biāo)架構(gòu)(e_machine ):2字節(jié)
版本(e_version):4字節(jié)
程序入口虛擬地址(e_entry ):4字節(jié)
程序頭部表偏移地址(e_phoff ):4字節(jié)
節(jié)區(qū)頭部表偏移地址(e_shoff ):4字節(jié)
保存與文件相關(guān)的,特定于處理器的標(biāo)志(e_flags ):4字節(jié)
ELF頭的大小(e_ehsize ):2字節(jié)
每個程序頭部表的大小(e_phentsize ):2字節(jié)
程序頭部表的數(shù)量(e_phnum ):2字節(jié)
每個節(jié)區(qū)頭部表的大小(e_shentsize):2字節(jié)
節(jié)區(qū)頭部表的數(shù)量(e_shnum ):2字節(jié)
節(jié)區(qū)字符串表位置(e_shstrndx):2字節(jié)
......
2、Program Header Table(程序頭表)
程序頭表描述的是程序里面各個段的信息。
這里來舉例看一下
比如程序頭,第一部分, 這個部分描述程序頭的信息,比如類型、大小、偏移等等;這個部分描述的就是程序頭的信息。
3、Section Header Table --節(jié)頭表
一個程序中到底有多少節(jié)信息,取決于這一部分,節(jié)頭表。
比較經(jīng)典的,就是這里的導(dǎo)出函數(shù)信息。