В lldb вы можете быстро найти адрес, установив символическую точку останова, если она известна отладчику каким-либо образом:
b symbolname
Если вы хотите вызвать неэкспортированную функцию из библиотеки без подключенного отладчика, есть несколько вариантов, но каждый из них будет ненадежным в долгосрочной перспективе:
- Жестко закодируйте смещение из экспортированной библиотеки и вызовите exportedSymbol+offset (это будет работать для конкретной двоичной версии библиотеки, но, вероятно, сломается для чего-либо еще)
- Попытайтесь найти двоичную подпись вашей неэкспортируемой функции в загруженной библиотеке. (чуть менее подвержен поломке, но двоичная подпись всегда может измениться)
Возможно, если вы предоставите более подробный контекст, чего вы пытаетесь достичь, можно рассмотреть лучшие варианты.
Обновление:
Поскольку lldb каким-то образом знает об этом символе, я подозреваю, что он определен в команде загрузки Mach-O LC_SYMTAB
вашей библиотеки. Чтобы убедиться, что вы можете проверить двоичный файл lib с помощью таких инструментов, как MachOView или MachOExplorer . Или otool
от Apple, или jtool
/jtool2
Джонатана Левина в консоли.
Вот пример из самой первой записи символа, полученной из LC_SYMTAB в MachOView. Это двоичный файл /usr/lib/dyld В данном примере 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. Может быть больше нюансов, как именно эти адреса выбираются для dylib, но вы поняли идею.
Tbh Мне никогда не приходилось находить такой адрес программно, но это определенно выполнимо (поскольку /usr/bin/sample
может это сделать).
Отсюда добиться чего-то практически:
- Проанализируйте заголовок Mach-o вашего двоичного файла lib (проверьте это и это для начала)
- Найдите
LC_SYMTAB
команду загрузки
- Найдите запись на основе текста вашего символа и найдите виртуальный адрес (материал красного поля)
- Рассчитайте ASLR и примените сдвиг
Существует некоторый C Apple API для разбора Mach-O. Также некоторый код Python существует в дикой природе (он популярен среди людей, занимающихся обратным проектированием).
Надеюсь, это поможет.
person
Kamil.S
schedule
08.01.2020