Swift:如何完全去除内部/内嵌符号?

MrM*_*age 6 linker llvm debug-symbols swift

我需要在Swift中编写一些许可证检查代码。我知道Swift首先不是那种代码的最佳选择,因为它很难混淆。但是,如果需要知道应用程序是否已注册的代码是用Swift编写的,那还是比将许可证检查代码放在可以互换的单独框架中更好。

为了使攻击代码更加困难,我试图通过至少删除与代码相关的符号来使代码模糊。

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

@inline(__always) static func checkLicense() { /* license checking code */ }
Run Code Online (Sandbox Code Playgroud)

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

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

这是我的问题:

  1. 这些字符串会帮助攻击者吗?或者,如果没有相应的符号信息,这些字符串将毫无用处( nm吗?)吗?
  2. 下面列出的剥离设置(特别是剥离所有符号)会在运送代码时(例如,尝试对堆栈跟踪进行符号化)引起问题吗?我确实保留了已发送二进制文件的dSYM。
  3. 将“执行单对象预链接”设置为“是”有助于混淆代码吗?我看到的唯一效果是dSYM的大小从〜8 MB缩小到〜6 MB。

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

  • 部署后处理=是
  • 带状链接产品=是
  • 使用分隔条=是
  • 条形样式=所有符号
  • 其他链接器标志=“ -Xlinker -x”
  • 执行单对象预链接=否(请参见上文)

MrM*_*age 6

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

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