四、Cycript

語(yǔ)言混合物癞谒,用來(lái)修改調(diào)試正運(yùn)行在內(nèi)存中的app的底燎。

Cycript是什么,做什么用的弹砚?
  1. Cycript是Objective-C++双仍、ES6(JavaScript)、Java等語(yǔ)法的混合物
  2. 可以用來(lái)探索桌吃、修改朱沃、調(diào)試正在運(yùn)行的Mac\iOS APP
  3. 官網(wǎng): http://www.cycript.org/
    文檔: http://www.cycript.org/manual/
安裝插件
  1. 在Cydia上安裝Cycript和adv-cmds兩個(gè)插件,前者可在iPhone上調(diào)試運(yùn)行中的APP茅诱;后者可以列出系統(tǒng)當(dāng)前的進(jìn)程逗物;
  2. 連接、登錄到iPhone服務(wù)端瑟俭;
adv-cmds插件使用(用于搜索iPhone進(jìn)程)
  1. 連接登錄到iPhone服務(wù)端翎卓,
  2. ps –Aps aux列出所有的進(jìn)程
  3. ps –A | grep 關(guān)鍵詞搜索關(guān)鍵詞
部分進(jìn)程
網(wǎng)易云音樂(lè)app
搜索進(jì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ì)變】

根據(jù)進(jìn)程名稱開(kāi)啟cycript

> Cycript的語(yǔ)法

  1. Ctrl + C :取消輸入
  2. Ctrl + D:退出Cycript監(jiān)聽(tīng)
  3. Command + R :清屏
  4. UIApp :[UIApplication sharedApplication]
  5. var 變量名 = 變量值 :定義變量
  6. #內(nèi)存地址 :用內(nèi)存地址獲取對(duì)象
  7. ObjectiveC.classes :當(dāng)前app已加載的所有OC類
  8. *對(duì)象 :查看對(duì)象的所有成員變量
  9. view.recursiveDescription().toString() :遞歸打印view的所有子控件(跟LLDB一樣的函數(shù))
  10. choose(UIViewController) :查看當(dāng)前界面中微饥,存在內(nèi)中的UIViewController類型的對(duì)象
  11. choose(UITableViewCell):篩選出UITableViewCell類型的對(duì)象
部分語(yǔ)法實(shí)操
實(shí)戰(zhàn):定位登錄方法

1市袖、先從Mac端拷貝個(gè)MJ的cy封裝文件到iPhone端,scp -P 10011 [文件] root@localhost:/usr/lib/cycript0.9/MJTool.cy

Mac終端實(shí)操傳MJTool.cy文件
iFunBox查看是否拷貝成功

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述暂、打印控制器的所有方法

注意:方法里面?zhèn)鞯氖菍?duì)象

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)框和密碼框:

找到賬號(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)

該控制器沒(méi)類方法

7.2 對(duì)象方法:MJInstanceMethodNames(#0x129c57f60)

對(duì)象方法

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 ting5晦炊、@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)是怎么做的

image.png
  1. 在執(zhí)行test.docPath能不能去掉test文件名——弄成全局

可以碧信,寫(xiě)成全局的赊琳,如何寫(xiě)成全局的:
在cy文件中去掉exports,就是全局的了砰碴,無(wú)需用文件名來(lái)調(diào)用了躏筏。

弄成全局后,要注意2點(diǎn):

  1. 導(dǎo)入test文件的時(shí)候不會(huì)提示文件中的全局呈枉,勿慌趁尼;
  2. cy文件多了以后,全局名可能會(huì)重復(fù)——解決辦法:加前綴猖辫。

導(dǎo)入test后酥泞,寫(xiě)成全局的LFSum和LFDocPath沒(méi)有提示了。

  1. 作者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、改微信錢包零錢

大致步驟:

  1. 連接登錄iPhone服務(wù)端冈在,打開(kāi)微信倒慧,進(jìn)入微信錢包頁(yè)面,搜索進(jìn)程ps -A包券,監(jiān)視微信進(jìn)程cycript -p WeChat纫谅,導(dǎo)入工具@import MJTool
  2. MJFrontVc():當(dāng)前控制器
  3. MJVcSubviews(#0x13e90c200):當(dāng)前控制器的所有子view
  4. command + F 搜索零錢的數(shù)字溅固,確定是哪個(gè)對(duì)象
  5. (#0x14065f880).text = '\xa5848,340.00'付秕,修改零錢
  6. (#0x14065f880).backgroundColor = [UIColor redColor],修改背景
  7. (#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)行增吼驶、刪、改、查蟹演。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末风钻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酒请,更是在濱河造成了極大的恐慌骡技,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羞反,死亡現(xiàn)場(chǎng)離奇詭異布朦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)昼窗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門是趴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人澄惊,你說(shuō)我怎么就攤上這事唆途。” “怎么了掸驱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵肛搬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我亭敢,道長(zhǎng)滚婉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任帅刀,我火速辦了婚禮,結(jié)果婚禮上远剩,老公的妹妹穿的比我還像新娘扣溺。我一直安慰自己,他們只是感情好瓜晤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布锥余。 她就那樣靜靜地躺著,像睡著了一般痢掠。 火紅的嫁衣襯著肌膚如雪驱犹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天足画,我揣著相機(jī)與錄音雄驹,去河邊找鬼。 笑死淹辞,一個(gè)胖子當(dāng)著我的面吹牛医舆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蔬将,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爷速!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起霞怀,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤惫东,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后毙石,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凿蒜,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年胁黑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了废封。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丧蘸,死狀恐怖漂洋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情力喷,我是刑警寧澤刽漂,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站弟孟,受9級(jí)特大地震影響贝咙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拂募,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一庭猩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陈症,春花似錦蔼水、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至论咏,卻和暖如春优炬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厅贪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工蠢护, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卦溢。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓糊余,卻偏偏與公主長(zhǎng)得像秀又,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贬芥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1吐辙、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,988評(píng)論 3 119
  • 天都亮了,你還在睡覺(jué)蘸劈。 春天來(lái)了昏苏,你還不運(yùn)動(dòng)。
    洪濤HT閱讀 160評(píng)論 0 0
  • 春節(jié)還沒(méi)結(jié)束,后臺(tái)就收到幾個(gè)同類型的留言棒掠。 “為什么春節(jié)之后孵构,頭油增多,頭皮發(fā)癢了呢烟很? 問(wèn)...
    星漢工作室閱讀 594評(píng)論 0 0
  • 墨記·日歌(壹佰壹拾叁·2018.8.23) 愛(ài)之殤:情欲迷霧 1 你把自己打扮得氣宇軒昂颈墅,所有的欲望都不需要躲躲...
    湖北葉瀟閱讀 737評(píng)論 9 3
  • 大家都知道作為我們從事計(jì)算機(jī)辦公的人來(lái)說(shuō),在當(dāng)今互聯(lián)網(wǎng)飛速發(fā)展的時(shí)代雾袱,對(duì)我們的辦公要求是越來(lái)越高了恤筛。辦公中需要處理...
    辦公小技巧閱讀 2,460評(píng)論 0 0