SwiftShield是一个用于为你的iOS项目对象生成不可逆加密名称的工具,其目的是保护你的iOS apps不被一些逆向工具所破解(如class-dump和Cycript)。
代码语言:javascript复制class fjiovh4894bvic: XbuinvcxoDHFh3fjid {
func cxncjnx8fh83FDJSDd() {
return vPAOSNdcbif372hFKF()
}
}
自动模式(仅限 Swift)
使用-automatic标签,SwiftShield将使用SourceKit自动混淆整个项目(包括依赖项)。请注意,SwiftShield的自动模式的范围与Xcode的本机重构工具的范围直接相关,后者不会重构所有内容。虽然文档中的特定情况不会被混淆,但SwiftShield将对所有可以进行逆向的Swift类和方法进行混淆处理。
手动模式(Swift/OBJ-C)
如果你想要完全混淆所有内容 - 包括typealases和内部属性名称,你也可以使用手动模式。这是运行SwiftShield的最简单方式,但同时也是最耗时的。使用时,SwiftShield将根据你选择的标签对其属性和类进行混淆处理。例如,在手动模式下运行SwiftShield并使用__s标签,代码如下:
代码语言:javascript复制class EncryptedVideoPlayer__s: DecryptionProtocol__s {
func start__s() {
let vc__s = ImportantDecryptingController__s(secureMode__s: true)
vc__s.start__s(playAutomatically__s: true)
}
}
混淆后:
代码语言:javascript复制class fjiovh4894bvic: XbuinvcxoDHFh3fjid {
func cxncjnx8fh83FDJSDd() {
let DjivneVjxrbv42jsr = vPAOSNdcbif372hFKF(vnjdDNsbufhdks3hdDs: true)
DjivneVjxrbv42jsr.cxncjnx8fh83FDJSDd(dncjCNCNCKSDhssuhw21w: true)
}
}
对加密的 Crash logs 进行反混淆处理
成功加密项目后,SwiftShield将生成一个包含conversionMap.txt文件的输出文件夹,其中包含对项目所做的所有更改。
代码语言:javascript复制//
// SwiftShield
// Conversion Map
// Automatic mode for MyApp 2.0 153, 2018-09-24 10.23.48
//
Data:
ViewController ===> YytSIcFnBAqTAyR
AppDelegate ===> uJXJkhVbwdQGNhh
SuperImportantClassThatShouldBeHidden ===> GDqKGsHjJsWQzdq
你可以通过运行以下命令来使用此文件自动反混淆任何类型的基于文本的crash文件:
代码语言:javascript复制swiftshield -deobfuscate CRASH_FILE -deobfuscate-map PATH_TO_CONVERSION_MAP
必要条件
自动模式
如果app的一个或多个模块/扩展无法满足这些条件,则可以使用-ignore-modules参数避免对其进行混淆处理。
1.没有基于类/属性名称的逻辑,比如加载MyClass.xib因为String(describing: type(of:self))为'MyClass'。 2.没有调用Swift方法的Objective-C类(调用Objective-C方法的Swift类是可以的,除非涉及到接口) 3.最新的Swift版本和Xcode命令行工具(适用于所有版本,但由于SourceKit版本不同,结果可能也会有所不同) 4.确保你的项目不包含SourceKit的bug。虽然这些bug不会阻止项目被混淆,但其中一些可能需要在之后进行一些手动修复。
(在Info.plist中使用NSExtensionPrincipalClass或变体的App Extensions(如Rich Notifications/Watch apps)也会对此类引用进行混淆处理,但会假定你没有将其更改为默认的$(PRODUCTMODULENAME).ClassName值。如果您修改这些plist指向不同模块中的类,则必须在运行此工具后手动更改它们。)
手动模式
请确保你的标签不会被用在那些不应被混淆的内容上,例如硬编码字符串。
安装
警告:SwiftShield会不可逆地覆盖你所有的源文件。因此,建议你只在CI server和release builds上运行它。
从该存储库下载最新版本,然后单击此处查看如何设置SwiftShield。
运行
自动模式
代码语言:javascript复制swiftshield -automatic -project-root /app/MyApp -automatic-project-file /app/MyApp/MyApp.xcworkspace -automatic-project-scheme MyApp-AppStore
必要参数:
automatic:启用自动模式。 project-root:项目的根目录。SwiftShield将使用它来搜索你的项目文件。 automatic-project-file:你app的main .xcodeproj/.xcworkspace文件。 automatic-project-scheme myScheme:从你的-automatic-project-file构建的main scheme。
可选参数:
ignore-modules:忽略混淆某些模块,用逗号分隔。如果某个模块无法正确混淆,请使用此选项。注意,这应该是导入模块的确切名称(而不是目标名称!)。示例:MyLib,MyAppRichNotifications,MyAppWatch_Extension show-sourcekit-queries:打印发送到SourceKit的查询。注意,打印的数据内容量会非常大,这会导致你的终端看上去很混乱,因此仅将其用于错误报告和功能开发!
手动模式
代码语言:javascript复制swiftshield -project-root /app/MyApp
必要参数:
project-root:项目的根目录。SwiftShield将使用它来搜索你的项目文件,storyboards和源文件。
可选参数:
tag:使用自定义标签。默认为__s。
两种模式的额外参数
verbose:打印详细信息。 obfuscation-character-count:设置混淆名称的字符数。默认情况下,为32。注意,由于名称冲突的可能性较高,因此使用较小的数值会导致运行速度变慢。 dry-run:实际上不会覆盖文件。对调试有用!
贡献
我们非常欢迎对SwiftShield的贡献!目前没有贡献指南,因此你可以自由使用“Issues”选项卡来讨论未来的功能和改进。