分享

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

 champion_xu 2015-10-29

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

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

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

  1
              2
              3
              4
              5
              6
              7
              8
              9
             10
             11
             12
             13
             14
             15
             16
             17
             18
             19
             20
             21
             22
             23
             24
             25
             26
             27
             28
            
#include <stdio.h>

void insert_sort(int* L, int size) {
int tmp, i, j;
for (i = 1; i < size; ++i) {
tmp = L[i];
for (j = i-1; j >= 0 && L[j] > tmp; --j) {
L[j+1] = L[j];
}
L[j+1] = tmp;
}
}

void print_array(int* L, int size) {
printf("array: ");
for (int i = 0; i < size; ++i) {
printf("%d ", L[i]);
}
printf("\n");
}

int main (int argc, char** argv) {
int L[] = {18, 7, 5, 8, 99};
int size = sizeof(L) / sizeof(int);
insert_sort(L, size);
print_array(L, size);
return 0;
}
来自CODE的代码片
insert_sort.c

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

  1. oliverluan@localhost:~/Documents/Opt/insertsort$ otool -dV insertsort  
  2. insertsort:  

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

  1. oliverluan@localhost:~/Documents/Opt/insertsort$ gcc -g insertsort_global.c -o insertsort_global  
  2. oliverluan@localhost:~/Documents/Opt/insertsort$ otool -dV insertsort_global  
  3. insertsort_global:  
  4. (__DATA,__data) section  
  5. 0000000100001020    12 00 00 00 07 00 00 00 05 00 00 00 08 00 00 00  
  6. 0000000100001030    63 00 00 00 05 00 00 00  

看一看Text Section: otool -tV insertsort:

  1. oliverluan@localhost:~/Documents/Opt/insertsort$ otool -tV insertsort  
  2. insertsort:  
  3. (__TEXT,__text) section  
  4. _insert_sort:  
  5. 0000000100000dd0    pushq   %rbp  
  6. 0000000100000dd1    movq    %rsp, %rbp  
  7. 0000000100000dd4    movq    %rdi, 0xfffffffffffffff8(%rbp)  
  8. 0000000100000dd8    movl    %esi, 0xfffffffffffffff4(%rbp)  
  9. 0000000100000ddb    movl    $0x1, 0xffffffffffffffec(%rbp)  
  10. 0000000100000de2    movl    0xffffffffffffffec(%rbp), %eax  
  11. 0000000100000de5    cmpl    0xfffffffffffffff4(%rbp), %eax  
  12. 0000000100000de8    jge 0x100000e94  
  13. 0000000100000dee    movslq  0xffffffffffffffec(%rbp), %rax  
  14. 0000000100000df2    movq    0xfffffffffffffff8(%rbp), %rcx  
  15. 0000000100000df6    movl    (%rcx,%rax,4), %edx  
  16. 0000000100000df9    movl    %edx, 0xfffffffffffffff0(%rbp)  
  17. 0000000100000dfc    movl    0xffffffffffffffec(%rbp), %edx  
  18. 0000000100000dff    subl    $0x1, %edx  
  19. 0000000100000e05    movl    %edx, 0xffffffffffffffe8(%rbp)  
  20. 0000000100000e08    movb    $0x0, %al  
  21. 0000000100000e0a    cmpl    $0x0, 0xffffffffffffffe8(%rbp)  
  22. 0000000100000e11    movb    %al, 0xffffffffffffffe7(%rbp)  
  23. 0000000100000e14    jl  0x100000e30  
  24. 0000000100000e1a    movslq  0xffffffffffffffe8(%rbp), %rax  
  25. 0000000100000e1e    movq    0xfffffffffffffff8(%rbp), %rcx  
  26. 0000000100000e22    movl    (%rcx,%rax,4), %edx  
  27. 0000000100000e25    cmpl    0xfffffffffffffff0(%rbp), %edx  
  28. 0000000100000e28    setg    %sil  
  29. 0000000100000e2c    movb    %sil, 0xffffffffffffffe7(%rbp)  
  30. 0000000100000e30    movb    0xffffffffffffffe7(%rbp), %al  
  31. 0000000100000e33    testb   $0x1, %al  
  32. 0000000100000e35    jne 0x100000e40  
  33. 0000000100000e3b    jmpq    0x100000e6e  
  34. 0000000100000e40    movslq  0xffffffffffffffe8(%rbp), %rax  
  35. 0000000100000e44    movq    0xfffffffffffffff8(%rbp), %rcx  
  36. 0000000100000e48    movl    (%rcx,%rax,4), %edx  
  37. 0000000100000e4b    movl    0xffffffffffffffe8(%rbp), %esi  
  38. 0000000100000e4e    addl    $0x1, %esi  
  39. 0000000100000e54    movslq  %esi, %rax  
  40. 0000000100000e57    movq    0xfffffffffffffff8(%rbp), %rcx  
  41. 0000000100000e5b    movl    %edx, (%rcx,%rax,4)  
  42. 0000000100000e5e    movl    0xffffffffffffffe8(%rbp), %eax  
  43. 0000000100000e61    addl    $0xffffffff, %eax  
  44. 0000000100000e66    movl    %eax, 0xffffffffffffffe8(%rbp)  
  45. 0000000100000e69    jmpq    0x100000e08  
  46. 0000000100000e6e    movl    0xfffffffffffffff0(%rbp), %eax  
  47. 0000000100000e71    movl    0xffffffffffffffe8(%rbp), %ecx  
  48. 0000000100000e74    addl    $0x1, %ecx  
  49. 0000000100000e7a    movslq  %ecx, %rdx  
  50. 0000000100000e7d    movq    0xfffffffffffffff8(%rbp), %rsi  
  51. 0000000100000e81    movl    %eax, (%rsi,%rdx,4)  
  52. 0000000100000e84    movl    0xffffffffffffffec(%rbp), %eax  
  53. 0000000100000e87    addl    $0x1, %eax  
  54. 0000000100000e8c    movl    %eax, 0xffffffffffffffec(%rbp)  
  55. 0000000100000e8f    jmpq    0x100000de2  
  56. 0000000100000e94    popq    %rbp  
  57. 0000000100000e95    ret  
  58. 0000000100000e96    nopw    %cs:(%rax,%rax)  
  59. _print_array:  
  60. 0000000100000ea0    pushq   %rbp  
  61. 0000000100000ea1    movq    %rsp, %rbp  
  62. 0000000100000ea4    subq    $0x20, %rsp  
  63. 0000000100000ea8    leaq    0xdb(%rip), %rax ## literal pool for: array:  
  64. 0000000100000eaf    movq    %rdi, 0xfffffffffffffff8(%rbp)  
  65. 0000000100000eb3    movl    %esi, 0xfffffffffffffff4(%rbp)  
  66. 0000000100000eb6    movq    %rax, %rdi  
  67. 0000000100000eb9    movb    $0x0, %al  
  68. 0000000100000ebb    callq   0x100000f68 ## symbol stub for: _printf  
  69. 0000000100000ec0    movl    $0x0, 0xfffffffffffffff0(%rbp)  
  70. 0000000100000ec7    movl    %eax, 0xffffffffffffffec(%rbp)  
  71. 0000000100000eca    movl    0xfffffffffffffff0(%rbp), %eax  
  72. 0000000100000ecd    cmpl    0xfffffffffffffff4(%rbp), %eax  
  73. 0000000100000ed0    jge 0x100000f02  
  74. 0000000100000ed6    leaq    0xb5(%rip), %rdi ## literal pool for: %d  
  75. 0000000100000edd    movslq  0xfffffffffffffff0(%rbp), %rax  
  76. 0000000100000ee1    movq    0xfffffffffffffff8(%rbp), %rcx  
  77. 0000000100000ee5    movl    (%rcx,%rax,4), %esi  
  78. 0000000100000ee8    movb    $0x0, %al  
  79. 0000000100000eea    callq   0x100000f68 ## symbol stub for: _printf  
  80. 0000000100000eef    movl    %eax, 0xffffffffffffffe8(%rbp)  
  81. 0000000100000ef2    movl    0xfffffffffffffff0(%rbp), %eax  
  82. 0000000100000ef5    addl    $0x1, %eax  
  83. 0000000100000efa    movl    %eax, 0xfffffffffffffff0(%rbp)  
  84. 0000000100000efd    jmpq    0x100000eca  
  85. 0000000100000f02    leaq    0x8d(%rip), %rdi ## literal pool for:  
  86.   
  87. 0000000100000f09    movb    $0x0, %al  
  88. 0000000100000f0b    callq   0x100000f68 ## symbol stub for: _printf  
  89. 0000000100000f10    movl    %eax, 0xffffffffffffffe4(%rbp)  
  90. 0000000100000f13    addq    $0x20, %rsp  
  91. 0000000100000f17    popq    %rbp  
  92. 0000000100000f18    ret  
  93. 0000000100000f19    nopl    (%rax)  
  94. _main:  
  95. 0000000100000f20    pushq   %rbp  
  96. 0000000100000f21    movq    %rsp, %rbp  
  97. 0000000100000f24    subq    $0x10, %rsp  
  98. 0000000100000f28    leaq    _L(%rip), %rax  
  99. 0000000100000f2f    movl    $0x0, 0xfffffffffffffffc(%rbp)  
  100. 0000000100000f36    movl    %edi, 0xfffffffffffffff8(%rbp)  
  101. 0000000100000f39    movq    %rsi, 0xfffffffffffffff0(%rbp)  
  102. 0000000100000f3d    movl    _size(%rip), %esi  
  103. 0000000100000f43    movq    %rax, %rdi  
  104. 0000000100000f46    callq   _insert_sort  
  105. 0000000100000f4b    leaq    _L(%rip), %rdi  
  106. 0000000100000f52    movl    _size(%rip), %esi  
  107. 0000000100000f58    callq   _print_array  
  108. 0000000100000f5d    movl    $0x0, %eax  
  109. 0000000100000f62    addq    $0x10, %rsp  
  110. 0000000100000f66    popq    %rbp  
  111. 0000000100000f67    ret  

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

  1. oliverluan@localhost:~/Documents/Opt/insertsort$ otool -l insertsort_global  
  2. insertsort_global:  
  3. Load command 0  
  4.       cmd LC_SEGMENT_64  
  5.   cmdsize 72  
  6.   segname __PAGEZERO  
  7.    vmaddr 0x0000000000000000  
  8.    vmsize 0x0000000100000000  
  9.   fileoff 0  
  10.  filesize 0  
  11.   maxprot 0x00000000  
  12.  initprot 0x00000000  
  13.    nsects 0  
  14.     flags 0x0  
  15. Load command 1  
  16.       cmd LC_SEGMENT_64  
  17.   cmdsize 632  
  18.   segname __TEXT  
  19.    vmaddr 0x0000000100000000  
  20.    vmsize 0x0000000000001000  
  21.   fileoff 0  
  22.  filesize 4096  
  23.   maxprot 0x00000007  
  24.  initprot 0x00000005  
  25.    nsects 7  
  26.     flags 0x0  
  27. Section  
  28.   sectname __text  
  29.    segname __TEXT  
  30.       addr 0x0000000100000d60  
  31.       size 0x00000000000001d9  
  32.     offset 3424  
  33.      align 2^4 (16)  
  34.     reloff 0  
  35.     nreloc 0  
  36.      flags 0x80000400  
  37.  reserved1 0  
  38.  reserved2 0  
  39. Section  
  40.   sectname __stubs  
  41.    segname __TEXT  
  42.       addr 0x0000000100000f3a  
  43.       size 0x000000000000000c  
  44.     offset 3898  
  45.      align 2^1 (2)  
  46.     reloff 0  
  47.     nreloc 0  
  48.      flags 0x80000408  
  49.  reserved1 0 (index into indirect symbol table)  
  50.  reserved2 6 (size of stubs)  
  51. Section  
  52.   sectname __stub_helper  
  53.    segname __TEXT  
  54.       addr 0x0000000100000f48  
  55.       size 0x0000000000000024  
  56.     offset 3912  
  57.      align 2^2 (4)  
  58.     reloff 0  
  59.     nreloc 0  
  60.      flags 0x80000400  
  61.  reserved1 0  
  62.  reserved2 0  
  63. Section  
  64.   sectname __cstring  
  65.    segname __TEXT  
  66.       addr 0x0000000100000f6c  
  67.       size 0x000000000000000e  
  68.     offset 3948  
  69.      align 2^0 (1)  
  70.     reloff 0  
  71.     nreloc 0  
  72.      flags 0x00000002  
  73.  reserved1 0  
  74.  reserved2 0  
  75. Section  
  76.   sectname __const  
  77.    segname __TEXT  
  78.       addr 0x0000000100000f80  
  79.       size 0x0000000000000014  
  80.     offset 3968  
  81.      align 2^4 (16)  
  82.     reloff 0  
  83.     nreloc 0  
  84.      flags 0x00000000  
  85.  reserved1 0  
  86.  reserved2 0  
  87. Section  
  88.   sectname __unwind_info  
  89.    segname __TEXT  
  90.       addr 0x0000000100000f94  
  91.       size 0x0000000000000048  
  92.     offset 3988  
  93.      align 2^0 (1)  
  94.     reloff 0  
  95.     nreloc 0  
  96.      flags 0x00000000  
  97.  reserved1 0  
  98.  reserved2 0  
  99. Section  
  100.   sectname __eh_frame  
  101.    segname __TEXT  
  102.       addr 0x0000000100000fe0  
  103.       size 0x0000000000000018  
  104.     offset 4064  
  105.      align 2^3 (8)  
  106.     reloff 0  
  107.     nreloc 0  
  108.      flags 0x00000000  
  109.  reserved1 0  
  110.  reserved2 0  
  111. Load command 2  
  112.       cmd LC_SEGMENT_64  
  113.   cmdsize 312  
  114.   segname __DATA  
  115.    vmaddr 0x0000000100001000  
  116.    vmsize 0x0000000000001000  
  117.   fileoff 4096  
  118.  filesize 4096  
  119.   maxprot 0x00000007  
  120.  initprot 0x00000003  
  121.    nsects 3  
  122.     flags 0x0  
  123. Section  
  124.   sectname __nl_symbol_ptr  
  125.    segname __DATA  
  126.       addr 0x0000000100001000  
  127.       size 0x0000000000000010  
  128.     offset 4096  
  129.      align 2^3 (8)  
  130.     reloff 0  
  131.     nreloc 0  
  132.      flags 0x00000006  
  133.  reserved1 2 (index into indirect symbol table)  
  134.  reserved2 0  
  135. Section  
  136.   sectname __got  
  137.    segname __DATA  
  138.       addr 0x0000000100001010  
  139.       size 0x0000000000000008  
  140.     offset 4112  
  141.      align 2^3 (8)  
  142.     reloff 0  
  143.     nreloc 0  
  144.      flags 0x00000006  
  145.  reserved1 4 (index into indirect symbol table)  
  146.  reserved2 0  
  147. Section  
  148.   sectname __la_symbol_ptr  
  149.    segname __DATA  
  150.       addr 0x0000000100001018  
  151.       size 0x0000000000000010  
  152.     offset 4120  
  153.      align 2^3 (8)  
  154.     reloff 0  
  155.     nreloc 0  
  156.      flags 0x00000007  
  157.  reserved1 5 (index into indirect symbol table)  
  158.  reserved2 0  
  159. Load command 3  
  160.       cmd LC_SEGMENT_64  
  161.   cmdsize 72  
  162.   segname __LINKEDIT  
  163.    vmaddr 0x0000000100002000  
  164.    vmsize 0x0000000000001000  
  165.   fileoff 8192  
  166.  filesize 916  
  167.   maxprot 0x00000007  
  168.  initprot 0x00000001  
  169.    nsects 0  
  170.     flags 0x0  
  171. Load command 4  
  172.             cmd LC_DYLD_INFO_ONLY  
  173.         cmdsize 48  
  174.      rebase_off 8192  
  175.     rebase_size 8  
  176.        bind_off 8200  
  177.       bind_size 56  
  178.   weak_bind_off 0  
  179.  weak_bind_size 0  
  180.   lazy_bind_off 8256  
  181.  lazy_bind_size 40  
  182.      export_off 8296  
  183.     export_size 80  
  184. Load command 5  
  185.      cmd LC_SYMTAB  
  186.  cmdsize 24  
  187.   symoff 8408  
  188.    nsyms 24  
  189.   stroff 8820  
  190.  strsize 288  
  191. Load command 6  
  192.             cmd LC_DYSYMTAB  
  193.         cmdsize 80  
  194.       ilocalsym 0  
  195.       nlocalsym 16  
  196.      iextdefsym 16  
  197.      nextdefsym 4  
  198.       iundefsym 20  
  199.       nundefsym 4  
  200.          tocoff 0  
  201.            ntoc 0  
  202.       modtaboff 0  
  203.         nmodtab 0  
  204.    extrefsymoff 0  
  205.     nextrefsyms 0  
  206.  indirectsymoff 8792  
  207.   nindirectsyms 7  
  208.       extreloff 0  
  209.         nextrel 0  
  210.       locreloff 0  
  211.         nlocrel 0  
  212. Load command 7  
  213.           cmd LC_LOAD_DYLINKER  
  214.       cmdsize 32  
  215.          name /usr/lib/dyld (offset 12)  
  216. Load command 8  
  217.      cmd LC_UUID  
  218.  cmdsize 24  
  219.     uuid F88FCA7D-3FE0-3556-96A4-4F29B7812D93  
  220. Load command 9  
  221.       cmd LC_VERSION_MIN_MACOSX  
  222.   cmdsize 16  
  223.   version 10.9  
  224.       sdk 10.9  
  225. Load command 10  
  226.       cmd LC_SOURCE_VERSION  
  227.   cmdsize 16  
  228.   version 0.0  
  229. Load command 11  
  230.        cmd LC_MAIN  
  231.    cmdsize 24  
  232.   entryoff 3760  
  233.  stacksize 0  
  234. Load command 12  
  235.           cmd LC_LOAD_DYLIB  
  236.       cmdsize 56  
  237.          name /usr/lib/libSystem.B.dylib (offset 24)  
  238.    time stamp 2 Thu Jan  1 08:30:02 1970  
  239.       current version 1197.1.1  
  240. compatibility version 1.0.0  
  241. Load command 13  
  242.       cmd LC_FUNCTION_STARTS  
  243.   cmdsize 16  
  244.   dataoff 8376  
  245.  datasize 8  
  246. Load command 14  
  247.       cmd LC_DATA_IN_CODE  
  248.   cmdsize 16  
  249.   dataoff 8384  
  250.  datasize 0  
  251. Load command 15  
  252.       cmd LC_DYLIB_CODE_SIGN_DRS  
  253.   cmdsize 16  
  254.   dataoff 8384  
  255.  datasize 24  

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

  1. oliverluan@localhost:~/Documents/Opt/insertsort$ nm -px insertsort  
  2. 0000000100001020 0f 09 0000 00000000000000a9 _L  
  3. 0000000100000000 0f 01 0010 00000000000000ac __mh_execute_header  
  4. 0000000100000dd0 0f 01 0000 00000000000000c0 _insert_sort  
  5. 0000000100000f20 0f 01 0000 00000000000000cd _main  
  6. 0000000100000ea0 0f 01 0000 00000000000000d3 _print_array  
  7. 0000000100001034 0f 09 0000 00000000000000e0 _size  
  8. 0000000000000000 01 00 0100 00000000000000e6 _printf  
  9. 0000000000000000 01 00 0100 00000000000000ee dyld_stub_binder  


 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多