C++ имя калечат вручную
Я пишу скрипт для дизассемблера IDA Pro в Python, используя idapython
плагин. Используя это, я могу заполнить пробелы, в которых автоанализ МАР не дотягивает.
Одна область, которая меня озадачила, - это присвоение имен / функций местам (для лучшего термина) "красивые имена". Пример того, что я имею в виду, показан ниже:
idapython
и сама IDA Pro позволяет мне вводить только основные имена функций C-ish. Если я ввожу запрещенные символы (например, оператор разрешения области видимости), они заменяются подчеркиванием. Однако, если я введу искаженное имя от руки (например, __ZN9IOService15powerChangeDoneEm
), IDA Pro подтвердит это для меня.
Отсюда мой вопрос: как я могу генерировать искаженные имена, чтобы пройти через idapython
? Доступна ли библиотека именования? Один из них доступен на Python? Является ли моя единственная надежда вырвать калечащую функциональность из g++
и обойти это?
4 ответа
Я наконец нашел время, чтобы немного покопаться.
К сожалению, я не смог найти инструмент, но нашел ресурсы.
Если все, что вам нужно, это искажение имен в стиле gcc3, то знайте, что gcc3 использует ABI Itanium C++, который имеет стандартизированную схему искажения имен. Я нашел два документа:
- Страница Itanium C++ ABI
- PDF-документ Соглашения о вызовах, в котором описаны схемы различных компиляторов.
Для справки, оба они взяты со страницы Википедии на Name Mangling.
Один простой (alebit hacky) метод состоит в том, чтобы скомпилировать файл C++ с нужным вам символом, а затем извлечь необходимые символы из таблицы символов файла.o. Приложив немного работы, это может быть приятно для сценариев.
Вот статья, которая объясняет, как искажение сделано Visual Compiler. Я думаю, что вы можете найти информацию в источнике binutils
пакет.
Вы можете использовать библиотеку Clang AST, которая имеет класс MangleContext.
http://clang.llvm.org/doxygen/classclang_1_1CodeGen_1_1MangleContext.html