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
的引用,恐怕攻击者可以使用该信息更容易地攻击许可证检查代码。
这是我的问题:
- 这些字符串是否会帮助攻击者,或者如果没有相应的符号信息(这些信息会被
nm
暴露),它们是否毫无用处?
- 下面列出的剥离设置(特别是剥离所有符号)是否会在发送我的代码时导致问题 - 例如尝试符号化堆栈跟踪时?我确实保留了已交付二进制文件的 dSYM。
- 将 "Perform Single-Object Prelink" 设置为是有助于混淆代码吗?我能看到的唯一效果是 dSYMs 大小从 ~8 MB 缩小到 ~6 MB。
我目前正在使用以下构建选项:
- 部署后处理 = 是
- 删除链接产品 = 是
- 使用单独的条带 = 是
- 条带样式 = 所有符号
- 其他链接器标志 = "-Xlinker -x"
- 执行单对象预链接 = 否(见上文)
我再次对此进行了调查,发现以下条带设置适用于发布版本:
- 部署后处理 = 是
- 删除链接产品 = 是
- 执行单对象预链接 = 否
- 使用单独的条带:可选,没有区别
- 条带样式:
- 主应用程序的所有符号(根据 this guide 相当于
-Xlinker -s
)
- 库的非全局符号(相当于
-Xlinker -x
)
- 其他链接器标志:None;已由“Strip Style”提供
我需要在 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
的引用,恐怕攻击者可以使用该信息更容易地攻击许可证检查代码。
这是我的问题:
- 这些字符串是否会帮助攻击者,或者如果没有相应的符号信息(这些信息会被
nm
暴露),它们是否毫无用处? - 下面列出的剥离设置(特别是剥离所有符号)是否会在发送我的代码时导致问题 - 例如尝试符号化堆栈跟踪时?我确实保留了已交付二进制文件的 dSYM。
- 将 "Perform Single-Object Prelink" 设置为是有助于混淆代码吗?我能看到的唯一效果是 dSYMs 大小从 ~8 MB 缩小到 ~6 MB。
我目前正在使用以下构建选项:
- 部署后处理 = 是
- 删除链接产品 = 是
- 使用单独的条带 = 是
- 条带样式 = 所有符号
- 其他链接器标志 = "-Xlinker -x"
- 执行单对象预链接 = 否(见上文)
我再次对此进行了调查,发现以下条带设置适用于发布版本:
- 部署后处理 = 是
- 删除链接产品 = 是
- 执行单对象预链接 = 否
- 使用单独的条带:可选,没有区别
- 条带样式:
- 主应用程序的所有符号(根据 this guide 相当于
-Xlinker -s
) - 库的非全局符号(相当于
-Xlinker -x
)
- 主应用程序的所有符号(根据 this guide 相当于
- 其他链接器标志:None;已由“Strip Style”提供