關於IPA文件重簽名後如何跟蹤管理APP的技術探討和實踐演示
- 2020 年 10 月 13 日
- 筆記
前言:開發iOS的朋友都知道,在功能開發完成後,我們就會用申請的蘋果帳號在後台做證書配置,然後提交到AppStore,但是也有部分APP我們不需要提交到AppStore,比如內部測試用的APP、訂製給客戶開發的功能性APP、還有其他一些不適合提交到AppStore的APP,那麼這時候我們就僅需要針對特定的人群或部分手機設備來安裝,最簡單方式就是把需要安裝的設備UDID作為測試機在配置文件中添加,最多可添加100台設備,另外一種方案就是採用企業證書重新打包,這樣就不限制設備數量,相對來說簡單,此外還有一種情況就是我們對開發完成的ipa文件做重簽名處理,這種情況通常是沒有源碼的情況,不能用xcode打包簽名,那麼問題來了,如果對這些簽名打包後的ipa文件,也就是如何對這些APP做後期跟蹤管理呢?
管理APP常用到的幾個場景:
場景一:某幾個客戶測試安裝後,在特定時間到了就不允許在打開使用,比如打開APP後立馬閃退或彈窗提醒時間到,點擊確定後閃退,如果想延長,可修改到期時間,就能繼續使用。
場景二:APP因某些原因,暫停對客戶的繼續使用,即關閉APP的使用許可權,打開後立馬閃退,一旦修復後開啟APP的使用許可權,客戶照舊正常使用。
場景三:源碼丟失無法打包新APP,但需要給APP新增一些小功能,比如添加統計等,這時候就需要注入動態庫,之後重簽名ipa,這時候依然需要對APP做管理。
場景三:客戶對我們重簽名後的APP使用到期後,沒有不再續費,但是客戶依然能使用,我們又對證書沒有管理許可權,無法撤銷,這就導致了客戶付款一個月,但是實際上卻一直可以使用,對此也無能為力,這時候就需要對APP做管理,如時間鎖或開關功能,特別是企業重簽名的,對證書的影響最大,有可能導致證書被封的危險。
場景四:對於APP的多開支援,比如重簽名時候我們可以修改名稱或自定義Bundle ID,以此來實現同設備安裝多個APP的需要,便於測試或其它作用。
其他場景:暫未知…
針對這些常見場景,筆者做了統計和調查,發現市面上能解決的幾乎寥寥無幾,特別一些能實現時間鎖的都要提交證書和密碼,這對於簽名來說太危險,一旦提交後,有可能P12證書和密碼泄露,導致證書被共享最終被封,目前據筆者所知,企業帳號一號難求,價格也在幾十萬,被封是非常可惜的,故此基本無人敢使用這類軟體做管理,比如xx開心、一鍵xx工具等,如下圖,太危險了。
對於場景中提到的幾個關鍵詞,比如時間鎖、開關、注入動態庫和修改APP名稱和ID,從開發專業角度來分析如何技術實現:
時間鎖:顧名思義就是設定時間,一到時間到就鎖住,不允許再使用,從開發角度來說,我們就是設定了未來時間,當APP運行到這個時間點,判斷當前時間大於預定時間即開啟鎖功能,彈窗提醒或直接exit(0)閃退。
開關:與時間鎖類似,但是更直接,可立即關閉或禁用,這種需要伺服器支援,和時間鎖不同,時間鎖可以實現離線模式,不過這種一旦到期就不能再繼續使用,如果和開關一樣採取伺服器模式就可以再次延長時間,那麼這種就需要調用伺服器介面,對於開發來說不難。
注入動態庫:這需要開發獨立的動態庫文件,動態庫是應用啟動後就立即載入,我們可以在載入時候調用load方法裡面執行我們需要的統計等功能,注入方式也還是簡單,採用yololib,下載地址://github.com/KJCracks/yololib 或optool 下載地址://github.com/alexzielenski/optool 來注入,例如:
yololib FileName Frameworks/Dylib.dylib
或
optool install -c load -p "@executable_path/Frameworks/libSignatureCheck.dylib" -t xxx
就可以注入到ipa文件中,通過MacOView這款工具來查看Mach-O文件是否注入成功,如果不喜歡命令行的可以通過工具來注入,推薦用iReSignDylib這款mac軟體來操作,下載地址: //github.com/mapboo/iReSignDylib,介面如下:
從這款軟體來看,介面操作還是很清楚的,拖入動態庫文件.dylib就可以了。
修改APP名稱和ID:了解APP開發的朋友都知道,名稱和ID可以直接在info.plist文件中修改,那麼我們通過修改info文件裡面對應的key值:
-
<key>CFBundleDisplayName</key> //APP名稱
-
-
<key>CFBundleIdentifier</key> //APP的BundleID
然後重新覆蓋這個info文件,得此達到修改的目的,特別注意的是一旦修改過ipa文件裡面的任何地方,都會破壞原有簽名,必須重新用蘋果證書籤名,這點和Android的重簽名是一樣的,比如我們用apktool工具反編譯apk後再回編譯,那麼這時候就必須要重新簽名才能安裝到手機上,iOS也是一樣。
這幾個關鍵技術點,對於正常開發內嵌原生程式碼來說,都是非常容易實現的,如果是外面嵌入來管理呢,那就不是技術能解決的問題了,簡單的一個案例:手頭只有ipa文件,需要實現時間鎖、開關等功能,那就只能通過重簽名來管理了。筆者在考察眾多技術和實踐測試方案後,確實找到了一款滿足常見場景功能的Mac軟體,即風車簽名iOS管理軟體,官網地址:風車簽名。
軟體簡介:這是一款在Mac平台下安全可控的iOS簽名管理軟體,旨在對簽名後的APP能夠完全控制,包括APP的開啟或禁用、設置到期時間鎖、注入第三方動態庫文件、設置安裝限量、修改APP名稱和自定義Bundle ID等剛需功能,同時支援個人、公司和企業證書籤名,最重要的是軟體在簽名時無需填寫證書密碼,一切操作均在本地Mac電腦中,確保證書安全。
針對軟體功能筆者做了一系列的實踐驗證,風車簽名軟體操作介面非常清晰明了,如下圖:
特別該軟體簽名證書不再需要密碼,這個是必須點贊的,安全第一啊,另外設置時間鎖、修改名稱ID、注入動態庫,以及列印日誌資訊都非常明了,特別時間鎖默認三個月也可以自定義到期時間,很nice了,故此筆者做個簽名測試,設置時間鎖功能,首先在設置裡面輸入:
然後我找了個ipa來簽名試一試,筆者是用的個人證書,手機UDID已經添加進去了,如果你是企業證書,那就不需要了,簽名後我用iFunbox直接安裝,打開APP看看是否彈出提醒時間,測試效果如下:
其它該軟體的功能,如開關、注入動態庫,以及修改APP名稱等功能筆者都做了測試,效果不錯,杠杠的,我就不這裡截圖了,總之是一款非常安全可控的iOS簽名管理軟體,值得推薦,更多功能,大家可以去風車簽名官網一探究竟啦。