Получить имя метода из __objc_selrefs в dyld_shared_cache

Я пытаюсь сделать экстрактор dyld, похожий на dyld_decache и dsc_extractor. Но у меня проблемы с разбором раздела __objc_selrefs.

В целях тестирования я использовал libsystem_trace.dylib и смог найти и проанализировать его mach_header, его сегменты и разделы. Но просматривая раздел __DATA.__objc_selrefs, я нахожу указатели типа 0x201b8647fc8 и 0x201b860d716, которые слишком высоки и указывают вне кеша.

Напротив, в обычном файле Macho указатели в разделе __objc_selrefs указывают на соответствующую им строку в разделе __TEXT.__objc_methname.

Я знаю, что dyld скользит и перебазирует разделы, но после долгих возни я так и не смог исправить указатели. Любое руководство было бы удивительным, особенно учитывая, как мало ресурсов там.


person hao wang    schedule 28.03.2020    source источник


Ответы (1)


Эти «адреса» не просто указывают за пределами кеша, они указывают за пределами максимального диапазона, который iOS выделяет для пользовательского адресного пространства.
Дело в том, что это не необработанные адреса, это адреса с некоторыми флагами их. Я видел как минимум 0x20000000000 и 0x40000000000, и они кажутся эксклюзивными для кода Objective-C. Я понятия не имею, что они означают или какова истинная битовая маска для этих флагов, но до сих пор сохранение младших 40 бит (0xffffffffff) адресов сделало работу за меня.
Это превратило бы, например. ваше значение 0x201b8647fc8 в 0x1b8647fc8, которое должно находиться внутри границ общего кэша.

person Siguza    schedule 28.03.2020
comment
Это сработало чудесно! Мне пришлось преобразовать VMAddr в физический адрес, но это было простое решение. Кроме того, я нашел маску в структуре dyld_cache_slide_info2, так что вы были правы. - person hao wang; 29.03.2020