Как выполнить команду отладчика из приложения - PullRequest
0 голосов
/ 08 января 2020

Во время выполнения я пытаюсь восстановить адрес функции, которая не экспортируется , но доступна через таблицу символов общей библиотеки и, следовательно, видна отладчику.

I ' Я работаю над расширенной процедурой отладки, которая должна фиксировать определенные события и манипулировать временем выполнения. Одно из действий требует знания адреса частной функции (только адрес), который используется в качестве ключа в другом месте.

Мое текущее решение вычисляет смещение этой частной функции относительно известной экспортируемой функции во время сборки используя nm. Это решение ограничивает возможности отладки, поскольку оно зависит от конкретной сборки общей библиотеки.

Предпочтительное решение должно быть способно восстанавливать адрес во время выполнения.

Я надеялся связаться с подключенным отладчик из приложения, но изо всех сил пытаюсь найти какой-либо API для этого.

Какие у меня варианты?

Ответы [ 2 ]

1 голос
/ 08 января 2020

В lldb вы можете быстро найти адрес, установив символьную c точку останова, если она известна отладчику любым способом:

b symbolname

Если вы хотите вызвать неэкспортированную функцию из библиотеки без к отладчику прилагается пара опций, но каждая из них будет ненадежной в долгосрочной перспективе:

  • Жесткий код смещения из экспортированной библиотеки и вызовите exportedSymbol + смещение (это будет работать для конкретной двоичной версии библиотеки, но, скорее всего, сломается для чего-либо еще)
  • Попытка поиска двоичной сигнатуры неэкспортированной функции в загруженной библиотеке. (чуть менее подвержен поломке, но двоичная сигнатура всегда может измениться)

Возможно, если вы предоставите более подробный контекст, что вы пытаетесь достичь лучших вариантов, можно рассмотреть.

Обновление:
Поскольку lldb каким-то образом знает о символе, я подозреваю, что он определен в команде Mach-O LC_SYMTAB load вашей библиотеки. Чтобы убедиться, что вы можете проверить свой двоичный файл lib с помощью таких инструментов, как MachOView или MachOExplorer . Или otool от Apple или jtool / jtool2 от Джонатана Левина в консоли.

Вот пример самой первой записи символа, полученной из LC_SYMTAB в MachOView. Это / usr / lib / dyld binary enter image description here В приведенном здесь примере 0x1000 - это виртуальный адрес. Ваша библиотека, скорее всего, будет 64-битной, поэтому ожидайте 0x10000000 и выше. Фактическая база рандомизируется с помощью ASLR, но вы можете проверить текущее значение с помощью

sample yourProcess

yourProcess, являющегося исполняемым файлом с использованием библиотеки, которую вы ищете. Вывод должен содержать:

Binary Images:
       0x10566a000 -        0x105dc0fff  com.apple.finder (10.14.5 - 1143.5.1) <3B0424E1-647C-3279-8F90-4D374AA4AC0D> /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder
       0x1080cb000 -        0x1081356ef  dyld (655.1.1) <D3E77331-ACE5-349D-A7CC-433D626D4A5B> /usr/lib/dyld
...

Это загруженные адреса 0x100000000, смещенные на ASLR. Могло бы быть больше нюансов, как именно эти адреса выбираются для dylibs, но вы поняли.

Tbh Мне никогда не нужно было находить такой адрес программно, но это определенно выполнимо (так как /usr/bin/sample может это сделать ).

Отсюда для достижения чего-то практически:

  1. Разбор заголовка Mach-o вашего двоичного файла lib (проверьте this & this для начинающих)
  2. Найти LC_SYMTAB загрузить команду
  3. Найти текстовую запись на основе символов и найти виртуальный адрес (красный текст)
  4. Рассчитать ASLR и применить сдвиг

Существует некоторый C Apple API для анализа Mach-O. Также некоторый код Python существует в дикой природе (будучи популярным среди реверс-инженеров).

Надеюсь, это поможет.

1 голос
/ 08 января 2020

Во время выполнения я пытаюсь восстановить адрес функции, которая не экспортируется, но доступна через таблицу символов общей библиотеки и, следовательно, видна отладчику.

Отладчик не волшебный единорог Если таблица символов доступна для отладчика, она также доступна для вашего приложения.

Мне нужно восстановить его адрес по имени , используя отладчик ...

Это совершенно неправильный подход.

Вместо использования отладчика прочитайте таблицу символов для библиотеки в вашем приложении и используйте полученную информацию для вызова целевой функции.

Чтение таблицы символов ELF довольно просто. Пример . Если вы не на платформе ELF, получить эквивалентную информацию не должно быть намного сложнее.

...