Mac的反编译工具一:otool (objdump工具的OSX对应工具)。

来源:互联网 发布:梦貂蝉11神兽进阶数据 编辑:程序博客网 时间:2024/05/29 09:53

objdump的选项-S、-l十分方便。如果二进制文件中带有调试信息,可以将源代码、文件名和行号与汇编代码对应显示。

在OSX上,对应的工具是otool。与“objdump -Sl”能力接近的命令是otool -tV。

看一看insert sort算法的反编译。插入排序的一种实现:


这个实现中没有全局变量,数据段(Data Section)应该没有内容。我们用"otool -dV insertsort"这个命令,只显示Data Section, 验证一下:

oliverluan@localhost:~/Documents/Opt/insertsort$ otool -dV insertsortinsertsort:

如果把L数据和size变量改写成全局变量:

oliverluan@localhost:~/Documents/Opt/insertsort$ gcc -g insertsort_global.c -o insertsort_globaloliverluan@localhost:~/Documents/Opt/insertsort$ otool -dV insertsort_globalinsertsort_global:(__DATA,__data) section000000010000102012 00 00 00 07 00 00 00 05 00 00 00 08 00 00 00000000010000103063 00 00 00 05 00 00 00

看一看Text Section: otool -tV insertsort:

oliverluan@localhost:~/Documents/Opt/insertsort$ otool -tV insertsortinsertsort:(__TEXT,__text) section_insert_sort:0000000100000dd0pushq%rbp0000000100000dd1movq%rsp, %rbp0000000100000dd4movq%rdi, 0xfffffffffffffff8(%rbp)0000000100000dd8movl%esi, 0xfffffffffffffff4(%rbp)0000000100000ddbmovl$0x1, 0xffffffffffffffec(%rbp)0000000100000de2movl0xffffffffffffffec(%rbp), %eax0000000100000de5cmpl0xfffffffffffffff4(%rbp), %eax0000000100000de8jge0x100000e940000000100000deemovslq0xffffffffffffffec(%rbp), %rax0000000100000df2movq0xfffffffffffffff8(%rbp), %rcx0000000100000df6movl(%rcx,%rax,4), %edx0000000100000df9movl%edx, 0xfffffffffffffff0(%rbp)0000000100000dfcmovl0xffffffffffffffec(%rbp), %edx0000000100000dffsubl$0x1, %edx0000000100000e05movl%edx, 0xffffffffffffffe8(%rbp)0000000100000e08movb$0x0, %al0000000100000e0acmpl$0x0, 0xffffffffffffffe8(%rbp)0000000100000e11movb%al, 0xffffffffffffffe7(%rbp)0000000100000e14jl0x100000e300000000100000e1amovslq0xffffffffffffffe8(%rbp), %rax0000000100000e1emovq0xfffffffffffffff8(%rbp), %rcx0000000100000e22movl(%rcx,%rax,4), %edx0000000100000e25cmpl0xfffffffffffffff0(%rbp), %edx0000000100000e28setg%sil0000000100000e2cmovb%sil, 0xffffffffffffffe7(%rbp)0000000100000e30movb0xffffffffffffffe7(%rbp), %al0000000100000e33testb$0x1, %al0000000100000e35jne0x100000e400000000100000e3bjmpq0x100000e6e0000000100000e40movslq0xffffffffffffffe8(%rbp), %rax0000000100000e44movq0xfffffffffffffff8(%rbp), %rcx0000000100000e48movl(%rcx,%rax,4), %edx0000000100000e4bmovl0xffffffffffffffe8(%rbp), %esi0000000100000e4eaddl$0x1, %esi0000000100000e54movslq%esi, %rax0000000100000e57movq0xfffffffffffffff8(%rbp), %rcx0000000100000e5bmovl%edx, (%rcx,%rax,4)0000000100000e5emovl0xffffffffffffffe8(%rbp), %eax0000000100000e61addl$0xffffffff, %eax0000000100000e66movl%eax, 0xffffffffffffffe8(%rbp)0000000100000e69jmpq0x100000e080000000100000e6emovl0xfffffffffffffff0(%rbp), %eax0000000100000e71movl0xffffffffffffffe8(%rbp), %ecx0000000100000e74addl$0x1, %ecx0000000100000e7amovslq%ecx, %rdx0000000100000e7dmovq0xfffffffffffffff8(%rbp), %rsi0000000100000e81movl%eax, (%rsi,%rdx,4)0000000100000e84movl0xffffffffffffffec(%rbp), %eax0000000100000e87addl$0x1, %eax0000000100000e8cmovl%eax, 0xffffffffffffffec(%rbp)0000000100000e8fjmpq0x100000de20000000100000e94popq%rbp0000000100000e95ret0000000100000e96nopw%cs:(%rax,%rax)_print_array:0000000100000ea0pushq%rbp0000000100000ea1movq%rsp, %rbp0000000100000ea4subq$0x20, %rsp0000000100000ea8leaq0xdb(%rip), %rax ## literal pool for: array:0000000100000eafmovq%rdi, 0xfffffffffffffff8(%rbp)0000000100000eb3movl%esi, 0xfffffffffffffff4(%rbp)0000000100000eb6movq%rax, %rdi0000000100000eb9movb$0x0, %al0000000100000ebbcallq0x100000f68 ## symbol stub for: _printf0000000100000ec0movl$0x0, 0xfffffffffffffff0(%rbp)0000000100000ec7movl%eax, 0xffffffffffffffec(%rbp)0000000100000ecamovl0xfffffffffffffff0(%rbp), %eax0000000100000ecdcmpl0xfffffffffffffff4(%rbp), %eax0000000100000ed0jge0x100000f020000000100000ed6leaq0xb5(%rip), %rdi ## literal pool for: %d0000000100000eddmovslq0xfffffffffffffff0(%rbp), %rax0000000100000ee1movq0xfffffffffffffff8(%rbp), %rcx0000000100000ee5movl(%rcx,%rax,4), %esi0000000100000ee8movb$0x0, %al0000000100000eeacallq0x100000f68 ## symbol stub for: _printf0000000100000eefmovl%eax, 0xffffffffffffffe8(%rbp)0000000100000ef2movl0xfffffffffffffff0(%rbp), %eax0000000100000ef5addl$0x1, %eax0000000100000efamovl%eax, 0xfffffffffffffff0(%rbp)0000000100000efdjmpq0x100000eca0000000100000f02leaq0x8d(%rip), %rdi ## literal pool for:0000000100000f09movb$0x0, %al0000000100000f0bcallq0x100000f68 ## symbol stub for: _printf0000000100000f10movl%eax, 0xffffffffffffffe4(%rbp)0000000100000f13addq$0x20, %rsp0000000100000f17popq%rbp0000000100000f18ret0000000100000f19nopl(%rax)_main:0000000100000f20pushq%rbp0000000100000f21movq%rsp, %rbp0000000100000f24subq$0x10, %rsp0000000100000f28leaq_L(%rip), %rax0000000100000f2fmovl$0x0, 0xfffffffffffffffc(%rbp)0000000100000f36movl%edi, 0xfffffffffffffff8(%rbp)0000000100000f39movq%rsi, 0xfffffffffffffff0(%rbp)0000000100000f3dmovl_size(%rip), %esi0000000100000f43movq%rax, %rdi0000000100000f46callq_insert_sort0000000100000f4bleaq_L(%rip), %rdi0000000100000f52movl_size(%rip), %esi0000000100000f58callq_print_array0000000100000f5dmovl$0x0, %eax0000000100000f62addq$0x10, %rsp0000000100000f66popq%rbp0000000100000f67ret

另外,可以用-l选项查看load commands:

oliverluan@localhost:~/Documents/Opt/insertsort$ otool -l insertsort_globalinsertsort_global:Load command 0      cmd LC_SEGMENT_64  cmdsize 72  segname __PAGEZERO   vmaddr 0x0000000000000000   vmsize 0x0000000100000000  fileoff 0 filesize 0  maxprot 0x00000000 initprot 0x00000000   nsects 0    flags 0x0Load command 1      cmd LC_SEGMENT_64  cmdsize 632  segname __TEXT   vmaddr 0x0000000100000000   vmsize 0x0000000000001000  fileoff 0 filesize 4096  maxprot 0x00000007 initprot 0x00000005   nsects 7    flags 0x0Section  sectname __text   segname __TEXT      addr 0x0000000100000d60      size 0x00000000000001d9    offset 3424     align 2^4 (16)    reloff 0    nreloc 0     flags 0x80000400 reserved1 0 reserved2 0Section  sectname __stubs   segname __TEXT      addr 0x0000000100000f3a      size 0x000000000000000c    offset 3898     align 2^1 (2)    reloff 0    nreloc 0     flags 0x80000408 reserved1 0 (index into indirect symbol table) reserved2 6 (size of stubs)Section  sectname __stub_helper   segname __TEXT      addr 0x0000000100000f48      size 0x0000000000000024    offset 3912     align 2^2 (4)    reloff 0    nreloc 0     flags 0x80000400 reserved1 0 reserved2 0Section  sectname __cstring   segname __TEXT      addr 0x0000000100000f6c      size 0x000000000000000e    offset 3948     align 2^0 (1)    reloff 0    nreloc 0     flags 0x00000002 reserved1 0 reserved2 0Section  sectname __const   segname __TEXT      addr 0x0000000100000f80      size 0x0000000000000014    offset 3968     align 2^4 (16)    reloff 0    nreloc 0     flags 0x00000000 reserved1 0 reserved2 0Section  sectname __unwind_info   segname __TEXT      addr 0x0000000100000f94      size 0x0000000000000048    offset 3988     align 2^0 (1)    reloff 0    nreloc 0     flags 0x00000000 reserved1 0 reserved2 0Section  sectname __eh_frame   segname __TEXT      addr 0x0000000100000fe0      size 0x0000000000000018    offset 4064     align 2^3 (8)    reloff 0    nreloc 0     flags 0x00000000 reserved1 0 reserved2 0Load command 2      cmd LC_SEGMENT_64  cmdsize 312  segname __DATA   vmaddr 0x0000000100001000   vmsize 0x0000000000001000  fileoff 4096 filesize 4096  maxprot 0x00000007 initprot 0x00000003   nsects 3    flags 0x0Section  sectname __nl_symbol_ptr   segname __DATA      addr 0x0000000100001000      size 0x0000000000000010    offset 4096     align 2^3 (8)    reloff 0    nreloc 0     flags 0x00000006 reserved1 2 (index into indirect symbol table) reserved2 0Section  sectname __got   segname __DATA      addr 0x0000000100001010      size 0x0000000000000008    offset 4112     align 2^3 (8)    reloff 0    nreloc 0     flags 0x00000006 reserved1 4 (index into indirect symbol table) reserved2 0Section  sectname __la_symbol_ptr   segname __DATA      addr 0x0000000100001018      size 0x0000000000000010    offset 4120     align 2^3 (8)    reloff 0    nreloc 0     flags 0x00000007 reserved1 5 (index into indirect symbol table) reserved2 0Load command 3      cmd LC_SEGMENT_64  cmdsize 72  segname __LINKEDIT   vmaddr 0x0000000100002000   vmsize 0x0000000000001000  fileoff 8192 filesize 916  maxprot 0x00000007 initprot 0x00000001   nsects 0    flags 0x0Load command 4            cmd LC_DYLD_INFO_ONLY        cmdsize 48     rebase_off 8192    rebase_size 8       bind_off 8200      bind_size 56  weak_bind_off 0 weak_bind_size 0  lazy_bind_off 8256 lazy_bind_size 40     export_off 8296    export_size 80Load command 5     cmd LC_SYMTAB cmdsize 24  symoff 8408   nsyms 24  stroff 8820 strsize 288Load command 6            cmd LC_DYSYMTAB        cmdsize 80      ilocalsym 0      nlocalsym 16     iextdefsym 16     nextdefsym 4      iundefsym 20      nundefsym 4         tocoff 0           ntoc 0      modtaboff 0        nmodtab 0   extrefsymoff 0    nextrefsyms 0 indirectsymoff 8792  nindirectsyms 7      extreloff 0        nextrel 0      locreloff 0        nlocrel 0Load command 7          cmd LC_LOAD_DYLINKER      cmdsize 32         name /usr/lib/dyld (offset 12)Load command 8     cmd LC_UUID cmdsize 24    uuid F88FCA7D-3FE0-3556-96A4-4F29B7812D93Load command 9      cmd LC_VERSION_MIN_MACOSX  cmdsize 16  version 10.9      sdk 10.9Load command 10      cmd LC_SOURCE_VERSION  cmdsize 16  version 0.0Load command 11       cmd LC_MAIN   cmdsize 24  entryoff 3760 stacksize 0Load command 12          cmd LC_LOAD_DYLIB      cmdsize 56         name /usr/lib/libSystem.B.dylib (offset 24)   time stamp 2 Thu Jan  1 08:30:02 1970      current version 1197.1.1compatibility version 1.0.0Load command 13      cmd LC_FUNCTION_STARTS  cmdsize 16  dataoff 8376 datasize 8Load command 14      cmd LC_DATA_IN_CODE  cmdsize 16  dataoff 8384 datasize 0Load command 15      cmd LC_DYLIB_CODE_SIGN_DRS  cmdsize 16  dataoff 8384 datasize 24

符号表的查看使用nm -px insertsort。-p 原始顺序,不做symbol字母或者数字排序。-x 16进制表示 

oliverluan@localhost:~/Documents/Opt/insertsort$ nm -px insertsort0000000100001020 0f 09 0000 00000000000000a9 _L0000000100000000 0f 01 0010 00000000000000ac __mh_execute_header0000000100000dd0 0f 01 0000 00000000000000c0 _insert_sort0000000100000f20 0f 01 0000 00000000000000cd _main0000000100000ea0 0f 01 0000 00000000000000d3 _print_array0000000100001034 0f 09 0000 00000000000000e0 _size0000000000000000 01 00 0100 00000000000000e6 _printf0000000000000000 01 00 0100 00000000000000ee dyld_stub_binder


0 0