了解mach-o文件结构

2021-05-17  本文已影响0人  厨子

转载自 http://www.blogfshare.com/ioss-mach-o.html

我们知道Windows下的文件都是PE文件,同样在OS X和iOS中可执行文件是Mach-o格式的。

所以我们如果要进行逆向分析,首先要熟悉Mach-o文件结构。
Mach-o 包含三个基本区域:


你也可以在这里找到Mach-o的官方资料。

一、我们先使用otool工具来查看Mach-o的头部,看看都包含哪些信息。

头部的的结构如下(32位):

struct mach_header {
     uint32_t    magic ;
    cpu_type_t  cputype ;
    cpu_subtype_t   cpusubtype ;
     uint32_t    filetype ;
     uint32_t    ncmds ;
     uint32_t    sizeofcmds ;
     uint32_t    flags ;
}
#define CPU_TYPE_ARM((cpu_type_t) 12)

#define CPU_SUBTYPE_ARM_V7((cpu_subtype_t) 9

即为:armv7

#defineMH_EXECUTE 0×2

当然不用工具,直接使用UE看也是一样的。按照定义的结构来就行了。

二、头部之后就是加载命令。加载命令的数目以及总的大小在header中已经给出。

三、接下来就是 section了:

结构如下:

struct section  { 
     char sectname [ 16 ] ; 
     char segname [ 16 ] ; 
     uint32_t addr ; 
     uint32_t size ; 
     uint32_t offset ; 
     uint32_t align ; 
     uint32_t reloff ; 
     uint32_t nreloc ; 
     uint32_t flags ; 
     uint32_t reserved1 ; 
     uint32_t reserved2 ;
} ;

结构中的最后2项保留用。

段的命名规则是两个下划线紧跟着大写字母(如__TEXT),而section的命名则是两个下划线紧跟着小写字母(__text)。

下面列出段中可能包含的section:

__TEXT段:
__text, __cstring, __picsymbol_stub, __symbol_stub, __const, __litera14, __litera18;

__DATA段
__data, __la_symbol_ptr, __nl_symbol_ptr, __dyld, __const, __mod_init_func, __mod_term_func, __bss, __commom;

__IMPORT段
__jump_table, __pointers;

其中__TEXT段中的__text是实际上的代码部分;__DATA段的__data是实际的初始数据。

绝大多数mach-o包括以下三个段(支持用户自定义Segment,但是很少使用):

可以通过otool –s查看某segment的某个section

可以通过otool –t直接查看代码段(__TEXT)的反汇编代码:

其它的大家参考官方文档就行了。
相关文章

上一篇 下一篇

猜你喜欢

热点阅读