SwiftShield代码混淆

概述

SwiftShield是一个为iOS项目对象(包括你的Pod和Storyboard)生成不可逆加密名称的工具,以保护你的应用程序免受逆向设计iOS应用程序的工具,如class-dump和Cycript

   func  cxncjnx8fh83FDJSDd(){
     return  vPAOSNdcbif372hFKF()
  } 
}
自动模式(仅限Swift)

使用该-automatic标记,SwiftShield将使用SourceKit自动模糊整个项目(包括依赖项)。请注意,SwiftShield的自动模式的范围与Xcode的本机重构工具的范围直接相关,后者不会重构所有内容。虽然文档中的特定案例不会被混淆,但SwiftShield将对所有可以进行逆向工程的Swift类和方法进行模糊处理

SourceKit Bugs
  • is模式:如果左侧元素是可选(if [].first is Foo),Foo将不会被混淆。所以,左侧的对象必须是非可选的
Bfore
if annotation is MAUserLocation {}
之前annotation是可选类型,MAUserLocation不会被混淆,但是MAUserLocation类又被混淆,所以导致MAUserLocation找不到,也会报错

After
guard let annotation = annotation  else {  return  }
 /// 当前定位
  if annotation is MAUserLocation {}
  • 枚举名称:在模式匹配中明确使用枚举类型可防止其被编入索引(if case MyClass.MyEnum.myCase {}- myCase将被编入索引,但MyClass不会。)
  • 包含类型的旧版KeyPath,例如#keyPath(Foo.bar)不会被编入索引。比如:"\(Foo)",Foo必须是变量,不能是表达式
before
"今天 \(String.timeStampTrans(toDate: double, formatter: "HH:mm") ?? "")"
这样混淆后会出现问题,比如会把)或 }一起混淆,导致项目不能运行

After
let temp = String.timeStampTrans(toDate: double, formatter: "HH:mm") ?? ""
"今天 \(temp)"
  • 带selector方法的参数中含有中文,尽量用变量或常量代替
Bfore
let item1 = UIBarButtonItem(title: “取消”, style: .plain, target: self, action: #selector(cancelButtonClick(sender:)))
混淆后会报错,混淆后会把)}一起混淆进去,导致项目缺少)}报错

After
let cencelTitle = "取消"
let item1 = UIBarButtonItem(title: cencelTitle, style: .plain, target: self, action: #selector(cancelButtonClick(sender:)))

  • 混淆适配-objc protocol,不可以是optional
Bfore
protocol BottomSheetViewDelegate: NSObjectProtocol {
    @objc optional func bottomSheet(bottomSheet: BottomSheetView, willDisplay state: BottomSheetState)
}
混淆后会报错

After
protocol BottomSheetViewDelegate: NSObjectProtocol {
    @objc func bottomSheet(bottomSheet: BottomSheetView, willDisplay state: BottomSheetState)
}

不会混淆的类型
  • Typealiases和Associated Types:不会被被混淆(-Foo typealias Foo = UIImage | extension Foo {}被忽略并被索引为UIImage)。请注意,这些不能进行逆向工程,因为它们纯粹是编辑器,所以不需要采取任何措施!
  • 枚举案例和名称:虽然它们被正确编入索引,但是某些枚举CodingKeys并不意味着要更改。一旦确定枚举是否与内部框架相关的方式实现,这将再次激活
  • 已合并:名称小于四个字符的方法:如果在全局范围内声明操作符,则仅对其进行索引。由于大多数人使用public static func,他们被索引为常规方法。为防止运算符被混淆,名称短于四个字符的方法将不会被混淆
  • 属性:属性暂停一段时间,因为它们会破坏派生Codable类型。虽然混淆正常,但如果构建Codable类型以在后端的json之上工作,则解析将因为不同的属性名称而失败。
  • 模块名称:尚未实现!
手动模式(Swift / OBJ-C

这里自己参考Github上的介绍,因为我当时项目已成型,改变需要混淆的方法或变量会比较耗时就放弃手动

步骤

  1. 从此存储库下载最新版本然后单击此处查看如何设置SwiftShield。
  2. 打开终端,cd到下载的Swiftsheild文件夹下(直接把下载的Swiftsheild拖到终端就行)
  3. sudo chmod -R 777 (下载的swiftsheild文件路径,再拖一次就行),给swiftsheild运行的权限,否者会报错
  4. chmod -R 774 PATHTOPROJECTFOLDER(项目路径)
    解锁项目(如果使用CocoaPods)默认情况下,CocoaPods源被锁定。SwiftShield需要解锁它们以便能够混淆您的项目。要解锁项目,您可以运行
  5. 修改可能影响SwiftShield的脚本,因为我当时的项目里用到了swiftlint脚本,用来规范swift项目语法,导致混淆失败
    您所要做的就是将它们包装在一个"$SWIFTSHIELDED" != "true"条件中。例如,我的SwiftGen脚本:

if [ "$SWIFTSHIELDED" != "true" ]; then
    $PODS_ROOT/SwiftGen/bin/swiftgen images --output $SRCROOT/Asset.swift $SRCROOT/Assets.xcassets
fi

  1. 运行命令

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:您的应用程序的主要.xcodeproj / .xcworkspace文件路径。
  • -automatic-project-scheme myScheme:从你的建设的主要方案-automatic-project-file,写项目名称就行了
  • -ignore-modules:防止某些模块被混淆,用逗号分隔。如果某个模块无法正确混淆,请使用此选项。请注意,这应该是导入模块的确切名称(而不是目标名称!)。
    例:MyLib,MyAppRichNotifications,MyAppWatch_Extensio,我当时就是忽略所有的Pods里的第三方库(开源没必要),以及一些不能混淆的文件,比如与H5定好的交互方法,混淆后会找不到报错,不用混淆
注意点

如果项目已成型,不知道改哪里,可以先混淆一遍,然后运行会报错,在一个个去改,我当时项目第一次报了200多个错误,看起来很多,很多都是不需要改的,比如,混淆了)}导致一系列报错,改一个就好了
大概也就改了几十处地方,工作量不是很大

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容