Mach-O binary:修补symtab后找不到外部未定义符号

时间:2013-11-27 09:45:59

标签: ios c ida mach-o dyld

我试图象征颠倒的iOS二进制文件。所以我开始学习Mach-O格式here并编写了一个基本程序来测试一个简单的例子,用手工将一个符号添加到剥离的二进制文件中(!):

#include <stdio.h>
#include <stdlib.h>

int division(int a, int b);

int m;

int main(void)
{
    int i,j;

    printf("initializing i\n");
    i = 10;

    printf("initializing j\n");
    j=1;

    printf("i = %d, j = %d\n", i, j);
    m = division(i, j);

    printf("m = %d / %d = %d\n", i, j, m);

    return 0;
}

int division(int a, int b)
{
    return a / b;
}

我做了什么:

  1. 将源代码编译到ARM上面,没有任何名为'helloworld'的优化。
  2. 剥夺了这个'helloworld'程序并称之为'helloworld_stripped'。
  3. 在MachOView和hexfiend中打开'helloworld_stripped'(进行编辑)。
  4. 另存为'helloworld_stripped'为'helloworld_stripped2'
  5. 通过将'_division'添加到字符串表的末尾来修改字符串表
  6. Modifying string table by adding division in red

    1. 在'helloworld_stripped2'的符号表中添加了一个条目,如下所示:
    2. Adding the division symbol in the symtab

      1. 修改了LC_SYMTAB和LC_DYNSYMTAB加载命令以反映新的字符串表大小,偏移等。以下otool -l输出反映了这一点(“* * * * *”是helloworld_stripped,'----'是helloworld_stripped2) : <code>otool -l</code> - load commands changed
      2. 然后我在IDA pro中打开'helloworld_stripped'和'helloworld_stripped2',看看:
      3. Problem

        问题:

        修补后的可执行文件'helloworld_stripped2'缺少printf函数。为什么printf函数在被剥离的可执行文件中而不是在修补的可执行文件中?我没有在符号表中更改它,并且不更改字符串表中printf的位置。

        非常感谢任何建议!

        编辑:请参阅下面的答案。

1 个答案:

答案 0 :(得分:0)

好的,基本上,我自己发现了问题:我忘了使用新的符号表条目值更新间接符号表。当我更新它时,IDA pro能够同时显示_division和_printf。

enter image description here

圈出的值对应于符号表中的项目索引。由于符号表被更新,间接(例如printf)符号的索引会发生变化。因此,必须修改动态符号表以反映其新的条目索引。希望它可以帮助那些人。