C ++ имя mangling вручную

Я пишу скрипт для дизассемблера IDA Pro в Python, используя плагин idapython . Используя это, я могу заполнить пробелы, когда автоматический анализ IDA не соответствует требованиям.

Одна из областей, в которой я столкнулся, – это имена мест / функций с (из-за отсутствия лучшего термина) «красивые имена». Ниже приведен пример того, что я имею в виду:

Шаблоны симпатичных имен IDA

idapython и сам IDA Pro позволяют мне вводить базовые имена функций C-ish. Если я ввожу запрещенные символы (например, оператор разрешения области), они заменяются символами подчеркивания. Однако , если я ввожу вручную искаженное имя (например, __ZN9IOService15powerChangeDoneEm ), IDA Pro превзойдет это для меня.

Отсюда мой вопрос: как я могу генерировать искаженные имена для прохождения через idapython ? Доступна ли библиотека имен? Доступен ли в Python? Моя единственная надежда вырвать из g++ и работать над этим?

Я, наконец, обошел немного, чтобы копать.

К сожалению, я не смог найти инструмент, но нашел ресурсы.

Если все, что вы хотите, это mangle names в модере gcc3, тогда знайте, что gcc3 использует Itanium C ++ ABI, который имеет стандартизованную схему переключения имен. Я нашел два документа:

  • Страница ISI Itanium C ++
  • Документ для звонков в формате PDF, в котором описываются схемы различных компиляторов

Для справки, оба они взяты со страницы Википедии в названии Mangling .

Один простой (alebit hacky) метод должен был скомпилировать файл C ++ с нужным вам символом, а затем извлечь необходимые символы из таблицы символов файла .o. С небольшой работой это может быть красиво написано.

Вот статья, в которой объясняется, как mangling выполняется визуальным компилятором. Для mangling, сделанного gcc, я думаю, вы можете найти информацию в источнике пакета binutils .

Вы можете использовать библиотеку Clang AST, которая имеет класс MangleContext.

http://clang.llvm.org/doxygen/classclang_1_1CodeGen_1_1MangleContext.html