Swift:如何完全去除internal/inline符号?

Swift: how to fully strip internal/inline symbols?

我需要在 Swift 中编写一些许可证检查代码。我知道 Swift 一开始就不是那种代码的最佳选择,因为它更难混淆。但是如果把需要知道app是否注册的代码写在Swift里,这还是比把license检查的代码放在一个单独的framework里可以换出来好。

为了更难攻击该代码,我试图通过至少删除与其相关的符号来混淆代码。

为此,我有一些具有内部可见性的内联方法如下:

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

鉴于方法应始终内联,因此无需在二进制符号中包含方法名称 table。 (我知道 inline 注释通常只是对编译器的提示,但我有理由相信它们在这种情况下确实有效。)

与此一致,nm MyApp.app/Contents/MacOS/MyApp 不包含对 checkLicense 的引用。 但是,strings MyApp.app/Contents/MacOS/MyApp 的输出仍然包含对 checkLicense 的引用,恐怕攻击者可以使用该信息更容易地攻击许可证检查代码。

这是我的问题:

  1. 这些字符串是否会帮助攻击者,或者如果没有相应的符号信息(这些信息会被 nm 暴露),它们是否毫无用处?
  2. 下面列出的剥离设置(特别是剥离所有符号)是否会在发送我的代码时导致问题 - 例如尝试符号化堆栈跟踪时?我确实保留了已交付二进制文件的 dSYM。
  3. 将 "Perform Single-Object Prelink" 设置为是有助于混淆代码吗?我能看到的唯一效果是 dSYMs 大小从 ~8 MB 缩小到 ~6 MB。

我目前正在使用以下构建选项:

我再次对此进行了调查,发现以下条带设置适用于发布版本:

  • 部署后处理 = 是
  • 删除链接产品 = 是
  • 执行单对象预链接 = 否
  • 使用单独的条带:可选,没有区别
  • 条带样式:
    • 主应用程序的所有符号(根据 this guide 相当于 -Xlinker -s
    • 库的非全局符号(相当于 -Xlinker -x
  • 其他链接器标志:None;已由“Strip Style”提供