更新:2020年1月19日,加入破解 iOS12.0+系統無法使用 cycript 的解決方案。
前言
廢話不多說,直接進正題。
想要破解iOS應用,你需要準備些什么:
- 一個已越獄的手機。(本文用的是已越獄的5s, 8.1.2)
- class-dump。點我查看class-dump的配置方法。
- iFunBox。(安裝在電腦端。不是必須,本文拷貝文件用到的是這個)
- Cycript。(使用cydia安裝在手機端)
- OpenSSH、MTerminal。(使用cydia安裝在手機端,點我查看在終端使用ssh連接手機的方法)
- dumpdecrypted。(用來砸殼,下面有詳細介紹)
一 砸殼
這里我們用到的砸殼利器是dumpdecrypted。
1. 制作砸殼工具,即dumpdecrypted.dylib.
1). 從github上clone或下載 dumpdecrypted 源碼到本地。下載之后的目錄如圖(我把默認的目錄名”dumpdecrypted-master”改成了”dumpdecrypted”):
2). 編譯源碼獲得dumpdecrypted.dylib。方法如下:
a.打開終端,進入dumpdecrypted目錄。
b.輸入命令make。
命令執行完成后會生成一個dumpdecrypted.dylib文件,這個就是砸殼需要用到的工具。這個文件可重復使用,不需要再次生成。如下圖:
2. 把砸殼工具拷貝到待破解app的documents目錄下。
1)定位可執行文件。使用ssh連接手機,并打印所有進程。為方便準確定位到目標app,最好先關閉所有app,然后打開目標app。(盡量把終端的窗口拉寬一些,因為輸出的內容比較長,窗口窄的話內容會截斷。)如下圖:
3. 使用cycript找到目標app的documents目錄路徑。
1)輸入命令:
cycript -p TargetApp
進入cycript環境。2)輸入命令:
[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
,獲取documents目錄路徑。如下圖:4. 將dumpdecrypted.dylib拷貝到documents目錄下。命令如下:
1)使用快捷鍵Ctrl-D退出cycript環境。
2)輸入命令
logout
,退出手機連接。3)使用scp命令拷貝文件至手機,如圖:
5. 進行砸殼。
1)連接手機。
2)進入Documents目錄。
3)輸入砸殼命令
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
,進行砸殼。這里有兩點要注意:1是這個命令的"="號前后不能有空格,2是”=”號后的路徑要替換成真實的dumpdecrypted.dylib的路徑和可執行目標文件的路徑。如下圖:4)砸殼成功后,會在Documents目錄下生成一個后綴為.decrypted的文件。這個就是我們用來分析的文件了。如圖:
6. 把砸殼后的文件拷貝至電腦。我是用的iFunBox,你也可以用scp的方式。選擇.decrypted文件,然后點擊“CopyToMac”,選擇一個目錄保存就可以了。如圖:
保存成功后如圖:
二 dump頭文件
破殼之后就可以進行dump了,命令為class-dump -S -s -H /path/to/TargetApp.app/Target -o /path/to/headers
,兩個參數分別是砸殼后的.decrypted文件和存放所dump出來的頭文件的目錄(這個目錄可提前創建好)。效果如下圖:
看下圖可以看到,我成功把這個app的頭文件dump出來了,一共718個。
三 Cycript分析
頭文件得到之后就可以使用Cycript進行分析了。步驟如下:
1. 在手機上啟動目標app,并打開你要分析的界面。
2. 連接手機。命令:ssh root@192.168.1.25
3. 進入Cycript環境。命令:cycript -p TargetApp
4. 展示待分析界面的信息。在cy#后輸入命令:[[UIApp keyWindow] recursiveDescription].toString()
如下圖:
如圖所示,層級關系就是父子關系。比如UINavigationTransitionView: 0x125d3b060就是UIViewControllerWrapperView: 0x17018a4f的父控件。
我們可以通過控件的名字去dump出來的頭文件目錄中找到對應的頭文件進行分析。
在cycript中操縱某個對象是直接通過它的內存地址的。比如我們要獲取UIViewControllerWrapperView的父控件,需要輸入命令:
[#0x17018a4f0 nextResponder]
,如圖:再比如我們要修改界面中UILabel: 0x125d509a0中的文字,則輸入命令:
[#0x125d509a0 setText:@"21"]
,如圖:這時你再去查看手機上的界面,這個label的文字就被替換成了21。
cycript 停止維護解決辦法
如果越獄的手機系統為12.0+,cycript 停止維護,無法正常使用 cycript。解決方案在此:通過 cyrun 使用 cycript 調試。
我做的步驟如下:
- 1.把
cycript_0.9.594_iphoneos-arm.deb
、net.tateu.cycriptlistenertweak_1.0.0_iphoneos-arm.deb
和net.tateu.cyrun_1.0.5_iphoneos-arm.deb
下載到 Mac 上。 - 通過 iFunBox 把三個 deb 文件拷貝到手機中的
var
目錄下。
- 通過 iFunBox 把三個 deb 文件拷貝到手機中的
- 通過ssh 連接手機,然后執行命令進行安裝,如下:
dpkg -i cycript_0.9.594_iphoneos-arm.deb
dpkg -i net.tateu.cycriptlistenertweak_1.0.0_iphoneos-arm.deb net.tateu.cyrun_1.0.5_iphoneos-arm.deb
- 通過ssh 連接手機,然后執行命令進行安裝,如下:
- 執行命令
cyrun -n SpringBoard -e
,就會進入 cycript 環境中了,如下:
- 執行命令
david:/var/cyrun root# cyrun -n SpringBoard -e
applicationName: SpringBoard is running (5505)
executableName: SpringBoard
bundleIdentifier: com.apple.springboard
Cycript is inactive:
Device is passcode locked
Tweak Mode
Do you want to continue enabling Cycript (y or n)? y
Waiting for Process to close...
Waiting for SpringBoard to launch...
Waiting for Cycript to become active...
Success, you may now run
cycript -r 127.0.0.1:8556
cy#
提示:可以把命令中的SpringBoard 替換為待破解 app 的名稱。
總結
到此為止,我們就可通過cycript結合dump出的頭文件進行分析了。如果再想深入,可以使用lldb打斷點分析,本文就不展開講了(后期會寫文章專門介紹)。還有IDA和Reveal進行界面分析,相關問題可以回復我。
感謝沙神。