C++ имя калечат вручную

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

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

Образец скриншота с красивыми именами IDA

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

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

4 ответа

Решение

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

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

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

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

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

Вот статья, которая объясняет, как искажение сделано Visual Compiler. Я думаю, что вы можете найти информацию в источнике binutils пакет.

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

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

Другие вопросы по тегам