IPAPatch: 免越獄調試、修改第三方App

之前在 GitHub 上開源了關閉 Facebook for iOS 的 HTTPS 證書校驗的方法 (Naituw/HackingFacebook),收到了很多反饋,大部分都集中在操作的過程太複雜的問題上。其實我自己在後來修改其他 App 的過程中也察覺,調試、驗證問題的過程中,操作太過繁瑣。

因此我又對這個方向做了進一步的嘗試,最後 IPAPatch 誕生了~

源代碼

我已經把模版工程放在了 GitHub 上了,歡迎大家提 Issue~

Naituw/IPAPatch

另外還包含一個 Demo

Naituw/IPAPatch

IPAPatch 可以做什麼呢?

和 "HackingFacebook" 類似,"IPAPatch" 主要可以在第三方的 IPA 文件上 "添加" 自己的代碼,但過程有很大不同:

過程簡單

  • 提供 IPA 文件和你的代碼,配置好籤名信息,點擊「運行」即可

  • 整個過程在 Xcode 中進行,就像在編寫自己的 App

  • IPA 文件依然需要是解密過的

在 Youtube 中彈出自定義窗口

支持調試

  • 在 Xcode 中可以直接斷點進行調試

  • 可以用 lldb 命令(如 po),輸出運行時信息

  • 可以使用 Xcode 的調試功能查看 View Hierarchy、Memory Graph 等信息

使用 lldb 調試 Youtube

支持鏈接第三方 Framework

  • 在集成一些第三方服務時很有用

  • 例如之前發微博的 Reveal 調試 Youtube 就是這種方式

使用 Reveal 調試 Youtube

修改過的 App 可以與原始 App 共存,並自動修改名字以作區分

修改過的 Youtube 和 Facebook

怎麼實現的?

主要的自動化過程在 patch.sh 這個腳本里,Xcode 會在把你的代碼編譯成 Framework 後執行這個腳本:

  1. 解壓 IPA 文件

  2. 用 IPA 文件的內容,替換掉 Xcode 生成的 .app 的內容

  3. 通過 OPTOOL,將你代碼生成的 Framework 及其他外部 Framework,注入到二進位文件中

  4. 對這些文件進行重新簽名

完成後,Xcode 會自動將修改過的 .app 安裝到 iPhone 上

具體的例子?

之前發過一個 「iOS 10.3 使用 Reveal 調試 Youtube」 的微博,我就用這個來舉例吧。

使用 Reveal 調試 Youtube

1. 首先我們需要準備一個解密過的 Youtube IPA 文件,這個文件可以從越獄手機上導出,也可以直接去網站下載,比如我自己常用的是 iphonecake.com

2. 將 IPA 文件命名為 app.ipa,替換模版工程中的 Assets/app.ipa 文件

3. 打開 Reveal,拿到需要集成的 Framework 文件

4. 將 RevealServer.framework 放置在 Assets/Frameworks/RevealServer.framework

5. 打開 IPAPatch,在 IPAPatch-DummyApp 這個 Target 里,配置好 BundleID 和代碼簽名。Display Name 會作為前綴添加到原來的 App 上,如圖配置的話最後就是 "RevealYoutube"

6. 點擊 Xcode 左上角的編譯運行按鈕,修改好的 Youtube 就會安裝到手機上,Reveal 中也能找到

我把這個 Demo 打了一個包,傳到 GitHub 的 Release 中了,大家可以自行下載嘗試~

Naituw/IPAPatch

後記

其實做這個項目的起因,並不是想要對其他 App 進行修改,而是在競品分析時,想儘可能了解其他 App 是如何實現類似需求的。 然後發現其實我們還能做到比抓包更進一步,對我自己很有用,所以也分享給大家~

最後還是想說一句,該項目僅用於學習目的,請勿濫用~

項目地址:Naituw/IPAPatch

-------------------------------------------------------

* 作者:Naituw,本文授權轉載,文章出處:Sina Visitor System

更多安全類文章,請持續關注阿里聚安全的安全專欄或阿里聚安全官方博客


推薦閱讀:

哪些程序在 App Store 里是被禁止的?
如何評價 Swift 4 的開發計劃?
資深 iOS 開發工程師需要達到什麼水平?
如何看待 Dash 被 App Store 下架?

TAG:iOS开发 | 移动安全 | 混淆 |