iOS逆向(9)-Cycript,動態分析APP利器

以前文章已經對LLDB進行了介紹和使用。LLDB在咱們調試應用的時候確實很爽,但他每次都要斷住程序,這在分析而且修改APP的時候確實是一個優點,可是在面對一個比較大型的項目,咱們須要總體分析的時候,這樣調試就顯得有些力不從心了。而Cycript就能夠彌補上這個需求。html

Cycript是由Cydia創始人Saurik推出的一款腳本語言,Cycript混合了OC、JavaScript語法的解釋器,這意味着咱們可以在一個命令中使用Oc或者JavaScript,甚至二者並用。它可以掛鉤正在運行的進程,可以在運行時修改不少東西。git

1、語言分類

  • 編譯型語言(OC) 須要將源碼通過編譯器編譯,生成對應架構的可執行文件(二進制)github

  • 解釋型語言(Python) 源碼不須要編譯器提早編譯,而是在運行的時候,通過一套對應的解釋器,臨時將源碼翻譯成二進制讓CPU識別。vim

編譯型語言就至關於一個英語嫺熟的人看一本英文書籍,不須要藉助別的工具了。代價就是學英語這個過程很慢(編譯時間長)。 解釋型語言就至關於一個不會英語的人看一本英文書籍,這時候就須要藉助工具(字典)才能正常閱讀。好處的就是沒有學習(編譯)這麼個耗時的過程。api

理論上解釋型語言在運行效率上會比解釋型語言慢不少,但實際上如今有不少牛逼的解釋器,在執行特定的代碼的時候效率也很是快。原理就是在執行的的時候會將以前解釋過的代碼緩存起來,以後就不須要重複解釋了。如:pypy3緩存

這片文章的主角Cycript就是解釋型語言!安全

2、安裝

一、下載安裝

Cycript的安裝極其簡單,在這裏下載SDK,下載下來的就是一個可執行文件。文件不大,只有2.9M。ruby

打開終端,CD進入Cycript目錄直接運行Cycriptbash

./cycript
複製代碼

不出意外這個時候會有以下報錯:
微信

Ruby報錯

這是由於本地Ruby版本和Cycript要求的版本不同致使(其實代碼都同樣,只是版本號換了就不認識了,真蠢)。

二、解決Ruby

Step 1 查看本地Ruby版本:
cd /System/Library/Frameworks/Ruby.framework/Versions/
ls
複製代碼

Ruby版本

本地顯示版本號爲:2.3,而Cycript要求的版本號2.0。

解決方案:
複製一本Ruby源碼,將其版本號(文件夾名稱)改成2.0

Step 2 關閉系統的SIP

在 OS X El Capitan 中有一個跟安全相關的模式叫 SIP(System Integrity Protection ),它禁止讓軟件以 root 身份來在 Mac 上運行,在升級到 OS X 10.11 中或許你就會看到部分應用程序被禁用了,這些或許是你經過終端或者第三方軟件源安裝。對於大多數用戶來講,這種安全設置很方便,可是也有些開發者或者高級 Mac 用戶不須要這樣的設置。

  • 電腦重啓按住command+R,進入恢復模式
  • 打開終端,輸入csrutil disable,重啓
  • 若是想打開SIP,重複上兩步,命令改成csrutil enable

關閉安全模式

開啓安全模式

Step 3 直接把2.3的複製一份,改成2.0便可

重啓電腦後,運行以下命令:

sudo mkdir -p /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/
sudo ln -s /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/libruby.2.3.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib
複製代碼

注:根據每一個人ruby版本不一樣,將上面第二條命令的/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/libruby.2.3.0.dylib中的2.3改爲本機的ruby版本。 這裏不是降級ruby,只是複製一份2.0的ruby的dylib,讓cycript運行起來。

Copy

文件夾

再次運行

./cycript
複製代碼

若是出現 cy#即表明進入Cycript環境了。

Cycript

三、配置環境變量

Step 1 移動Cycript

/opt目錄是專門放置一些額外功能包的目錄,因此咱們將Cycript也放在該目錄下。

移動Cycript

Step 2 環境變量

進入用戶的根目錄,裏面有個文件.bash_profile,用文本編輯器打開。

用戶根目錄
若是大家有這個文件,就用vim新建一個吧。注意必定要用vim新建哦! 輸入以下命令:

export CY=/opt/cycript_0.9.594/
export PATH = $CY:$PATH
複製代碼

bash_profile

Save保存。以後就能夠在任意目錄下使用Cycript了。

3、簡單使用

一、基本的語法

基本的語法

二、基本調試

上篇文章中已經介紹了Monkey,而且能夠看出它已經幫咱們集成了Cycript的動態庫。因此一下就配合着Monkey來進行調試。

快馬加鞭,新建一個Monkey工程,將已經砸殼成功的優酷ipa包放入對應的Target目錄下。詳情參考:

因爲Monkey默認開放了一個端口號6666,如圖:

端口號6666

因此咱們就使用Cycript鏈接端口號6666,找到手機鏈接的Wifi的IP地址:

Wifi的IP
我這的是:192.168.32.113
所裏在終端輸入指令:

cycript -r 192.168.32.113:6666
複製代碼

若是你那一直停在這一步,沒有進入Cycript環境

沒法進入Cycript

那麼有三種可能

  • 手機和電腦必須處於同一個wifi
  • wifi有問題,換一個wifi試試,或者直接使用手機開個熱點,電腦連上你的熱點
  • 端口號被佔用,須要換一個端口(先換Monkey開放的端口,再換指令鏈接的端口)

一切正常後就能夠開始調試了,見以下圖:


基本調試

// 查看當前的KeyWindow
UIWindow.keyWindow()
// 自定義變量
var keyWindow = UIWindow.keyWindow()
keyWindow
// 隱藏狀態欄
[UIApp setStatusBarHidden:YES];
// 使用地址查看
#0x108e3cd80
// 查看一個對象下的全部變量
*#0x108e3cd80
// 查看一個對象下成員變量的名字
[i for(i in *keyWindow)]
// 格式化輸出當前View的層級關係
keyWindow.recursiveDescription().toString()
// 顯示當前View下的全部的Button
choose(UIButton)
複製代碼

三、高級用法

在以前的文章 LLDB,自制LLDB腳本,竄改微信紅包金額 中介紹了LLDB能夠本身定義腳本以方便本身使用,一樣Cycript也是能夠作到自定義API。

一、新建cy文件

新建一個cy文件,取名FYTest.cy

FYTest.cy

二、定義變量和函數

在FYTest.cy中定義變量和函數

// 獲取AppID
FYAPPID = NSBundle.mainBundle.bundleIdentifier;
// 獲取沙盒目錄
FYAPPPATH = NSBundle.mainBundle.bundlePath;

FYRootVC = function(){
    return UIApp.keyWindow.rootViewController;
};

FYGetCurrentVCFromRootVC = function(rootVC){
    var currentVC;
    if([rootVC presentedViewController]){
        rootVC = [rootVC presentedViewController];
    }
    
    if([rootVC isKindOfClass:[UITabBarController class]]){
        currentVC = FYGetCurrentVCFromRootVC(rootVC.selectedViewController);
    }else if([rootVC isKindOfClass:[UINavigationController class]]){
        currentVC = FYGetCurrentVCFromRootVC(rootVC.visibleViewController);
    }else{
        currentVC = rootVC;
    }
    return currentVC;
};

// 獲取當前VC
FYCurrentVC = function(){
    return FYGetCurrentVCFromRootVC(FYRootVC());
};

複製代碼

Cy文件

三、導入Cy文件

導入Cy文件_1
導入Cy文件_2

四、使用Cy文件

FYTest.cy文件雖然已經在咱們的APP裏面了,可是咱們每次使用的時候仍是須要導入一次。

@import FYTest
複製代碼

使用Cy

五、大神們封裝好的cy

Monkey默認幫咱們預裝好了幾個cy文件,分別在一下兩張圖的位置:

  • MachO中的cy

    MachO中的cy

  • 經過網絡加載的cy

    經過網絡加載的cy

具體有哪些變量能夠用,哪些函數能夠用均可以在這找到哦:msmd

4、總結

到此,全部非越獄環境下的東西已經整理完了,接下來將要開啓新的篇章:手機越獄、砸殼、以及彙編靜態分析。若是你以爲有幫助,就點個當心心吧

參考:

相關文章
相關標籤/搜索