Swift: как полностью удалить внутренние/встроенные символы?

Мне нужно написать код проверки лицензии в Swift. Я знаю, что Swift в первую очередь не оптимален для такого кода, так как его сложнее запутать. Но если код, который должен знать, зарегистрировано ли приложение, написан на Swift, это все же лучше, чем помещать код проверки лицензии в отдельный фреймворк, который можно заменить.

Чтобы усложнить атаку на этот код, я пытаюсь запутать код, по крайней мере удалив связанные с ним символы.

Для этого у меня есть несколько встроенных методов с внутренней видимостью:

@inline(__always) static func checkLicense() { /* license checking code */ }

Учитывая, что метод всегда должен быть встроенным, не должно быть необходимости включать имя метода в таблицу символов двоичного файла. (Я знаю, что аннотации inline часто являются лишь подсказками для компилятора, но у меня есть основания полагать, что в данном случае они работают.)

В соответствии с этим nm MyApp.app/Contents/MacOS/MyApp не содержит ссылок на checkLicense. Однако вывод strings MyApp.app/Contents/MacOS/MyApp по-прежнему содержит ссылки на checkLicense, и я боюсь, что злоумышленник может использовать эту информацию для более легкой атаки на код проверки лицензии.

Вот мои вопросы:

  1. Помогут ли эти строки злоумышленнику или они бесполезны без соответствующей информации о символе (которая будет раскрыта nm)?
  2. Могут ли параметры полосы, перечисленные ниже (в частности, удаление всех символов), вызвать проблему при отправке моего кода - например. при попытке символизировать трассировку стека? Я сохраняю dSYM поставляемых двоичных файлов.
  3. Поможет ли установка «Выполнить предварительную ссылку для одного объекта» на «Да» в запутывании кода? Единственный эффект, который я вижу, заключается в том, что размер dSYM уменьшается с ~ 8 МБ до ~ 6 МБ.

В настоящее время я использую следующие варианты сборки:

  • Постобработка развертывания = Да
  • Разделить связанный продукт = Да
  • Использовать отдельную полосу = Да
  • Стиль полосы = все символы
  • Другие флаги компоновщика = "-Xlinker -x"
  • Выполнить предварительную связь с одним объектом = Нет (см. выше)

person MrMage    schedule 24.04.2017    source источник
comment
Вы можете попробовать отправить свой вопрос в один из списков рассылки Swift: swift.org/community/#mailing -списки.   -  person Stanislav Pankevich    schedule 25.04.2017
comment
Вы когда-нибудь получали ответ на этот вопрос?   -  person rholmes    schedule 07.09.2019
comment
@rholmes, к сожалению, нет.   -  person MrMage    schedule 17.09.2019


Ответы (1)


Я снова исследовал это и обнаружил, что следующие настройки полосы хорошо работают для сборок Release:

  • Постобработка развертывания = Да
  • Разделить связанный продукт = Да
  • Выполнить предварительную связь с одним объектом = Нет
  • Использовать отдельную полосу: необязательно, без разницы
  • Strip Style:
    • All Symbols for the main app (equivalent to -Xlinker -s according to this guide)
    • Неглобальные символы для библиотек (эквивалентно -Xlinker -x)
  • Другие флаги компоновщика: нет; уже предоставлено Strip Style
person MrMage    schedule 31.07.2020
comment
это не работает для динамических библиотек. - person Hogdotmac; 01.07.2021
comment
@Hogdotmac Что именно не работает? Это работает для динамических библиотек моего приложения. - person MrMage; 06.07.2021