Мне нужно написать код проверки лицензии в 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
, и я боюсь, что злоумышленник может использовать эту информацию для более легкой атаки на код проверки лицензии.
Вот мои вопросы:
- Помогут ли эти строки злоумышленнику или они бесполезны без соответствующей информации о символе (которая будет раскрыта
nm
)? - Могут ли параметры полосы, перечисленные ниже (в частности, удаление всех символов), вызвать проблему при отправке моего кода - например. при попытке символизировать трассировку стека? Я сохраняю dSYM поставляемых двоичных файлов.
- Поможет ли установка «Выполнить предварительную ссылку для одного объекта» на «Да» в запутывании кода? Единственный эффект, который я вижу, заключается в том, что размер dSYM уменьшается с ~ 8 МБ до ~ 6 МБ.
В настоящее время я использую следующие варианты сборки:
- Постобработка развертывания = Да
- Разделить связанный продукт = Да
- Использовать отдельную полосу = Да
- Стиль полосы = все символы
- Другие флаги компоновщика = "-Xlinker -x"
- Выполнить предварительную связь с одним объектом = Нет (см. выше)