Swift:如何完全剥离内部/内联符号?

时间:2017-04-24 11:28:27

标签: swift linker llvm debug-symbols

我需要在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. 将“执行单对象预链接”设置为是有助于混淆代码吗?我能看到的唯一影响是dSYMs的大小从大约8 MB缩小到大约6 MB。
  4. 我目前正在使用以下构建选项:

    • 部署后处理=是
    • 剥离链接产品=是
    • 使用单独的条带=是
    • 剥离样式=所有符号
    • 其他Linker Flags =“ - Xlinker -x”
    • 执行单对象预链接=否(参见上文)

1 个答案:

答案 0 :(得分:2)

我再次对此进行了调查,发现以下剥离设置对发布版本有效:

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