我试图象征颠倒的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;
}
我做了什么:
otool -l
输出反映了这一点(“* * * * *”是helloworld_stripped,'----'是helloworld_stripped2) :
问题:
修补后的可执行文件'helloworld_stripped2'缺少printf函数。为什么printf函数在被剥离的可执行文件中而不是在修补的可执行文件中?我没有在符号表中更改它,并且不更改字符串表中printf的位置。
非常感谢任何建议!
编辑:请参阅下面的答案。
答案 0 :(得分:0)
好的,基本上,我自己发现了问题:我忘了使用新的符号表条目值更新间接符号表。当我更新它时,IDA pro能够同时显示_division和_printf。
圈出的值对应于符号表中的项目索引。由于符号表被更新,间接(例如printf)符号的索引会发生变化。因此,必须修改动态符号表以反映其新的条目索引。希望它可以帮助那些人。