Двоичный файл Mach-O: внешние неопределенные символы не найдены после исправления symtab

Я пытаюсь символизировать перевернутые двоичные файлы 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;
}

Что я сделал:

  1. Скомпилировал исходный код в ARM выше без какой-либо оптимизации под названием «helloworld».
  2. Удалил эту программу «helloworld» и назвал ее «helloworld_stripped».
  3. Открыл 'helloworld_stripped' в MachOView и hexfiend (для редактирования).
  4. Сохранить как «helloworld_stripped» как «helloworld_stripped2»
  5. Измените таблицу строк, добавив '_division' в конец таблицы строк.

Изменение таблицы строк путем добавления красного деления

  1. Добавлена ​​запись в таблицу символов helloworld_stripped2, например:

Добавление символа деления в symtab

  1. Изменены команды загрузки LC_SYMTAB и LC_DYNSYMTAB, чтобы отразить новые размеры таблицы строк, смещения и т. д. Следующий вывод otool -l отражает это ("* * * * *" — это helloworld_stripped, а '----' — это helloworld_stripped2): ‹code›otool -l‹/code› — изменены команды загрузки
  2. Затем я открываю «helloworld_stripped» и «helloworld_stripped2» в IDA pro и вижу это:

Проблема

Вопрос:

В пропатченном исполняемом файле helloworld_stripped2 отсутствует функция printf. Почему функция printf находится в удаленном исполняемом файле, а не в исправленном? Я не менял его в таблице символов и положение printf в таблице строк не изменилось.

Любые советы очень ценятся!

EDIT: см. ответ ниже.


person gigasai    schedule 27.11.2013    source источник
comment
Задайте как три вопроса вместо одного   -  person Chinna    schedule 27.11.2013


Ответы (1)


Хорошо, в основном я сам обнаружил проблему: я забыл обновить таблицу косвенных символов новыми значениями записей в таблице символов. Когда я обновил его, IDA pro может показывать как _division, так и _printf.

введите здесь описание изображения

Значения, обведенные кружком, соответствуют индексу элемента в таблице символов. Поскольку таблица символов обновляется, индекс косвенных символов (таких как printf) изменяется. Таким образом, таблица динамических символов должна быть изменена, чтобы отразить их новый индекс входа. Надеюсь, это поможет кому-то там.

person gigasai    schedule 28.11.2013