Указатель на функцию C++ в Cycript
В cycript можно получить ссылку на указатель на функцию c, но я не смог использовать этот синтаксис для извлечения указателя на функции C++, используя либо их собственные, либо искаженные имена функций из таблицы символов.
Есть ли способ добраться отсюда?
Обновить:
Обновление от ввода Saurik:
Я не пробовал указатели на функции из символов стиля c, но вы абсолютно правы в том, что нижнее подчеркивание нужно убрать. _DES_encrypt3 должен быть доступен с:
cy# dlsym(RTLD_DEFAULT, "DES_encrypt3")
0x14dc19
Это дает мне правильный адрес указателя.
Когда я смотрю на искаженный символ для xmpp::CapsManager::~CapsManager(), который является __ZN4xmpp11CapsManagerD2Ev_1bf718, я пытаюсь
cy# dlsym(RTLD_DEFAULT, "__ZN4xmpp11CapsManagerD2Ev_1bf718")
null
cy# dlsym(RTLD_DEFAULT, "_ZN4xmpp11CapsManagerD2Ev_1bf718")
null
cy# dlsym(RTLD_DEFAULT, "ZN4xmpp11CapsManagerD2Ev_1bf718")
null
Ни один из этих вариантов не дает указатель.
1 ответ
Мое непосредственное предположение состоит в том, что вы пытаетесь взять необработанное искаженное имя символа (как вы описываете, получая его из таблицы символов), передавая его в dlsym... но для dlsym требуется имя символа уровня C, что означает, что ваш подход будет не работает даже для простого символа C: у вас будет дополнительный _ в начале (если вы проверите таблицу символов, вы увидите, что функции C также искажены, для начала _). Если вы удалите ведущий _, вы сможете использовать dlsym для поиска вашего искаженного символа C++.