Получить имя метода из __objc_selrefs в dyld_shared_cache - PullRequest
1 голос
/ 28 марта 2020

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

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

В отличие от этого, в обычном файле Macho указатели в разделе __objc_selrefs указывают на соответствующая им строка в разделе __TEXT .__ objc_methname.

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

1 Ответ

1 голос
/ 28 марта 2020

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

...