сложное разрешение ленивых символов

Я хотел написать инструмент, который имитирует функциональность dlopen, выделяя исполняемую область, используя mmap хранить мой динамический библиотечный исполняемый код.

Затем он должен найти адреса символов, посмотрев на таблицу символов.
Кажется, все работает нормально, так как мне нужно только найти адреса символов API (смещение для начального адреса выделенной библиотеки + смещение символов внутри этой библиотеки). Косвенные вызовы других функций в библиотеке правильны, так как код операции вызов использует относительный адрес.

Тем не менее, некоторые специальные символы определены в разделе __la_symbol_ptr в __DATA сегмент, который имеет разрешения на чтение и запись.
похоже, что dlopen должен поместить реализацию во время выполнения (см. пустую заглушку ниже, взятую из инструмента реверсирования бункера).

Я хотел бы знать, что является мотивом для загрузки этого символа во время выполнения. и откуда компоновщик берет реализацию, и кто может изменить реализацию, dlopen или dyld (код внутри моего исполняемого файла)?

    ; Section __la_symbol_ptr
; Range: [0x1010; 0x1018[ (8 bytes)
; File offset : [4112; 4120[ (8 bytes)
; Flags: 0x7
;   S_LAZY_SYMBOL_POINTERS

_printf_ptr:
0000000000001010         dq         _printf                                     ; DATA XREF=imp___stubs__printf
0000000000001018         db  0x00 ; '.'
0000000000001019         db  0x00 ; '.'
000000000000101a         db  0x00 ; '.'
000000000000101b         db  0x00 ; '.'
000000000000101c         db  0x00 ; '.'
000000000000101d         db  0x00 ; '.'
000000000000101e         db  0x00 ; '.'
000000000000101f         db  0x00 ; '.'
0000000000001020         db  0x00 ; '.'
...
..
.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector