17 - Cycript

Cycript是由Cydia創(chuàng)始人Saurik推出的一款腳本語(yǔ)言饿序,Cycript混合了OC、JavaScript語(yǔ)法的解釋器羹蚣,這意味著我們能夠在一個(gè)命令中使用OC或者JavaScript原探,甚至兩者并用。它能夠掛鉤正在運(yùn)行的進(jìn)程,能夠在運(yùn)行時(shí)修改很多東西咽弦。

安裝

  • 下載Cycript徒蟆,官方文檔
  • 下載完成之后,為了方便使用型型,可以將其拷貝至/opt目錄下段审。
cp ./cycript_0.9.594 /opt/cycript_0.9.594
  • 配置環(huán)境變量,在~/.bash_profile或者~/.zshrc文件中添加以下配置
#Cycript配置
export CYCRIPT_PATH=/opt/cycript_0.9.594

使用

附加進(jìn)程

Monkey中集成了Cycript闹蒜,使用MonkeyDev重簽名應(yīng)用寺枉,會(huì)自動(dòng)注入libcycript.dylib相關(guān)文件。

當(dāng)設(shè)備啟動(dòng)注入了Cycript的目標(biāo)應(yīng)用绷落,應(yīng)用進(jìn)程會(huì)調(diào)用Cycript的方法姥闪,打開(kāi)端口供第三方監(jiān)聽(tīng),如下:

CYListenServer(6666);

當(dāng)設(shè)備啟用監(jiān)聽(tīng)時(shí)砌烁,第三方可以通過(guò)端口附加進(jìn)程筐喳,進(jìn)入cy環(huán)境,從而查看當(dāng)前進(jìn)程中的內(nèi)存數(shù)據(jù)函喉。假設(shè)端口IP為:172.20.10.14避归,則終端附加方式如下:

cycript -r 172.20.10.14:6666
cy#

注意:進(jìn)程運(yùn)行的設(shè)備和附加進(jìn)程的終端必須在同一網(wǎng)絡(luò)環(huán)境

常用指令

  • 獲取keyWindow
cy# UIWindow.keyWindow()

#"<iConsoleWindow: 0x14ea6fee0; baseClass = UIWindow; frame = (0 0; 375 812); gestureRecognizers = <NSArray: 0x282279260>; layer = <UIWindowLayer: 0x282db4080>>"
  • 獲取UIApplication
cy# UIApp

#"<UIApplication: 0x14ea28e00>"
  • 定義變量并賦值
cy# var keyWd = UIWindow.keyWindow()

#"<iConsoleWindow: 0x14ea6fee0; baseClass = UIWindow; frame = (0 0; 375 812); gestureRecognizers = <NSArray: 0x282279260>; layer = <UIWindowLayer: 0x282db4080>>"

cy# keyWd.rootViewController

#"<MMUINavigationController: 0x14f11f800> ChildViewControllers:(\n    \"<WCAccountLoginFirstViewController: 0x14f0fa600>\"\n)"
cy#

注意:當(dāng)程序的進(jìn)程結(jié)束了管呵,定義的所有變量也會(huì)釋放掉梳毙。

  • 獲取對(duì)象
 //通過(guò)(#對(duì)象地址)獲取對(duì)象
cy# #0x14f11f800
 
#"<MMUINavigationController: 0x14f11f800> ChildViewControllers:(\n    \"<WCAccountLoginFirstViewController: 0x14f0fa600>\"\n)"

//通過(guò)(*定義的變量)獲取對(duì)象
cy# *keyWd
{isa:iConsoleWindow,_responderFlags:@error,_constraintsExceptingSubviewAutoresizingConstraints:null...
  • 查看當(dāng)前視圖結(jié)構(gòu)
cy# keyWd.recursiveDescription()
 
@"<iConsoleWindow: 0x14ea6fee0; baseClass = UIWindow; frame = (0 0; 375 812); gestureRecognizers = <NSArray: 0x282279260>; layer = <UIWindowLayer: 0x282db4080>>\n   | <UITransitionView: 0x14ea65650; frame = (0 0; 375 812);...

cy# keyWd.recursiveDescription().toString()

`<iConsoleWindow: 0x14ea6fee0; baseClass = UIWindow; frame = (0 0; 375 812); gestureRecognizers = <NSArray: 0x282279260>; layer = <UIWindowLayer: 0x282db4080>>
   | <UITransitionView: 0x14ea65650; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x282db5460>>
   |    | <UIDropShadowView: 0x14ea74650; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x282db5580>>
   |    |    | <UILayoutContainerView: 0x14ea2e280; frame = (0 0; 375 812); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x28227a040>; layer = <CALayer: 0x282db47c0>>
   |    |    |    | <UINavigationTransitionView: 0x14ea724f0; frame = (0 0; 375 812); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x282db4800>>
  • 查詢當(dāng)前進(jìn)程中該類(lèi)型的對(duì)象
cy# choose(UIButton)

[#"<FixTitleColorButton: 0x14ef05d40; baseClass = UIButton; frame = (20 18; 157.5 47); clipsToBounds = YES; opaque = NO; autoresize = RM; layer = <CALayer: 0x282d3d200>>",#"<FixTitleColorButton: 0x14ea2cfb0; baseClass = UIButton; frame = (197.5 18; 157.5 47); clipsToBounds = YES; opaque = NO; autoresize = LM; layer = <CALayer: 0x282dead20>>"]
  • 修改內(nèi)存中的數(shù)據(jù)
    修改當(dāng)前應(yīng)用圖標(biāo)的通知?dú)馀輸?shù)目為999,假設(shè)當(dāng)前使用Monkey安裝并運(yùn)行微信(WeChat8.0.2.ipa)撇寞。
cy# [UIApp setApplicationBadgeString:@"999"]

修改結(jié)果如下:
IMG_0104.jpg
  • 修改控件屬性

假設(shè)當(dāng)前處于微信的登陸界面,打印keyWindow下所有視圖

UIWindow.keyWindow().recursiveDescription().toString()

從當(dāng)前界面中可以看到堂氯,有個(gè)+86的view蔑担,因此可以直接在打印的所有視圖中查找+86所在的控件

<WCUITextField: 0x116387c00; baseClass = UITextField; frame = (20 0; 73 44); text = '+86'; opaque = NO; autoresize = W+H; tintColor = UIExtendedSRGBColorSpace 0.027451 0.756863 0.376471 1; gestureRecognizers = <NSArray: 0x2817946f0>; borderStyle = None; background = <_UITextFieldNoBackgroundProvider: 0x2819310a0: textfield=<WCUITextField 0x116387c00>>; layer = <CALayer: 0x281b76700>>

修改WCUITextField文本框的text屬性,即:修改該控件的顯示咽白,將+86修改成+95

#0x116387c00.text = @"+95"

擴(kuò)展指令

MonkeyDev對(duì)一些常用方法進(jìn)行了封裝啤握,提供給開(kāi)發(fā)者使用,封裝方法的實(shí)現(xiàn)在Mokey項(xiàng)目的Config目錄下晶框,找到MDConfig.plist文件

image.png

  • 查看所有視圖
cy# pviews()

`<iConsoleWindow: 0x115c4f020; baseClass = UIWindow; frame = (0 0; 375 812); gestureRecognizers = <NSArray: 0x283ab8720>; layer = <UIWindowLayer: 0x283517b80>>
   | <UITransitionView: 0x115866000; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x283517da0>>
   |    | <UIDropShadowView: 0x115851d10; frame = (0 0; 375 812); autoresize = W+H; layer = <CALayer: 0x283517900>>

pviews等價(jià)如下指令:

cy# pviews

function (){return UIApp.keyWindow.recursiveDescription().toString()}
  • 獲取當(dāng)前控制器
cy# pvcs()

"<MMUINavigationController 0x116068000>, state: appeared, view: <UILayoutContainerView 0x115876ee0>\n   | <WCAccountLoginFirstViewController 0x1160c2a00>, state: appeared, view: <UIView 0x1158941a0>"

pvcs等價(jià)如下指令

cy# pvcs

function (){return UIWindow.keyWindow().rootViewController._printHierarchy().toString()}

cy文件

Cycript是一門(mén)腳本語(yǔ)言排抬,它可以加載封裝好的\*.cy文件,因此授段,我們可以將常用的Cycript功能封裝至\*.cy文件蹲蒲,在調(diào)試的時(shí)候可以直接使用\*.cy文件中封裝的指令。

在以上的擴(kuò)展示例中侵贵,MonkeyDev也對(duì)常用的指令進(jìn)行了封裝届搁。接下來(lái)我們來(lái)嘗試封裝自己的\*.cy文件

示例1

  • 創(chuàng)建test.cy文件
  • test.cy文件添加至MonkeyDemo項(xiàng)目中。
  • test.cy文件中先添加簡(jiǎn)單的方法
sum = function(a,b){
   return a + b;
}
  • MokeyDemo項(xiàng)目中卡睦,使用Copy Files添加test.cy宴胧,注意:test.cy是腳本文件,不是MachO表锻,因此不需要勾選簽名恕齐。
    image.png
  • 運(yùn)行MokeyDemo項(xiàng)目
  • 在終端對(duì)MokeyDemo項(xiàng)目進(jìn)行附加
cycript -r 172.20.10.14:6666
  • 導(dǎo)入test.cy腳本
@import test
  • 調(diào)用sum方法
sum(10,20)

30

示例2

  • 創(chuàng)建test.cy文件
  • test.cy文件添加至MonkeyDemo項(xiàng)目中。
  • test.cy文件中先添加簡(jiǎn)單的方法
(function(exports){
   APPID = [NSBundle mainBundle].bundleIdentifier,
   APPPATH = [NSBundle mainBundle].bundlePath,
   APPHOME = NSHomeDirectory(),

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

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

   getCurrentVC = function(rootVC){

       var currentVC;
       if([rootVC presentedViewController]){
           rootVC = [rootVC presentedViewController];
       }

       if([rootVC isKindOfClass:[UITabBarController class]]){
           currentVC = getCurrentVC(rootVC.selectedViewController);
       }
       else if([rootVC isKindOfClass:[UINavigationController class]]){
           currentVC = getCurrentVC(rootVC.visibleViewController);
       }
       else{
           currentVC = rootVC;
       }

       return currentVC;
   };

   currentVC = function(){
       return getCurrentVC(rootVC());
   };

})(exports);
  • MokeyDemo項(xiàng)目中瞬逊,使用Copy Files添加test.cy显歧,注意:test.cy是腳本文件,不是MachO码耐,因此不需要勾選簽名追迟。
    image.png
  • 運(yùn)行MokeyDemo項(xiàng)目
  • 在終端對(duì)MokeyDemo項(xiàng)目進(jìn)行附加
cycript -r 172.20.10.14:6666
  • 導(dǎo)入test.cy腳本
@import test
  • 獲取APPID
APPID

@"com.hq.MokeyDemo"
  • 獲取APPPATH
APPPATH

@"/private/var/containers/Bundle/Application/D620C178-5030-48E4-9276-981150FF7299/MokeyDemo.app"
  • 獲取APPHOME
APPHOME

@"/var/mobile/Containers/Data/Application/C2ED1E99-47C4-4C29-8AE6-9C5C136CEE04"
  • 調(diào)用currentVC方法
currentVC()

#"<WCAccountLoginFirstViewController: 0x14b0b4200>"

總結(jié)

  • Cycipt是一種腳本語(yǔ)言,混合了多種語(yǔ)法(混合多種語(yǔ)法的解釋器)骚腥,所以可以兼容敦间。

  • Cycipt可以附加到進(jìn)程,用來(lái)動(dòng)態(tài)調(diào)試束铭。

  • 可以將常用的功能封裝成\*.cy文件廓块,當(dāng)附加進(jìn)程后,導(dǎo)致\*.cy文件契沫,即可使用封裝的功能带猴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市懈万,隨后出現(xiàn)的幾起案子拴清,更是在濱河造成了極大的恐慌,老刑警劉巖会通,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件口予,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡涕侈,警方通過(guò)查閱死者的電腦和手機(jī)沪停,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)裳涛,“玉大人木张,你說(shuō)我怎么就攤上這事《巳” “怎么了舷礼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)郊闯。 經(jīng)常有香客問(wèn)我且轨,道長(zhǎng)浮声,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任旋奢,我火速辦了婚禮泳挥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘至朗。我一直安慰自己屉符,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布锹引。 她就那樣靜靜地躺著矗钟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫌变。 梳的紋絲不亂的頭發(fā)上吨艇,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音腾啥,去河邊找鬼东涡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛倘待,可吹牛的內(nèi)容都是我干的疮跑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凸舵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祖娘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起啊奄,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渐苏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后菇夸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體琼富,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年峻仇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了公黑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邑商。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摄咆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出人断,到底是詐尸還是另有隱情吭从,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布恶迈,位于F島的核電站涩金,受9級(jí)特大地震影響谱醇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜步做,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一副渴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧全度,春花似錦煮剧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至顶掉,卻和暖如春草娜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痒筒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工宰闰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凸克。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓议蟆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親萎战。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咐容,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 對(duì)了 LLDB 有了一些認(rèn)識(shí)之后,也能夠更好的使用 LLDB 了蚂维,但是對(duì)于常用的一些指令使用起來(lái)還是過(guò)于麻煩戳粒,為...
    有夢(mèng)想的程序員閱讀 1,484評(píng)論 0 4
  • ASLR ASLR(Address Space Layout Randomization),地址空間布局隨機(jī)化虫啥。是...
    鼬殿閱讀 1,212評(píng)論 1 0
  • Cycript是由Cydia創(chuàng)始人Saurik推出的一款腳本語(yǔ)言蔚约,Cycript混合了OC、JavaScript語(yǔ)...
    HotPotCat閱讀 1,910評(píng)論 0 1
  • Cycript是由Cydia創(chuàng)始人Saurik推出的一款腳本語(yǔ)言涂籽,Cycript混合了OC苹祟、JavaScript語(yǔ)...
    帥駝駝閱讀 516評(píng)論 0 2
  • Cycript是由Cydia創(chuàng)始人Saurik推出的一款腳本語(yǔ)言,Cycript混合了OC评雌、JavaScript語(yǔ)...
    king_jensen閱讀 1,915評(píng)論 0 0