參考書籍:《IOS應用逆向工程 分析與實戰》(沙梓社,吳航)
參考書籍:《IOS應用逆向工程(第2版)》(沙梓社,吳航)
在分析IOS應用程序的時候,經常會用到Cycript這個工具,基本使用方法這裡就不在啰嗦了,直接使用它從UI層面來定位目標函數:
查看當前界面UI層次結構
UIview中的私有函數recursiveDescription可以返回這個view的UI層次結構,一般來說,當前界面是由至少一個UIWindow構成的,而UIWindow繼承自UIView,因此可以利用這個私有函數查看當前界面UI層次結構.用法如下:
cycript -p APP
cy# ?expand
(首先執行Cycript的?expand命令開啟expand功能,翻譯格式符號,提高可讀性,接著:)
cy# [[UIApp keyWindow] recursiveDescription]
UIApp是[UIApplication sharedApplication]的簡寫調用上面的方法即可打印keyWindow的視圖結構.
*執行 cy#[UIApp windows] 可以拿到app所有window
*執行 cy#[#viewAddress subviews] 可以拿到當前控件的子控件
*執行 cy#[#viewAddress superviews] 可以拿到當前控件的父控件
*通過 cy#[#viewAddress setHidden:YES] 定位到相應的控件
找出控件(按鈕)的UI函數
按鈕的UI函數就是點擊它之後的響應函數,給UIView對象加上響應函數,一般是通過[UIcontrol addTarget:action:forControlEvents:]實現的,而UIControl提供了一個sctionsForTarget:forControlEvent:方法,來獲得這個UIControl的響應函數.具體操作如下:
對於UIButton
cy# button = #0x1479840
s”UIToolbarButton: 0x1479840; frame = …….>”
cy# [button allTargets]
[NSSet setWithArray:@[#”ComposeButtonItem: 0x14609d00>”]]
cy# [button allControlEvents]
64
cy# [button sctionsForTarget: #0x14609d00 forControlEvent: 64]
@[“_sendAction: withEvent: ]
因此,按下按鈕就會調用 _sendAction: withEvent: 函數.
對於UITableviewCell
與剛才按鈕不同的是,這次的目標不是cell的響應函數(功能),而是它上面顯示的內容(數據),根據MVC的設計標准,能夠利用已知的V,獲得C,就可以進一步訪問M了,也就是說對於一個V調用nextResponder,要麼返回它對應的C,要麼返回它的superview.具體操作很簡單,從cell處開始調用nextResponder,一直到返回一個C為止,命令如下:
cy# [#0x124846 nextResponder]
Cycript 的注入基本使用方法。以SpringBoard為例
在mac上ssh登錄手機,或者在手機上安裝 Terminal ,找到SpringBoard進程
didi:~ root# ps -e | grep SpringBoard
1759 ?? 0:22.40 /System/Library/CoreServices/SpringBoard.app/SpringBoard
1835 ttys000 0:00.01 grep SpringBoard
獲取到進程的id是 1759 ,然後用 cycript - p 命令注入這個進程
didi:~ root# cycript - p 1759
想要在SpringBoard界面彈出一個提示框,上節使用Tweak工程實現了這個功能,但用cycript的話,只要兩句代碼就可以了,而且是實時注入的。
cy# alertView = [[UIAlertView alloc] initWithTitle:@”test” message:@”liuchendi” delegate:nil cancelButtonTitle:@”OK” otherButtonTitles:nil]
s#UIAlertView: 0x18b6c8d0; frame = (0 0; 0 0); opaque = NO; layer = >”
cy# [alertView show]
不要聲明類型,不需要輸入分號。使用過程中還能打印一些生成的信息。
知道內存地址,獲取對象
通過 # 獲取對象,比如剛剛生成的UIAlertView對象的內存地址是 0x18b6c8d0
cy# [#0x18b6c8d0 show]
一樣可以彈出提示框
知道一個類,獲取內存地址
通過 choose 命令可以查看,這個命令不一定百發百中,如果沒找到需要自己手動找。
cy# choose(SBScreenShotter)
[#”SBScreenShotter: 0x18bc25c0>”]
例子:獲取私有函數,登錄iMessage
獲取iMessage的控制器
cy# controller = [CNFRegController controllerForServiceType:1]
“CNFRegController: 0x18e9f990>”
登錄iMessage,這裡屏蔽了敏感的信息.用自己的帳號密碼登錄
cy# [controller beginAccountSetupWithLogin:@”appID” password:@”appPassword” foundExisting:NO]
s#IMAccount: 0x18fcbab0 [ID: 89E8048D-183C-460D-9438-719738CBBC13 Service: IMService[iMessage] Login: E:appID Active: YES LoginStatus: Connected]”
這裡返回了一個 IMAccount 對象
選擇收發的郵件地址
cy# [controller setAliases:@[@”[email protected]”] onAccount:#0x18fcbab0]
1
返回值為1表示成功登錄了iMessage
以上就是iOS 越獄開發那些事兒之三的全文介紹,希望對您學習和使用ios應用開發有所幫助.
【iOS 越獄開發那些事兒之三】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!