Android逆向(004) Elf文件格式

简介

经过源代码编译出来的文件,如果我们不纠结于里面细节的话,并不是太复杂,主要也就是经过编译后的机器指令和数据。
但是除了机器指令和数据, Elf里面还有许多其它的信息,这些信息有些是编译时有用的,我们常称它们为节(Section),有些是操作系统装载应用时用的,们常称它们为段(Program)。所以Elf有两种视图:

upload.png

Elf文件头

typedef struct elf32_hdr{ 
    unsigned char e_ident[EI_NIDENT];  //魔数标志信息
    Elf32_Half    e_type;                                //表明文件类型
    Elf32_Half    e_machine;                        //文件所采用指令类型
    Elf32_Word    e_version;                        //版本
    Elf32_Addr    e_entry;                             //入口点
    Elf32_Off e_phoff; 
    Elf32_Off e_shoff; 
    Elf32_Word    e_flags; 
    Elf32_Half    e_ehsize; 
    Elf32_Half    e_phentsize; 
    Elf32_Half    e_phnum; 
    Elf32_Half    e_shentsize; 
    Elf32_Half    e_shnum; 
    Elf32_Half    e_shstrndx; 
  } Elf32_Ehdr; 

段表头

typedef struct elf32_phdr{  
   Elf32_Word    p_type;   
   Elf32_Off      p_offset;  
   Elf32_Addr    p_vaddr;        /* virtual address */  
   Elf32_Addr    p_paddr;        /* ignore */  
   Elf32_Word    p_filesz;       /* segment size in file */  
   Elf32_Word    p_memsz;        /* size in memory */  
   Elf32_Word    p_flags;  
   Elf32_Word    p_align;       
} Elf32_Phdr; 

节表头

typedef struct {  
   Elf32_Word    sh_name;    /* name of section, index */  
   Elf32_Word    sh_type;      
   Elf32_Word    sh_flags;  
   Elf32_Addr     sh_addr;       /* memory address, if any */  
   Elf32_Off      sh_offset;  
   Elf32_Word    sh_size;        /* section size in file */  
   Elf32_Word    sh_link;  
   Elf32_Word    sh_info;  
   Elf32_Word    sh_addralign;  
   Elf32_Word    sh_entsize;     /* fixed entry size, if have */  
} Elf32_Shdr; 

用c++实现读取android可执行文件

项目文件如下图:

upload.png

主要代码在parseElf.cpp里面,参考前面的文章,很容易在模拟器或者真机上看到输出的结果。
Android逆向(001)(https://www.jianshu.com/p/c881d91c4a18)
Android逆向(002)(https://www.jianshu.com/p/11f91ed42d8a)
代码下载:(https://download.csdn.net/download/yxylwt/10963296)

你可能感兴趣的:(Android逆向(004) Elf文件格式)