freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Swiftshield:SwiftOBJ-C 代码混淆工具
2019-10-04 15:00:29

SwiftShield是一个用于为你的iOS项目对象生成不可逆加密名称的工具,其目的是保护你的iOS apps不被一些逆向工具所破解(如class-dump和Cycript)。 

class fjiovh4894bvic: XbuinvcxoDHFh3fjid {
  func cxncjnx8fh83FDJSDd() {
    return vPAOSNdcbif372hFKF()
  }
}

自动模式(仅限 Swift)

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

手动模式(Swift/OBJ-C)

如果你想要完全混淆所有内容 - 包括typealases和内部属性名称,你也可以使用手动模式。这是运行SwiftShield的最简单方式,但同时也是最耗时的。使用时,SwiftShield将根据你选择的标签对其属性和类进行混淆处理。例如,在手动模式下运行SwiftShield并使用__s标签,代码如下:

class EncryptedVideoPlayer__s: DecryptionProtocol__s {
  func start__s() {
    let vc__s = ImportantDecryptingController__s(secureMode__s: true)
    vc__s.start__s(playAutomatically__s: true)
  }
}

混淆后:

class fjiovh4894bvic: XbuinvcxoDHFh3fjid {
  func cxncjnx8fh83FDJSDd() {
    let DjivneVjxrbv42jsr = vPAOSNdcbif372hFKF(vnjdDNsbufhdks3hdDs: true)
    DjivneVjxrbv42jsr.cxncjnx8fh83FDJSDd(dncjCNCNCKSDhssuhw21w: true)
  }
}

对加密的 Crash logs 进行反混淆处理

成功加密项目后,SwiftShield将生成一个包含conversionMap.txt文件的输出文件夹,其中包含对项目所做的所有更改。

//
//  SwiftShield
//  Conversion Map
//  Automatic mode for MyApp 2.0 153, 2018-09-24 10.23.48
//
Data:
ViewController ===> YytSIcFnBAqTAyR
AppDelegate ===> uJXJkhVbwdQGNhh
SuperImportantClassThatShouldBeHidden ===> GDqKGsHjJsWQzdq

你可以通过运行以下命令来使用此文件自动反混淆任何类型的基于文本的crash文件:

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)也会对此类引用进行混淆处理,但会假定你没有将其更改为默认的$(PRODUCT_MODULE_NAME).ClassName值。如果您修改这些plist指向不同模块中的类,则必须在运行此工具后手动更改它们。)

手动模式

请确保你的标签不会被用在那些不应被混淆的内容上,例如硬编码字符串。

安装

警告:SwiftShield会不可逆地覆盖你所有的源文件。因此,建议你只在CI server和release builds上运行它。

从该存储库下载最新版本,然后单击此处查看如何设置SwiftShield

运行

自动模式

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的查询。注意,打印的数据内容量会非常大,这会导致你的终端看上去很混乱,因此仅将其用于错误报告和功能开发!

手动模式

swiftshield -project-root /app/MyApp

必要参数:

project-root:项目的根目录。SwiftShield将使用它来搜索你的项目文件,storyboards和源文件。

可选参数:

tag:使用自定义标签。默认为__s。

两种模式的额外参数

verbose:打印详细信息。

obfuscation-character-count:设置混淆名称的字符数。默认情况下,为32。注意,由于名称冲突的可能性较高,因此使用较小的数值会导致运行速度变慢。

dry-run:实际上不会覆盖文件。对调试有用!

贡献

我们非常欢迎对SwiftShield的贡献!目前没有贡献指南,因此你可以自由使用“Issues”选项卡来讨论未来的功能和改进。

*参考来源:GitHub,FB小编secist编译,转载请注明来自FreeBuf.COM


# ios # Swiftshield # 混淆工具
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者