分析Mach-O文件

OSX系统自带的otool可以分析Mach-O可执行文件
类似命令行工具:jtool
常用命令如下:

  • 查看fat headers信息

otool -f xxx.app/xxx

$ otool -f xxx.app/xxx
Fat headers
fat_magic 0xcafebabe
nfat_arch 2
architecture 0
    cputype 12
    cpusubtype 9
    capabilities 0x0
    offset 16384
    size 69642576
    align 2^14 (16384)
architecture 1
    cputype 16777228
    cpusubtype 0
    capabilities 0x0
    offset 69664768
    size 80306624
    align 2^14 (16384)
  • 查看archive header信息

otool -a xxx.app/xxx

$ otool -a xxx.app/xxx
  • 查看Mach-O头结构

otool -h xxx.app/xxx

$ otool -h xxx.app/xxx
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedface      12          9  0x00           2    52       5452 0x00218085
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedfacf 16777228          0  0x00           2    52       6128 0x00218085
  • 查看load commands

otool -l xxx.app/xxx

$ otool -l xxx.app/xxx
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedface      12          9  0x00           2    52       5452 0x00218085
Load command 0
      cmd LC_SEGMENT
  cmdsize 56
  segname __PAGEZERO
   vmaddr 0x00000000
   vmsize 0x00004000
  fileoff 0
 filesize 0
  maxprot 0x00000000
 initprot 0x00000000
   nsects 0
    flags 0x0
Load command 1
      cmd LC_SEGMENT
  cmdsize 736
  segname __TEXT
   vmaddr 0x00004000
   vmsize 0x03b44000
  fileoff 0
 filesize 62144512
  maxprot 0x00000005
 initprot 0x00000005
   nsects 10
    flags 0x0
Section
  sectname __text
   segname __TEXT
      addr 0x000092c0
      size 0x01f49bcc
    offset 21184
     align 2^4 (16)
    reloff 0
    nreloc 0
     flags 0x80000400
 reserved1 0
 reserved2 0
  • 查看依赖的动态库,包括动态库名称、当前版本号、兼容版本号

otool -L xxx.app/xxx

$ otool -L xxx.app/xxx
xxx.app/xxx (architecture armv7):
    /System/Library/Frameworks/CoreMotion.framework/CoreMotion (compatibility version 1.0.0, current version 2236.0.11)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
    /System/Library/Frameworks/CoreText.framework/CoreText (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/AudioToolbox.framework/AudioToolbox (compatibility version 1.0.0, current version 492.0.0)
    /System/Library/Frameworks/AVFoundation.framework/AVFoundation (compatibility version 1.0.0, current version 2.0.0)
xxx.app/xxx (architecture arm64):
    /System/Library/Frameworks/CoreMotion.framework/CoreMotion (compatibility version 1.0.0, current version 2236.0.11)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
    /System/Library/Frameworks/CoreText.framework/CoreText (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/AudioToolbox.framework/AudioToolbox (compatibility version 1.0.0, current version 492.0.0)
    /System/Library/Frameworks/AVFoundation.framework/AVFoundation (compatibility version 1.0.0, current version 2.0.0)
  • 查看支持的框架

otool -D xxx.app/xxx

$ otool -D xxx.app/xxx
xxx.app/xxx (architecture armv7):
xxx.app/xxx (architecture arm64):
  • 查看text section
    otool -t -v xxx.app/xxx
$ otool -t -v xxx.app/xxx
xxx.app/xxx (architecture armv7):
(__TEXT,__text) section
000092c0    f0 b5   push    {r4, r5, r6, r7, lr}
000092c2    03 af   add r7, sp, #0xc
000092c4    2d e9 00 0d     push.w  {r8, r10, r11}
000092c8    ad f5 78 6d     sub.w   sp, sp, #0xf80
000092cc    82 b0   sub sp, #0x8
000092ce    4c f2 2e 20     movw    r0, #0xc22e
000092d2    c0 f2 fc 30     movt    r0, #0x3fc
000092d6    78 44   add r0, pc
000092d8    d0 f8 00 80     ldr.w   r8, [r0]
000092dc    42 f2 b8 20     movw    r0, #0x22b8
000092e0    c0 f2 c9 30     movt    r0, #0x3c9
000092e4    78 44   add r0, pc
000092e6    41 46   mov r1, r8
000092e8    02 46   mov r2, r0
...
xxx.app/xxx (architecture arm64):
(__TEXT,__text) section
000092c0    f0 b5   push    {r4, r5, r6, r7, lr}
000092c2    03 af   add r7, sp, #0xc
000092c4    2d e9 00 0d     push.w  {r8, r10, r11}
000092c8    ad f5 78 6d     sub.w   sp, sp, #0xf80
000092cc    82 b0   sub sp, #0x8
000092ce    4c f2 2e 20     movw    r0, #0xc22e
000092d2    c0 f2 fc 30     movt    r0, #0x3fc
000092d6    78 44   add r0, pc
000092d8    d0 f8 00 80     ldr.w   r8, [r0]
000092dc    42 f2 b8 20     movw    r0, #0x22b8
000092e0    c0 f2 c9 30     movt    r0, #0x3c9
000092e4    78 44   add r0, pc
000092e6    41 46   mov r1, r8
000092e8    02 46   mov r2, r0
...
  • 查看data section

otool -d xxx.app/xxx

$ otool -d xxx.app/xxx
xxx.app/xxx (architecture armv7):
Contents of (__DATA,__data) section
03fdf2d0    01f94e98 01fef35b 01fef376 00000000 
03fdf2e0    037b0c7d 00000000 03fb44bc 00000000 
03fdf2f0    03fb45a8 00000000 03fb45bc 00000034 
03fdf300    00000000 03fb45e4 00000000 00000000 
03fdf310    00000000 037b0c65 03fb4634 00000000 
xxx.app/xxx (architecture arm64):
Contents of (__DATA,__data) section
0000000104a01100    02435948 00000001 0248fe0b 00000001 
0000000104a01110    0248fe26 00000001 00000000 00000000 
0000000104a01120    03c5113a 00000001 00000000 00000000 
0000000104a01130    049b2700 00000001 00000000 00000000 
0000000104a01140    049b28d0 00000001 00000000 00000000
  • 查看Objective-C segment

otool -o xxx.app/xxx

$ otool -o xxx.app/xxx
xxx.app/xxx (architecture armv7):
Contents of (__DATA,__objc_classlist) section
03fb3690 0x3fda424
           isa 0x3fda410
    superclass 0x0
         cache 0x0
        vtable 0x0
          data 0x3fb4304 (struct class_ro_t *)
                    flags 0x90
            instanceStart 4
             instanceSize 4
               ivarLayout 0x0
                     name 0x37b0c31 GICQgdiSTB
              baseMethods 0x0 (struct method_list_t *)
            baseProtocols 0x0
                    ivars 0x0
           weakIvarLayout 0x0
           baseProperties 0x0
Meta Class
           isa 0x0
    superclass 0x0
         cache 0x0
        vtable 0x0
          data 0x3fb42dc (struct class_ro_t *)
                    flags 0x91 RO_META
            instanceStart 20
             instanceSize 20
               ivarLayout 0x0
                     name 0x37b0c31 GICQgdiSTB
              baseMethods 0x3fb42c8 (struct method_list_t *)
           entsize 12
             count 1
              name 0x3799743 load
             types 0x37b3155 v8@0:4
               imp 0x92c1
            baseProtocols 0x0
                    ivars 0x0
           weakIvarLayout 0x0
           baseProperties 0x0
...
xxx.app/xxx (architecture arm64):
Contents of (__DATA,__objc_classlist) section
00000001049b0b38 0x1049f73a8
           isa 0x1049f7380
    superclass 0x0 _OBJC_CLASS_$_NSObject
         cache 0x0
        vtable 0x0
          data 0x1049b23f8 (struct class_ro_t *)
                    flags 0x90
            instanceStart 8
             instanceSize 8
                 reserved 0x0
               ivarLayout 0x0
                     name 0x103c510ee GICQgdiSTB
              baseMethods 0x0 (struct method_list_t *)
            baseProtocols 0x0
                    ivars 0x0
           weakIvarLayout 0x0
           baseProperties 0x0
Meta Class
           isa 0x0
    superclass 0x0 _OBJC_METACLASS_$_NSObject
         cache 0x0
        vtable 0x0
          data 0x1049b23b0 (struct class_ro_t *)
                    flags 0x91 RO_META
            instanceStart 40
             instanceSize 40
                 reserved 0x0
               ivarLayout 0x0
                     name 0x103c510ee GICQgdiSTB
              baseMethods 0x1049b2390 (struct method_list_t *)
           entsize 24
             count 1
              name 0x103c39c13 load
             types 0x103c535db v16@0:8
               imp 0x1000058f0 
            baseProtocols 0x0
                    ivars 0x0
           weakIvarLayout 0x0
           baseProperties 0x0
  • 查看symbol table

otool -I xxx.app/xxx

$ otool -I xxx.app/xxx
xxx.app/xxx (architecture armv7):
Indirect symbols for (__TEXT,__picsymbolstub4__TEXT) 815 entries
address    index
0x01f52e8c   491 
0x01f52e9c   492 
0x01f52eac   493 
0x01f52ebc   494 
0x01f52ecc   495
...
xxx.app/xxx (architecture arm64):
Indirect symbols for (__TEXT,__stubs) 824 entries
address            index
0x00000001023f470c    52 
0x00000001023f4718    53 
0x00000001023f4724    54 
0x00000001023f4730    55 
0x00000001023f473c    56
...
  • 获取所有方法名称:

otool -v -s __TEXT __objc_methname xxx.app/xxx

$ otool -v -s __TEXT __objc_methname xxx.app/xxx
xxx.app/xxx (architecture armv7):
Contents of (__TEXT,__objc_methname) section
0379972a  stringByAppendingString:
03799743  load
03799748  stringWithUTF8String:
0379975e  user
03799763  setUser:
0379976c  password
03799775  setPassword:
...
xxx.app/xxx (architecture arm64):
Contents of (__TEXT,__objc_methname) section
0000000103c39bfa  stringByAppendingString:
0000000103c39c13  load
0000000103c39c18  stringWithUTF8String:
0000000103c39c2e  user
0000000103c39c33  setUser:
0000000103c39c3c  password
0000000103c39c45  setPassword:
...

下面列举一些常见的 Section。

Section 用途
__TEXT.__text 主程序代码
__TEXT.__cstring C 语言字符串
__TEXT.__const const 关键字修饰的常量
__TEXT.__stubs 用于 Stub 的占位代码,很多地方称之为桩代码
__TEXT.__stubs_helper 当 Stub 无法找到真正的符号地址后的最终指向
__TEXT.__objc_methname Objective-C 方法名称
__TEXT.__objc_methtype Objective-C 方法类型
__TEXT.__objc_classname Objective-C 类名称
__DATA.__data 初始化过的可变数据
__DATA.__la_symbol_ptr lazy binding 的指针表,表中的指针一开始都指向 __stub_helper
__DATA.nl_symbol_ptr 非 lazy binding 的指针表,每个表项中的指针都指向一个在装载过程中,被动态链机器搜索完成的符号
__DATA.__const 没有初始化过的常量
__DATA.__cfstring 程序中使用的 Core Foundation 字符串(CFStringRefs
__DATA.__bss BSS,存放为初始化的全局变量,即常说的静态内存分配
__DATA.__common 没有初始化过的符号声明
__DATA.__objc_classlist Objective-C 类列表
__DATA.__objc_protolist Objective-C 原型
__DATA.__objc_imginfo Objective-C 镜像信息
__DATA.__objc_selfrefs Objective-C self 引用
__DATA.__objc_protorefs Objective-C 原型引用
__DATA.__objc_superrefs Objective-C 超类引用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容