用Cycript進(jìn)行實(shí)時(shí)修改
本文,我們將使用微信應(yīng)用來(lái)執(zhí)行所有的測(cè)試。一旦微信應(yīng)用應(yīng)用被安裝好,請(qǐng)確保它運(yùn)行在前臺(tái)。這是因?yàn)槿绻麘?yīng)用在后臺(tái),那它就會(huì)被暫停,你也不能對(duì)它做啥。
1)使用ssh命令連接手機(jī)
(SSH怎么用在簡(jiǎn)書搜索哈!)
wanggangdeMacBook-Pro:~ wanggang$ ssh root@192.168.1.100
//輸入ssh 密碼
root@192.168.1.100's password:
2)勾住進(jìn)程
一旦應(yīng)用跑起來(lái),你可以先找到其進(jìn)程id,然后用cycript -p掛鉤其進(jìn)程。
//連接手機(jī)
wanggangdeMacBook-Pro:~ wanggang$ ssh root@192.168.1.100
//輸入密碼
root@192.168.1.100's password:
shujinokinakenkou:~ root# ps aux | grep "weather"
mobile 15312 0.0 2.2 897008 21904 ?? Us 6:50PM 0:07.76 /var/mobile/Containers/Bundle/Application/A402E082-7FA0-40DC-9423-ADA502E06CE2/com.yahoo.weather-35524-distribution.app/yweather
root 15352 0.0 0.0 538432 496 s000 R+ 7:04PM 0:00.02 grep weather
shujinokinakenkou:~ root# cy#
-sh: cy#: command not found
//勾住we chat 列出 mobile id
shujinokinakenkou:~ root# ps aux | grep WeChat
root 15361 7.1 0.1 538432 536 s000 S+ 7:08PM 0:00.05 grep WeChat
mobile 15323 1.1 4.5 1041712 45096 ?? Ss 6:50PM 0:12.23 /var/mobile/Containers/Bundle/Application/B02EC742-D61A-4F7B-B5DC-9598FF2DD165/WeChat.app/WeChat
shujinokinakenkou:~ root# cycript 15312
*** _assert(!stream->fail()):../Console.cpp(1098):Main
//勾住進(jìn)程id 微信的進(jìn)程id 是15323 mobile 后面的就是
shujinokinakenkou:~ root# cycript -p 15323
//下面使用cy語(yǔ)言愉快的調(diào)試了
cy# var delegate = UIApp.delegate
#"<MicroMessengerAppDelegate: 0x13f76f8f0>"
cy# var window = delegate.window
#"<iConsoleWindow: 0x13f68b6d0; baseClass = UIWindow; frame = (0 0; 414 736); autoresize = W+H; gestureRecognizers = <NSArray: 0x13f68d020>; layer = <UIWindowLayer: 0x13f68b6b0>>"
cy# var rootVC = windown.rootViewController
throw new ReferenceError("Can't find variable: windown")
出現(xiàn)下面代碼說(shuō)明勾住進(jìn)程成功
root 15361 7.1 0.1 538432 536 s000 S+ 7:08PM 0:00.05 grep WeChat
mobile 15323 1.1 4.5 1041712 45096 ?? Ss 6:50PM 0:12.23/var/mobile/Containers/Bundle/Application/B02EC742-D61A-4F7B-B5DC-9598FF2DD165/WeChat.app/WeChat
如果掛鉤成功,你可以得到一個(gè)Cycript解釋器。你可以通過(guò)Objective-C的語(yǔ)法 [UIApplication sharedApplication].來(lái)得到實(shí)例。
3)實(shí)戰(zhàn)
執(zhí)行隱藏和顯示狀態(tài)欄的命令
cy# var delegate
cy# [[UIApplication sharedApplication] setStatusBarHidden:YES]
cy# [[UIApplication sharedApplication] setStatusBarHidden:NO]
cy# [[UIApplication sharedApplication] setStatusBarHidden:YES]
cy# [[UIApplication sharedApplication] setStatusBarHidden:YES]
cy# [[UIApplication sharedApplication] setStatusBarHidden:NO]
cy# [[UIApplication sharedApplication] setStatusBarHidden:YES]
cy# [[UIApplication sharedApplication] setStatusBarHidden:NO]
cy# [[UIApplication sharedApplication] setStatusBarHidden:NO]
顯示結(jié)果,可以看到執(zhí)行命令導(dǎo)航欄消失和隱藏

導(dǎo)航欄顯示和隱藏.gif
在微信app內(nèi)彈框執(zhí)行以下命令
cy# [[[UIAlertView alloc]initWithTitle:@"cy" message:@"guanzhuwo" delegate:ni cancelButtonTitle:@"ok" otherButtonTitles:nil, nil] show]
cy# [[[UIAlertView alloc]initWithTitle:@"cy" message:@"guanzhuwo" delegate:ni cancelButtonTitle:@"ok" otherButtonTitles:nil, nil] show]
效果圖

彈框提示.gif
更改badge 的值執(zhí)行如下命令
cy# [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1000]
cy# [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1000]
cy# [[UIApplication sharedApplication] setApplicationIconBadgeNumber:100]
cy# [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]
效果圖(觀察微信圖標(biāo)右上角小圓點(diǎn)的變化)

badge更改.gif
有了頭文件,有了ida反編譯,配合上cycript,可以驗(yàn)證我們的各種關(guān)于微信代碼的猜測(cè),但要將這些猜測(cè)串成一個(gè)可執(zhí)行的Tweak,就需要反復(fù)的大量的實(shí)驗(yàn)。
cycript 還有其他的用法推薦這篇文章
iOS逆向工程(Cycript腳本語(yǔ)言使用與實(shí)戰(zhàn))
- 作者開(kāi)發(fā)經(jīng)驗(yàn)總結(jié)的文章推薦,持續(xù)更新學(xué)習(xí)心得筆記
Runtime 10種用法(沒(méi)有比這更全的了)
成為iOS頂尖高手,你必須來(lái)這里(這里有最好的開(kāi)源項(xiàng)目和文章)
iOS逆向Reveal查看任意app 的界面
JSPatch (實(shí)時(shí)修復(fù)App Store bug)學(xué)習(xí)(一)
iOS 高級(jí)工程師是怎么進(jìn)階的(補(bǔ)充版20+點(diǎn))
擴(kuò)大按鈕(UIButton)點(diǎn)擊范圍(隨意方向擴(kuò)展哦)
最簡(jiǎn)單的免證書真機(jī)調(diào)試(原創(chuàng))
通過(guò)分析微信app,學(xué)學(xué)如何使用@2x,@3x圖片
TableView之MVVM與MVC之對(duì)比
使用MVVM減少控制器代碼實(shí)戰(zhàn)(減少56%)
ReactiveCocoa添加cocoapods 配置圖文教程及坑總結(jié)