帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:COM  COMM  工具  MACH  Dylib  BIN  Comma  插入  
Command line utility for inserting a dylib load command into a Mach-O binary

  • 源代码名称:insert_dylib
  • 源代码网址:http://www.github.com/Tyilo/insert_dylib
  • insert_dylib源代码文档
  • insert_dylib源代码下载
  • Git URL:
    git://www.github.com/Tyilo/insert_dylib.git
  • Git Clone代码到本地:
    git clone http://www.github.com/Tyilo/insert_dylib
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/Tyilo/insert_dylib
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • insert_dylib

    命令行 实用工具,用于将dylib加载命令插入到 mach o 二进制文件中。

    执行以下( 如果二进制是 fat,那么每个arch都是):

    • LC_LOAD_DYLIB 加载命令添加到加载命令的末尾
    • 增加头的mach ncmds 并调整它的sizeofcmds
    • ( 如果存在,则移除代码签名)

    用法

    
    Usage: insert_dylib dylib_path binary_path [new_binary_path]
    
    
    Option flags: --inplace --weak --overwrite --strip-codesig --no-strip-codesig --all-yes
    
    
    
    

    insert_dylib 插入加载命令以在 binary_path 中加载 dylib_path

    除非指定了 --inplace 选项,否则 insert_dylib 将在 new_binary_path 处生成一个新的二进制文件。
    如果没有指定 --inplacenew_binary_path,输出二进制文件将位于与输入二进制文件相同的位置,并将它的前置为名称。

    如果指定了 --weak 选项,insert_dylib 将插入 LC_LOAD_WEAK_DYLIB 加载命令而不是 LC_LOAD_DYLIB

    示例

    
    $ cat> test.c
    
    
    int main(void) {
    
    
     printf("Testingn");
    
    
     return 0;
    
    
    }
    
    
    ^D
    
    
    $ clang test.c -o test &>/dev/null
    
    
    $ insert_dylib/usr/lib/libfoo.dylib test
    
    
    The provided dylib path doesn't exist. Continue anyway? [y/n] y
    
    
    Added LC_LOAD_DYLIB to test_patched
    
    
    $./test
    
    
    Testing
    
    
    $./test_patched
    
    
    dyld: Library not loaded:/usr/lib/libfoo.dylib
    
    
     Referenced from:/Users/Tyilo/./test_patched
    
    
     Reason: image not found
    
    
    Trace/BPT trap: 5
    
    
    
    
    otooldiff 与原始二进制文件之间
    
    $ diff -u <(otool -hl test) <(otool -hl test_patched)
    
    
    ---/dev/fd/63 2014-07-30 04:08:40.000000000 +0200
    
    
    +++/dev/fd/62 2014-07-30 04:08:40.000000000 +0200
    
    
    @@ -1,7 +1,7 @@
    
    
    -test:
    
    
    +test_patched:
    
    
     Mach header
    
    
     magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
    
    
    - 0xfeedfacf 16777223 3 0x80 2 16 1296 0x00200085
    
    
    + 0xfeedfacf 16777223 3 0x80 2 17 1344 0x00200085
    
    
     Load command 0
    
    
     cmd LC_SEGMENT_64
    
    
     cmdsize 72
    
    
    @@ -231,3 +231,10 @@
    
    
     cmdsize 16
    
    
     dataoff 8296
    
    
     datasize 64
    
    
    +Load command 16
    
    
    + cmd LC_LOAD_DYLIB
    
    
    + cmdsize 48
    
    
    + name/usr/lib/libfoo.dylib (offset 24)
    
    
    + time stamp 0 Thu Jan 1 01:00:00 1970
    
    
    + current version 0.0.0
    
    
    +compatibility version 0.0.0
    
    
    
    
    --weak 选项
    
    $ insert_dylib --weak/usr/lib/libfoo.dylib test test_patched2
    
    
    The provided dylib path doesn't exist. Continue anyway? [y/n] y
    
    
    Added LC_LOAD_WEAK_DYLIB to test_patched2
    
    
    $./test_patched2
    
    
    Testing
    
    
    
    

    删除代码签名

    要删除代码签名,就足以删除 LC_CODE_SIGNATURE 负载命令并修正头和 sizeofcmds的django ncmds,假设它是最后一个负载命令。

    但是,如果你只是这样做,codesign_allocate ( 由 codesignldid 使用) 将失败,错误如下:

    
    .../codesign_allocate: file not in an order that can be processed (link edit information does not fill the __LINKEDIT segment):
    
    
    
    

    为了修复这个 insert_dylib 假设 LC_CODE_SIGNATURE 位于 __LINKEDIT 段的末尾,该段位于结构片段结束的结尾。

    然后截断该切片以移除 __LINKEDIT 段的代码签名部分。 它还从新文件大小更新 __LINKEDIT 段的LC_SEGMENT ( 或者 LC_SEGMENT64 ) load命令。 如果二进制是 fat,我们也更新大小,也可能移动切片,因此也应该更新偏移量。

    __LINKEDIT 段中删除代码签名后,该段中的最后一个内容通常是字符串表。 由于代码签名似乎由 0x10 对齐,因此移除代码签名后,在段末尾的填充处没有任何指向填充,即 codesign_allocate 不喜欢。 要修复这个问题,我们只增加 LC_SYMTAB 命令中字符串表的大小,这样它也包括填充。

    待办事项

    • 改进了可用空间的检查以插入新的加载命令
    • 如果 LC_CODE_SIGNATURE 不是最后一个加载命令,则允许移除它
    • 如果空间不够( suggesion由 dirkg ),则删除 __RESTRICT,__restrict


    文章标签:COM  COMM  mac  Comma  BIN  命令行  MACH  工具  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语