語(yǔ)言混合物癞谒,用來(lái)修改調(diào)試正運(yùn)行在內(nèi)存中的app的底燎。
Cycript是什么,做什么用的弹砚?
- Cycript是Objective-C++双仍、ES6(JavaScript)、Java等語(yǔ)法的混合物
- 可以用來(lái)
探索桌吃、修改朱沃、調(diào)試
正在運(yùn)行的Mac\iOS APP - 官網(wǎng): http://www.cycript.org/
文檔: http://www.cycript.org/manual/
安裝插件
- 在Cydia上安裝Cycript和adv-cmds兩個(gè)插件,前者可在iPhone上調(diào)試運(yùn)行中的APP茅诱;后者可以列出系統(tǒng)當(dāng)前的進(jìn)程逗物;
- 連接、登錄到iPhone服務(wù)端瑟俭;
adv-cmds插件使用(用于搜索iPhone進(jìn)程)
- 連接登錄到iPhone服務(wù)端翎卓,
-
ps –A
或ps aux
列出所有的進(jìn)程
-
ps –A | grep 關(guān)鍵詞
搜索關(guān)鍵詞
Cycript語(yǔ)法使用
注意要調(diào)試的那個(gè)APP要保證打開(kāi),內(nèi)存中運(yùn)行摆寄,如果退到后臺(tái)會(huì)很容易從內(nèi)存中清除
> 開(kāi)啟Cycript監(jiān)聽(tīng)(進(jìn)入iPhone服務(wù)端操作)
cycript
cycript -p 進(jìn)程ID
【不推薦失暴,進(jìn)程ID每次都會(huì)變】
cycript -p 進(jìn)程名稱
【推薦使用,進(jìn)程名不會(huì)變】
> Cycript的語(yǔ)法
-
Ctrl + C
:取消輸入 -
Ctrl + D
:退出Cycript監(jiān)聽(tīng) -
Command + R
:清屏 -
UIApp
:[UIApplication sharedApplication] -
var 變量名 = 變量值
:定義變量 -
#內(nèi)存地址
:用內(nèi)存地址獲取對(duì)象 -
ObjectiveC.classes
:當(dāng)前app已加載的所有OC類 -
*對(duì)象
:查看對(duì)象的所有成員變量 -
view.recursiveDescription().toString()
:遞歸打印view的所有子控件(跟LLDB一樣的函數(shù)) -
choose(UIViewController)
:查看當(dāng)前界面中微饥,存在內(nèi)中的UIViewController類型的對(duì)象 -
choose(UITableViewCell)
:篩選出UITableViewCell類型的對(duì)象
實(shí)戰(zhàn):定位登錄方法
1市袖、先從Mac端拷貝個(gè)MJ的cy封裝文件到iPhone端,scp -P 10011 [文件] root@localhost:/usr/lib/cycript0.9/MJTool.cy
2贴妻、連接登錄到iPhone端簇抵,cycript監(jiān)聽(tīng)網(wǎng)易云音樂(lè)進(jìn)程(注意保持網(wǎng)易云音樂(lè)app是開(kāi)啟狀態(tài))
3、導(dǎo)入封裝文件简软,查看當(dāng)前界面
- @import MJTool
- 調(diào)用MJFrontVc()蛮拔,查看網(wǎng)易云音樂(lè)當(dāng)前界面的控制器
4述暂、打印控制器的所有方法
5、調(diào)用登錄方法
控制器對(duì)象調(diào)用登錄方法建炫,手機(jī)上彈框提示:手機(jī)號(hào)不能為空畦韭!操控成功!8氐艺配!
6、找到賬號(hào)框和密碼框
app賬號(hào)框輸入:6666
app密碼框輸入:8888
打印控制器的子view:找到6666和8888衍慎,即找到了賬號(hào)框和密碼框:
驗(yàn)證:拿到賬號(hào)框?qū)ο笞Γ~號(hào)框輸入7777,app的輸入框數(shù)字也變?yōu)?777稳捆,說(shuō)明這個(gè)賬號(hào)框是對(duì)的
7赠法、用MJTool.cy看下該控制器的其他的東西
7.1 類方法:MJClassMethodNames(#0x129c57f60)
7.2 對(duì)象方法:MJInstanceMethodNames(#0x129c57f60)
8、提個(gè)需求:把『登錄』按鈕刪掉
找到『登錄』兩個(gè)字:
上面已經(jīng)遍歷控制器的子view了乔夯,只要找到登錄這兩個(gè)字就行了砖织,但是文字都是unicode,『登錄』的unicode是什么呢末荐?可借助python侧纯,新建個(gè)終端,python
, unicode('登錄','UTF-8')
甲脏,即可得出『登錄』的unicode :
command + F 搜索 \u767b\u5f55眶熬,找到對(duì)應(yīng)的button:
執(zhí)行刪除操作:[#0x129c4c6c0 removeFromSuperview]
,app上的登錄按鈕不見(jiàn)了剃幌。
注意:我們只是刪掉了內(nèi)存中的登錄按鈕聋涨,關(guān)掉app再次啟動(dòng),登錄按鈕依然在负乡。
上面的這些牍白,只是在內(nèi)存中動(dòng)態(tài)調(diào)試。如何永久的刪掉登錄呢抖棘,后面還要學(xué)很多東西
10茂腥、添加個(gè)紅色的view,用到MJTool
cy# MJFrontVc()
#"<NMPhoneLoginViewController: 0x129c57f60>"
cy# var redV = [[UIView alloc] init]
#"<UIView: 0x129ba8010; frame = (0 0; 0 0); layer = <CALayer: 0x1294e6350>>"
cy# redV.backgroundColor = [UIColor redColor]
#"UIDeviceRGBColorSpace 1 0 0 1"
cy# redV.frame = MJRectMake(10,100,100,100)
{0:{0:10,1:100},1:{0:100,1:100}}
cy# [#0x129c57f60.view addSubview:redV]
cy#
11切省、MJTool工具中正則表達(dá)式使用——篩選
cy# MJFrontVc()
#"<NMPhoneLoginViewController: 0x129c57f60>"
// 篩選帶有l(wèi)ogin的對(duì)象方法最岗,注意是匹配大小寫(xiě)的
cy# MJInstanceMethodNames(#0x129c57f60,/login/)
[&"loginButtonClicked:",&"loginView"]
// 篩選以View結(jié)尾的對(duì)象方法,注意大小寫(xiě)
cy# MJInstanceMethodNames(#0x129c57f60,/View$/)
[&"loginView",&"loadView"]
12朝捆、實(shí)戰(zhàn):封裝Cycript文件
本次用sublime封裝好了后般渡,拷貝到iPhone中,兩種拷貝方式:
12.1、終端拷貝:scp -P 10011 ~/Desktop/test.cy root@localhost:/usr/lib/cycript0.9
12.2驯用、利用iFunBox脸秽,直接拖拽到cycript0.9文件夾下。
注意蝴乔,如果Cycript文件修改了记餐,重新拷貝到cycript0.9文件夾后,需要1薇正、control+d退出監(jiān)視片酝、2、退出app挖腰、3雕沿、重啟操控的app,4曙聂、重新監(jiān)視app喜馬拉雅cycript -p ting
5晦炊、@import test
即可看到外界可用的內(nèi)容鞠鲜。
12.3 兩種寫(xiě)法的區(qū)別宁脊,獲取一次和每次都重新獲取的寫(xiě)法,比如:UIApp.keyWindow.rootViewController
a. 獲取一次:
exports.rootVc = UIApp.keyWindow.rootViewController;
b.每次都重新獲取贤姆,寫(xiě)成函數(shù):
exports.rootVc = function() {
return UIApp.keyWindow.rootViewController;
};
12.4 進(jìn)入喜馬拉雅APP的本地沙盒看看
Cycript文件內(nèi)容:
(function(exports) {
// JS的語(yǔ)法和OC的語(yǔ)法混在一起
exports.sum = function(a,b){
return a + b;
};
exports.minus = function(a,b){
return a - b;
};
exports.age = 18;
// appId是一成不變的榆苞,獲取一次就行
exports.appId = [NSBundle mainBundle].bundleIdentifier;
// 根控制器是變化的,每次都應(yīng)該重新獲取霞捡,寫(xiě)成函數(shù)
exports.rootVc = function() {
return UIApp.keyWindow.rootViewController;
};
// 沙盒路徑是固定的值坐漏,獲取一次就行
exports.docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
})(exports);
服務(wù)器終端執(zhí)行本地緩存路徑結(jié)果:
cy# test.docPath
@"/var/mobile/Containers/Data/Application/5C9D8696-C8FF-4233-96AD-213F514BCCA3/Documents"
cy#
利用iFunBox進(jìn)入沙盒,這樣就可以查看到喜馬拉雅的本地存儲(chǔ)結(jié)構(gòu)是怎么做的
:
- 在執(zhí)行test.docPath能不能去掉test文件名——弄成全局
可以碧信,寫(xiě)成全局的赊琳,如何寫(xiě)成全局的:
在cy文件中去掉exports,就是全局的了砰碴,無(wú)需用文件名來(lái)調(diào)用了躏筏。
弄成全局后,要注意2點(diǎn):
- 導(dǎo)入test文件的時(shí)候不會(huì)提示文件中的全局呈枉,勿慌趁尼;
- cy文件多了以后,全局名可能會(huì)重復(fù)——解決辦法:加前綴猖辫。
導(dǎo)入test后酥泞,寫(xiě)成全局的LFSum和LFDocPath沒(méi)有提示了。
- 作者saurik也有個(gè)cy文件啃憎,放在如下路徑芝囤,這是為了防止重名。我們也可以效仿,用反域名來(lái)設(shè)置文件夾層級(jí)悯姊。不過(guò)這樣很麻煩名党,我們放在cycript0.9文件夾下就行了。
15挠轴、如果有東西創(chuàng)建失敗传睹,說(shuō)明要導(dǎo)入某個(gè)庫(kù)MJLoadFramework('XXX')
16、想知道控制器是如何劃分結(jié)構(gòu)的——使用MJTool.cy:
MJRootVc()
,MJChildVcs(#0x14801f600)
岸晦,或者一步到位MJChildVcs(MJRootVc())
17欧啤、想知道當(dāng)前view是如何劃分結(jié)構(gòu)的——使用MJTool.cy:
18、想知道控制器有哪些對(duì)象方法——使用MJTool.cy:
MJInstanceMethodNames(#0x12324432)
MJInstanceMethodNames(#0x12324432,/click/)
// 篩選出帶有click的
19启上、控制器有哪些成員變量——使用MJTool.cy:
MJIvarNames(#0x12324432)
MJIvarNames(#0x12324432,/click/)
// 篩選出帶有click的
20邢隧、獲取某個(gè)類的所有子類——使用MJTool.cy:
//當(dāng)前app有哪些UIViewController的子類
MJSubclasses(UIViewController)
MJSubclasses("UIViewController",/NMR/)
//查看app有哪些自定義導(dǎo)航控制器
MJSubclasses(UINavigationController)
MJSubclasses("UINavigationController")
MJSubclasses("UINavigationController",/NMR/)
21、改微信錢包零錢
大致步驟:
- 連接登錄iPhone服務(wù)端冈在,打開(kāi)微信倒慧,進(jìn)入微信錢包頁(yè)面,搜索進(jìn)程
ps -A
包券,監(jiān)視微信進(jìn)程cycript -p WeChat
纫谅,導(dǎo)入工具@import MJTool
; -
MJFrontVc()
:當(dāng)前控制器 -
MJVcSubviews(#0x13e90c200)
:當(dāng)前控制器的所有子view -
command + F
搜索零錢的數(shù)字溅固,確定是哪個(gè)對(duì)象 -
(#0x14065f880).text = '\xa5848,340.00'
付秕,修改零錢 -
(#0x14065f880).backgroundColor = [UIColor redColor]
,修改背景 -
(#0x14065f880).frame = MJRectMake(0,85,320,13)
侍郭,修改寬高
到這里為止询吴,都還只是借用cycript的封裝,修改調(diào)試內(nèi)存中的東西亮元,還不能達(dá)到永久修改的目的猛计。
總結(jié)
操作步驟:
1、連接登錄iPhone端爆捞;
2奉瘤、打開(kāi)app,ps -A
列出iPhone所有進(jìn)程嵌削,找到app進(jìn)程名稱毛好;
3、監(jiān)視進(jìn)程cycript -p 進(jìn)程名詞
苛秕;
4肌访、用Cycript(一般用封裝好的cy工具,方便)艇劫,對(duì)app進(jìn)行增吼驶、刪、改、查蟹演。