В 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 В приведенном здесь примере 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
может это сделать ).
Отсюда для достижения чего-то практически:
- Разбор заголовка Mach-o вашего двоичного файла lib (проверьте this & this для начинающих)
- Найти
LC_SYMTAB
загрузить команду - Найти текстовую запись на основе символов и найти виртуальный адрес (красный текст)
- Рассчитать ASLR и применить сдвиг
Существует некоторый C Apple API для анализа Mach-O. Также некоторый код Python существует в дикой природе (будучи популярным среди реверс-инженеров).
Надеюсь, это поможет.