Ios Mach-O二进制:修补symtab后未找到外部未定义符号

Ios Mach-O二进制:修补symtab后未找到外部未定义符号,ios,c,ida,mach-o,dyld,Ios,C,Ida,Mach O,Dyld,我正试图用符号化的方法来表示反转的iOS二进制文件。因此,我开始学习Mach-O格式,并编写了一个基本程序来测试一个简单的示例,即手动将一个符号添加到精简二进制文件中(!): #包括 #包括 国际分部(国际a、国际b); int m; 内部主(空) { int i,j; printf(“初始化i\n”); i=10; printf(“初始化j\n”); j=1; printf(“i=%d,j=%d\n”,i,j); m=分区(i,j); printf(“m=%d/%d=%d\n”,i,j,m);

我正试图用符号化的方法来表示反转的iOS二进制文件。因此,我开始学习Mach-O格式,并编写了一个基本程序来测试一个简单的示例,即手动将一个符号添加到精简二进制文件中(!):

#包括
#包括
国际分部(国际a、国际b);
int m;
内部主(空)
{
int i,j;
printf(“初始化i\n”);
i=10;
printf(“初始化j\n”);
j=1;
printf(“i=%d,j=%d\n”,i,j);
m=分区(i,j);
printf(“m=%d/%d=%d\n”,i,j,m);
返回0;
}
整数分割(整数a,整数b)
{
返回a/b;
}
我所做的:

  • 将源代码编译到上面的ARM,而不进行任何名为“helloworld”的优化
  • 剥离了这个“helloworld”程序并称之为“helloworld_剥离”
  • 在MachOView和Hexfeind中打开“helloworld_stripped”(编辑它)
  • 另存为“helloworld\u stripped”为“helloworld\u stripped2”
  • 通过在字符串表的末尾添加“\u division”来修改字符串表
  • 在“helloworld_stripped2”的符号表中添加了一个条目,如下所示:
  • 修改了LC_SYMTAB和LC_DYNSYMTAB load命令,以反映新的字符串表大小、偏移量等。以下
    otool-l
    输出反映了这一点(“***”为helloworld_stripped,“---”为helloworld_stripped2): otool-l-加载命令已更改“>
  • 然后我在IDA pro中打开“helloworld_Striped”和“helloworld_stripped2”,可以看到:
  • 问题:

    打补丁的可执行文件“helloworld_stripped2”缺少printf函数。为什么printf函数在打补丁的可执行文件中而不是在打补丁的可执行文件中?我没有在符号表中更改它,printf在字符串表中的位置也没有更改

    任何建议都将不胜感激


    编辑:参见下面的答案。

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


    圆圈中的值与符号表中的项目索引相对应。由于符号表已更新,间接(如printf)符号的索引将发生变化。因此,必须修改动态符号表以反映其新的条目索引。希望它能帮助其他人。

    以三个问题而不是一个问题的形式提问
    #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;
    }