你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 越獄開發那些事兒之三

iOS 越獄開發那些事兒之三

編輯:IOS開發綜合

使用Cycript定位目標函數

參考書籍:《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 越獄開發那些事兒之三】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved