Мы используем C ++ в проекте IOS и компилятор Apple llvm 3 для архитектуры ARM. Я заметил, что IDA может открыть exe-файл ARM, и на вкладке экспорт я нашел конструкторы виртуальных таблиц для большого количества кода на c ++ (что-то вроде `construction vtable for’BaseClass-in-OtherClass 00AB6AC5 ‘, где BaseClass и OtherClass являются фактическими классами c ++) и оттуда вы можете найти адреса для других подпрограмм.
Я не знаком с IDA, но я думаю, что оттуда вы можете найти чувствительные подпрограммы и изменить их для других целей. Я хотел бы знать, как все имена символов попали в сборку релиза (нам не хватает переключателя компилятора?) И действительно ли этот материал можно использовать для простого отслеживания подпрограмм, которые работают с конфиденциальной информацией.
Есть ли способ удалить все имена из сборки?
Спасибо,
Raxvan.
strip -x Myapp.app/Contents/MacOS/Myapp
должен удалить все символы, не требующиеся для запуска программы. (Возможно, для этого тоже есть некоторые настройки XCode.) Возможно, вам придется поиграть с параметры видимости чтобы убедиться, что все частные символы помечены правильно.
Обратите внимание, что вы не сможете удалить имена Objective C (классы, поля и методы), так как они закодированы в структурах метаданных Objective C в сегменте данных программы и требуются Objective C во время выполнения.
Другим источником символической информации является C ++ RTTI (информация о типе времени выполнения). IDA в настоящее время не использует его, но возможно восстановить имена классов с помощью некоторых дополнительных сценариев. Вы можете отключить генерацию RTTI с -fno-rtti
но это сломает ваш код, если вы используете dynamic_cast<>
или же typeid
операторы.
Других решений пока нет …