Я пытаюсь символизировать перевернутые двоичные файлы iOS. Поэтому я начал изучать формат Mach-O здесь и написал базовую программу для проверки простого примера добавления одного символа к удаленному двоичному файлу вручную (!):
#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;
}
Что я сделал:
- Скомпилировал исходный код в ARM выше без какой-либо оптимизации под названием «helloworld».
- Удалил эту программу «helloworld» и назвал ее «helloworld_stripped».
- Открыл 'helloworld_stripped' в MachOView и hexfiend (для редактирования).
- Сохранить как «helloworld_stripped» как «helloworld_stripped2»
- Измените таблицу строк, добавив '_division' в конец таблицы строк.
- Добавлена запись в таблицу символов helloworld_stripped2, например:
- Изменены команды загрузки LC_SYMTAB и LC_DYNSYMTAB, чтобы отразить новые размеры таблицы строк, смещения и т. д. Следующий вывод
otool -l
отражает это ("* * * * *" — это helloworld_stripped, а '----' — это helloworld_stripped2): - Затем я открываю «helloworld_stripped» и «helloworld_stripped2» в IDA pro и вижу это:
Вопрос:
В пропатченном исполняемом файле helloworld_stripped2 отсутствует функция printf. Почему функция printf находится в удаленном исполняемом файле, а не в исправленном? Я не менял его в таблице символов и положение printf в таблице строк не изменилось.
Любые советы очень ценятся!
EDIT: см. ответ ниже.