以前文章已經對LLDB進行了介紹和使用。LLDB在咱們調試應用的時候確實很爽,但他每次都要斷住程序,這在分析而且修改APP的時候確實是一個優點,可是在面對一個比較大型的項目,咱們須要總體分析的時候,這樣調試就顯得有些力不從心了。而Cycript就能夠彌補上這個需求。html
Cycript是由Cydia創始人Saurik推出的一款腳本語言,Cycript混合了OC、JavaScript語法的解釋器,這意味着咱們可以在一個命令中使用Oc或者JavaScript,甚至二者並用。它可以掛鉤正在運行的進程,可以在運行時修改不少東西。git
編譯型語言(OC) 須要將源碼通過編譯器編譯,生成對應架構的可執行文件(二進制)github
解釋型語言(Python) 源碼不須要編譯器提早編譯,而是在運行的時候,通過一套對應的解釋器,臨時將源碼翻譯成二進制讓CPU識別。vim
編譯型語言就至關於一個英語嫺熟的人看一本英文書籍,不須要藉助別的工具了。代價就是學英語這個過程很慢(編譯時間長)。 解釋型語言就至關於一個不會英語的人看一本英文書籍,這時候就須要藉助工具(字典)才能正常閱讀。好處的就是沒有學習(編譯)這麼個耗時的過程。api
理論上解釋型語言在運行效率上會比解釋型語言慢不少,但實際上如今有不少牛逼的解釋器,在執行特定的代碼的時候效率也很是快。原理就是在執行的的時候會將以前解釋過的代碼緩存起來,以後就不須要重複解釋了。如:pypy3緩存
這片文章的主角Cycript就是解釋型語言!安全
Cycript的安裝極其簡單,在這裏下載SDK,下載下來的就是一個可執行文件。文件不大,只有2.9M。ruby
打開終端,CD進入Cycript目錄直接運行Cycriptbash
./cycript
複製代碼
不出意外這個時候會有以下報錯:
微信
這是由於本地Ruby版本和Cycript要求的版本不同致使(其實代碼都同樣,只是版本號換了就不認識了,真蠢)。
cd /System/Library/Frameworks/Ruby.framework/Versions/
ls
複製代碼
本地顯示版本號爲:2.3,而Cycript要求的版本號2.0。
解決方案:
複製一本Ruby源碼,將其版本號(文件夾名稱)改成2.0
在 OS X El Capitan 中有一個跟安全相關的模式叫 SIP(System Integrity Protection ),它禁止讓軟件以 root 身份來在 Mac 上運行,在升級到 OS X 10.11 中或許你就會看到部分應用程序被禁用了,這些或許是你經過終端或者第三方軟件源安裝。對於大多數用戶來講,這種安全設置很方便,可是也有些開發者或者高級 Mac 用戶不須要這樣的設置。
csrutil disable
,重啓csrutil enable
重啓電腦後,運行以下命令:
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運行起來。
再次運行
./cycript
複製代碼
若是出現 cy#
即表明進入Cycript環境了。
/opt
目錄是專門放置一些額外功能包的目錄,因此咱們將Cycript也放在該目錄下。
進入用戶的根目錄,裏面有個文件.bash_profile
,用文本編輯器打開。
export CY=/opt/cycript_0.9.594/
export PATH = $CY:$PATH
複製代碼
Save保存。以後就能夠在任意目錄下使用Cycript了。
在上篇文章中已經介紹了Monkey,而且能夠看出它已經幫咱們集成了Cycript的動態庫。因此一下就配合着Monkey來進行調試。
快馬加鞭,新建一個Monkey工程,將已經砸殼成功的優酷ipa包放入對應的Target目錄下。詳情參考:
因爲Monkey默認開放了一個端口號6666,如圖:
因此咱們就使用Cycript鏈接端口號6666,找到手機鏈接的Wifi的IP地址:
cycript -r 192.168.32.113:6666
複製代碼
若是你那一直停在這一步,沒有進入Cycript環境
那麼有三種可能
一切正常後就能夠開始調試了,見以下圖:
// 查看當前的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文件,取名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());
};
複製代碼
FYTest.cy文件雖然已經在咱們的APP裏面了,可是咱們每次使用的時候仍是須要導入一次。
@import FYTest
複製代碼
Monkey默認幫咱們預裝好了幾個cy文件,分別在一下兩張圖的位置:
MachO中的cy
經過網絡加載的cy
具體有哪些變量能夠用,哪些函數能夠用均可以在這找到哦:ms,md
到此,全部非越獄環境下的東西已經整理完了,接下來將要開啓新的篇章:手機越獄、砸殼、以及彙編靜態分析。若是你以爲有幫助,就點個當心心吧