Swift 混淆方案探索
混淆方案主要分為一下兩種型別:
- 原始碼混淆: 混淆各種類名函式簽名等,其主要目的是使其無法通過函式簽名去推測函式功能。
- llvm混淆: 利用編譯器進行彙編級別程式碼混淆,這樣使得app的彙編程式碼更加難以閱讀,詳細示例
這裡主要介紹第一種,對於llvm混淆感興趣的可以看看:
基於特定規則混淆code
事先規定對需要混淆的函式和類加上指定字首,然後通過指令碼正則匹配掃描原始檔,使用隨機字串替換掉函式名和類名。
特點
實現起來比較簡單,不需要做大量的指令碼編寫工作
缺陷
- 對於已經完成的專案,改動量太大
- 一定程度上增加了編碼的工作量,以及影響了程式碼的閱讀性
總結
侵入性比較大,不具備透明性這個特點,不是一個讓人滿意的方案
相關文章
iOS Framework混淆/編譯打包指令碼(支援swift/oc/c++)
基於Sirius 進行混淆
Sirius 提供程式碼混淆功能,並且提供多種混淆方案,但它存在一下缺陷:
-
需要手動配置
files.json
,這個工作量還是很大的
files.json
示例:
{ "project": { "rootPath": "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject", "projectFilePath": "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject/iOSTestApp.xcodeproj" }, "module": { "name": "iOSTestApp", "triple": "arm64-apple-ios11.0" }, "sdk": { "name": "iphoneos", "path": "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk" }, "sourceFiles": [ "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject/iOSTestApp/ViewController.swift", "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject/iOSTestApp/AppDelegate.swift" ], "layoutFiles": [ "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject/iOSTestApp/Base.lproj/LaunchScreen.storyboard", "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject/iOSTestApp/Base.lproj/Main.storyboard" ], "explicitlyLinkedFrameworks": [ { "name":"CoreImage", "path":"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/" } ], "implicitlyLinkedFrameworks":[ "UIKit" ], "frameworkSearchPaths": [ "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject/Pods/Crashlytics/iOS" ], "headerSearchPaths": [ "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject/Pods/Headers/Public" ], "configurationFile": "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject/.obfuscation.yml" ], "bridgingHeader": "/Users/siejkowski/Polidea/SwiftObfuscator/TestProjects/iOS/Original/XcodeSampleProject/Bridging-header.h" ] }
如果你的工程檔案多的話,手動配置這個檔案很麻煩的。所以我嘗試著使用指令碼生成files.json
解析pbxproj ,生成 files.json
-
使用
plutil
(系統自帶)工具 將project.pbxproj 解析為jsonplutil -convert json -s -r -o project.pbxproj.xmlproject.pbxproj
-
使用python指令碼解析 json, 並且生成
files.json
首先要了解pbxproj 結構,才能做到比較好的解析。生成
files.json
-
使用 sirius 程式碼混淆操作
$ bin/sirius -projectrootpath <path-to-xcode-project> - obfuscatedproject `<path-for-obfuscated-project>` [-namemappingstrategy <name-mapping-strategy>] [- keepintermediates] [-inplace] [-verbose]
- 對於Swift的語法解析支援的不夠,泛型閉包等無法解析
總結
對於第一個缺陷還能忍,但第二個真的無能為力了,各種編譯錯誤會讓你崩潰
swiftshield
使用起來超簡單,只需要一個命令後就可以了,但會不會存在像Sirius
一樣的問題還有待,進一步觀察。
swiftshield -automatic -project-root /app/MyApp -automatic-project-file /app/MyApp/MyApp.xcworkspace -automatic-project-scheme MyApp-AppStore
總結
目前來看使用swiftshield
是最優的選擇,如果你有更好的方案,please call me.