前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swiftshield:SwiftOBJ-C 代码混淆工具

Swiftshield:SwiftOBJ-C 代码混淆工具

作者头像
FB客服
发布2019-10-10 16:16:44
2.3K0
发布2019-10-10 16:16:44
举报
文章被收录于专栏:FreeBufFreeBuf

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”选项卡来讨论未来的功能和改进。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自动模式(仅限 Swift)
  • 手动模式(Swift/OBJ-C)
  • 对加密的 Crash logs 进行反混淆处理
  • 必要条件
    • 自动模式
      • 手动模式
      • 安装
      • 运行
        • 自动模式
          • 手动模式
            • 两种模式的额外参数
            • 贡献
            相关产品与服务
            命令行工具
            腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档