Cycript是由Cydia創(chuàng)始人Saurik推出的一款腳本語言,Cycript混合了OC、JavaScript語法的解釋器,這意味著我們能夠在一個(gè)命令中使用OC或者JavaScript,甚至兩者并用。它能夠掛鉤正在運(yùn)行的進(jìn)程,能夠在運(yùn)行時(shí)修改程序。
一、Cycript安裝
Cycript官網(wǎng),目前最新版本0.9.594。直接下載SDK解壓放在/opt目錄中:

驗(yàn)證./cycript:
? ./cycript
dyld: Library not loaded: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib
Referenced from: /opt/cycript_0.9.594/./Cycript.lib/cycript-apl
Reason: image not found
[1] 45603 abort ./cycript
出現(xiàn)image not found發(fā)現(xiàn)需要Ruby 2.0,進(jìn)入目錄只有2.6:

將
2.6拷貝一份改名為2.0就可以了,在某些版本的MAC OSX在該目錄不能修改則將Monkey/bin中的cycript拷貝到cycript中替換cycript文件。

再次執(zhí)行就可以了:
? ./cycript
cy#
進(jìn)入cy#表示配置成功。
接著配置環(huán)境變量:
export CY=/opt/cycript_0.9.594/
export PATH=/opt/MonkeyDev/bin:$PATH:$CY
配置環(huán)境變量后在任意路徑輸入cycript就可以進(jìn)入cycript了。如果已經(jīng)安裝了Monkey則不需要配置和安裝cycript了。(monkey自帶)。
二、Cycript常用命令
只要將cycript注入到應(yīng)用中,我們就可以調(diào)用其中的命令了,Monkey重簽名注入的時(shí)候幫我們注入了:

相當(dāng)于開啟端口,可以監(jiān)聽。
進(jìn)入Cycript環(huán)境
直接在終端輸入cycript就進(jìn)入cycript環(huán)境了:
? ~ cycript
cy#
附加進(jìn)程
連接進(jìn)程進(jìn)入Cycript環(huán)境
? ~ cycript -r 192.168.3.127:6666
cy#
這里手機(jī)和電腦要在同一wifi,并且進(jìn)入應(yīng)用程序進(jìn)程。ip為手機(jī)的ip。
退出cycript環(huán)境
control + d
cycript調(diào)試命令
UIWindow.keyWindow()獲取keyWindow
cy# UIWindow.keyWindow()
#"<iConsoleWindow: 0x11344a220; baseClass = UIWindow; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x2812ea8b0>; layer = <UIWindowLayer: 0x281c928c0>>"
這個(gè)時(shí)候進(jìn)程并沒有被中斷。為了方便我們可以定義變量keyWd:
cy# var keyWd = UIWindow.keyWindow()
#"<iConsoleWindow: 0x11344a220; baseClass = UIWindow; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x2812ea8b0>; layer = <UIWindowLayer: 0x281c928c0>>"
后續(xù)直接調(diào)用keyWd就能拿到keyWindow。即使control + d/ 退出終端下次進(jìn)入這個(gè)變量仍然有效。應(yīng)用程序重啟就失效了。
UIApp獲取單類對(duì)象
cy# UIApp
#"<UIApplication: 0x111d15e60>"
獲取rootVC
cy# [keyWd rootViewController]
#"<MMUINavigationController: 0x1140d4800> ChildViewControllers:(\n \"<WCAccountLoginFirstViewController: 0x1138c4600>\"\n)"
#對(duì)象地址
拿到該對(duì)象,可用于調(diào)用方法。
cy# #0x1140d4800
#"<MMUINavigationController: 0x1140d4800> ChildViewControllers:(\n \"<WCAccountLoginFirstViewController: 0x1138c4600>\"\n)"
*對(duì)象地址
可以取出對(duì)象的成員變量。

recursiveDescription() 循環(huán)打印子視圖
cy# keyWd.recursiveDescription()

toString() 格式化打?。ㄓ龅?code>\n換行)
cy# keyWd.recursiveDescription().toString()
`<iConsoleWindow: 0x1134535e0; baseClass = UIWindow; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x281210fc0>; layer = <UIWindowLayer: 0x281cf9600>>
| <UITransitionView: 0x113459e70; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x281cfa820>>
| | <UIDropShadowView: 0x11345aa60; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x281cf9980>>
| | | <UILayoutContainerView: 0x1134565c0; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x281211f20>; layer = <CALayer: 0x281cf9f80>>
| | | | <UINavigationTransitionView: 0x113457e30; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x281cf9b80>>
| | | | | <UIViewControllerWrapperView: 0x11347b300; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x281c38c40>>
| | | | | | <UIView: 0x11342afc0; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x281cf1d20>>
| | | | | | | <UIView: 0x11342d440; frame = (0 20; 375 732); autoresize = W; layer = <CALayer: 0x281cf2ba0>>
| | | | | | | | <UIImageView: 0x1135125b0; frame = (0 -20; 375 667); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x281c096a0>>
| | | | | | | <UIView: 0x113558ea0; frame = (0 582; 375 65); autoresize = W+TM; layer = <CALayer: 0x281cffaa0>>
| | | | | | | | <FixTitleColorButton: 0x1134553a0; baseClass = UIButton; frame = (20 18; 157.5 47); clipsToBounds = YES; opaque = NO; autoresize = RM; layer = <CALayer: 0x281cffd20>>
| | | | | | | | | <UIButtonLabel: 0x113433470; frame = (60.5 12.5; 37 22); text = '\u767b\u5f55'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x283fa25d0>>
| | | | | | | | <FixTitleColorButton: 0x113535180; baseClass = UIButton; frame = (197.5 18; 157.5 47); clipsToBounds = YES; opaque = NO; autoresize = LM; layer = <CALayer: 0x281c20d40>>
| | | | | | | | | <UIButtonLabel: 0x1135374c0; frame = (60.5 12.5; 37 22); text = '\u6ce8\u518c'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x283fa5cc0>>
| | | | | | | <UIButton: 0x1135385c0; frame = (287 20; 88 49); opaque = NO; autoresize = LM; layer = <CALayer: 0x281c20f80>>
| | | | | | | | <UIButtonLabel: 0x11345c7c0; frame = (15 16; 58 17); text = '\u7b80\u4f53\u4e2d\u6587'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x283fa2990>>
| | | | <MMUINavigationBar: 0x113456740; baseClass = UINavigationBar; frame = (0 20; 375 44); opaque = NO; autoresize = W; layer = <CALayer: 0x281cf9dc0>>
| | | | | <_UIBarBackground: 0x113456b90; frame = (0 -20; 375 64); userInteractionEnabled = NO; layer = <CALayer: 0x281cf9c20>>
| | | | | | <UIImageView: 0x11347ce10; frame = (0 0; 375 64); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x281c39380>>
| | | | | | <_UIBarBackgroundShadowView: 0x113458380; frame = (0 64; 375 0); layer = <CALayer: 0x281cfa060>> clientRequestedContentView effect=none
| | | | | | | <_UIBarBackgroundShadowContentImageView: 0x1134586f0; frame = (0 0; 375 0); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x281cfa120>>
| | | | | <_UINavigationBarContentView: 0x113456d70; frame = (0 0; 375 44); layer = <CALayer: 0x281cf9b60>> layout=0x113456ff0
| | | | | | <_UITAMICAdaptorView: 0x11346ce60; frame = (187 4; 1 36); autoresizesSubviews = NO; layer = <CALayer: 0x281cf1d40>>
| | | | | | | <MMTitleView: 0x113562990; frame = (0 0; 1 36); layer = <CALayer: 0x281ce17a0>>
| | | | | | | | <MMUILabel: 0x1135620f0; baseClass = UILabel; frame = (0 0; 0 36); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x283faad00>>
| | | | | <UIView: 0x11352e9c0; frame = (0 44; 375 0.5); hidden = YES; autoresize = W+TM; layer = <CALayer: 0x281c3e840>>
| | | | | <UIView: 0x113452c50; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x281cf9ae0>>`
choose(類名)
查詢當(dāng)前進(jìn)程中該類型的對(duì)象。
cy# choose(UIButton)
"<FixTitleColorButton: 0x113535180; baseClass = UIButton; frame = (197.5 18; 157.5 47); clipsToBounds = YES; opaque = NO; autoresize = LM; layer = <CALayer: 0x281c20d40>>,<UIButton: 0x1135385c0; frame = (287 20; 88 49); opaque = NO; autoresize = LM; layer = <CALayer: 0x281c20f80>>,<FixTitleColorButton: 0x1134553a0; baseClass = UIButton; frame = (20 18; 157.5 47); clipsToBounds = YES; opaque = NO; autoresize = RM; layer = <CALayer: 0x281cffd20>>"
和LLDB中search很像。
三、腳本自動(dòng)連接
創(chuàng)建一個(gè)腳本cyConnect.sh,填入一下內(nèi)容:
cycript -r 192.168.3.127:6666
配置環(huán)境變量:
export HPShell=/Users/zaizai/HPShell/
export PATH=/opt/MonkeyDev/bin:$HPShell:$PATH
使用:
? ~ cyConnect.sh
cy#
這樣就能自動(dòng)連接了。
四、Cycript 修改內(nèi)存
修改角標(biāo)
cy# [UIApp setApplicationBadgeString: @"999"]
修改紅包金額
正常內(nèi)容如下:

首先通過choose(UILabel)找到紅包金額
choose(UILabel).toString()
搜索1.00得到地址0x149eaef00:

修改金額:
cy# #0x149eaef00.text = @"¥88888888.00"
@"\xef\xbf\xa588888888.00"
接著同樣的方式找到紅包中借款地址0x14c33b460
cy# #0x14c33b460.text = @"還款"
@"\xe8\xbf\x98\xe6\xac\xbe"
修改完成后內(nèi)容如下:

修改聊天內(nèi)容
我們可以直接通過cycript搜索控件進(jìn)行修改,也可以通過Xcode view debug找到控件進(jìn)行修改。

可以看到內(nèi)容在
accessibility的description中:
這個(gè)時(shí)候通過修改
text已經(jīng)無效了,Hook下代碼調(diào)試下:
%hook RichTextView
- (_Bool)setPrefixContent:(id)arg1 TargetContent:(id)arg2 TargetParserString:(id)arg3 SuffixContent:(id)arg4 {
// arg2 為文案
return %orig;
}
%end
經(jīng)過排查發(fā)現(xiàn)arg2為文案,所以直接在這里寫死試試:
%hook RichTextView
- (_Bool)setPrefixContent:(id)arg1 TargetContent:(NSString *)arg2 TargetParserString:(id)arg3 SuffixContent:(id)arg4 {
// arg2 為文案
if([arg2 isEqualToString:@"錢已經(jīng)借給你了。"]) {
arg2 = @"錢已經(jīng)換給你了,請(qǐng)查收!";
}
return %orig;
}
%end
確認(rèn)可以修改。
至此整個(gè)內(nèi)容就修改完成了:

所以微信截圖什么的一個(gè)字也不能信。隨便修改,想要什么樣的內(nèi)容都可以。
五、Cycript高級(jí)用法
APPID獲取bundle identifier
cy# APPID
@"com.guaizai.MonkeyDemo"
pviews()
獲取視圖層級(jí)
`<iConsoleWindow: 0x113790b60; baseClass = UIWindow; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x2811ce0d0>; layer = <UIWindowLayer: 0x281f12020>>
| <UITransitionView: 0x113797170; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x281f13120>>
| | <UIDropShadowView: 0x113798100; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x281f13240>>
| | | <UILayoutContainerView: 0x113793ba0; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x2811cf060>; layer = <CALayer: 0x281f124c0>>
| | | | <UINavigationTransitionView: 0x1137950f0; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x281f12760>>
| | | | | <UIViewControllerWrapperView: 0x11378b1d0; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x281fd9400>>
| | | | | | <UIView: 0x113794990; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x281fe8180>>
| | | | | | | <UIView: 0x113793980; frame = (0 20; 375 732); autoresize = W; layer = <CALayer: 0x281fe8ac0>>
| | | | | | | | <UIImageView: 0x113316830; frame = (0 -20; 375 667); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x281fec780>>
| | | | | | | <UIView: 0x113316140; frame = (0 582; 375 65); autoresize = W+TM; layer = <CALayer: 0x281fecc60>>
| | | | | | | | <FixTitleColorButton: 0x113306f70; baseClass = UIButton; frame = (20 18; 157.5 47); clipsToBounds = YES; opaque = NO; autoresize = RM; layer = <CALayer: 0x281fecea0>>
| | | | | | | | | <UIButtonLabel: 0x113328f90; frame = (60.5 12.5; 37 22); text = '\u767b\u5f55'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x283c4acb0>>
| | | | | | | | <FixTitleColorButton: 0x1137562e0; baseClass = UIButton; frame = (197.5 18; 157.5 47); clipsToBounds = YES; opaque = NO; autoresize = LM; layer = <CALayer: 0x281fc70a0>>
| | | | | | | | | <UIButtonLabel: 0x1137590e0; frame = (60.5 12.5; 37 22); text = '\u6ce8\u518c'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x283c46710>>
| | | | | | | <UIButton: 0x11375a080; frame = (287 20; 88 49); opaque = NO; autoresize = LM; layer = <CALayer: 0x281fc72e0>>
| | | | | | | | <UIButtonLabel: 0x113762910; frame = (15 16; 58 17); text = '\u7b80\u4f53\u4e2d\u6587'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x283c46850>>
| | | | <MMUINavigationBar: 0x113793d20; baseClass = UINavigationBar; frame = (0 20; 375 44); opaque = NO; autoresize = W; layer = <CALayer: 0x281f124e0>>
| | | | | <_UIBarBackground: 0x113794170; frame = (0 -20; 375 64); userInteractionEnabled = NO; layer = <CALayer: 0x281f12560>>
| | | | | | <UIImageView: 0x11378df60; frame = (0 0; 375 64); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x281fd9a80>>
| | | | | | <_UIBarBackgroundShadowView: 0x1137957a0; frame = (0 64; 375 0); layer = <CALayer: 0x281f129a0>> clientRequestedContentView effect=none
| | | | | | | <_UIBarBackgroundShadowContentImageView: 0x113795b10; frame = (0 0; 375 0); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x281f12a60>>
| | | | | <_UINavigationBarContentView: 0x113794350; frame = (0 0; 375 44); layer = <CALayer: 0x281f12580>> layout=0x1137945d0
| | | | | | <_UITAMICAdaptorView: 0x11378e920; frame = (187 4; 1 36); autoresizesSubviews = NO; layer = <CALayer: 0x281fe81a0>>
| | | | | | | <MMTitleView: 0x113338b90; frame = (0 0; 1 36); layer = <CALayer: 0x281f36fa0>>
| | | | | | | | <MMUILabel: 0x1133382f0; baseClass = UILabel; frame = (0 0; 0 36); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x283c48a00>>
| | | | | <UIView: 0x11373a720; frame = (0 44; 375 0.5); hidden = YES; autoresize = W+TM; layer = <CALayer: 0x281f5a3a0>>
| | | | | <UIView: 0x1137903d0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x281f127a0>>`
pvcs()
獲取視圖控制器
cy# pvcs()
"<MMUINavigationController 0x11396f600>, state: appeared, view: <UILayoutContainerView 0x113793ba0>\n | <WCAccountLoginFirstViewController 0x11400fa00>, state: appeared, view: <UIView 0x113794990>"
這些命令并不是cycript自帶的,那么這些命令哪里來的呢?
在Monkey工程我們可以在Config->MDConfig.plist中發(fā)現(xiàn)Cycript下有ms和md兩個(gè).cy文件。

這些命令就封裝在這兩個(gè)文件中(工程運(yùn)行的時(shí)候自動(dòng)從網(wǎng)絡(luò)上下載)。
ms.cy
md.cy
六、封裝cy文件
Cycript是一門腳本語言,它可以加載封裝好的.cy文件。我們會(huì)將常見的Cycript常用功能封裝到.cy文件中,便于調(diào)試。
創(chuàng)建一個(gè)HotpotCat.cy文件:
//IIFE 匿名函數(shù)自執(zhí)行表達(dá)式
(function(exports){
//不變的內(nèi)容使用常量
APPID = [NSBundle mainBundle].bundleIdentifier,
APPPATH = [NSBundle mainBundle].bundlePath,
APPHOME = NSHomeDirectory(),
//變化的內(nèi)容,就用function去定義!!
HPRootVC = function(){
return UIApp.keyWindow.rootViewController;
};
HPKeyWindow = function(){
return UIApp.keyWindow;
};
HPGetCurrentVCFromRootVc = function(rootVC){
var currentVC;
if([rootVC presentedViewController]){
rootVC = [rootVC presentedViewController];
}
if([rootVC isKindOfClass:[UITabBarController class]]){
currentVC = HPGetCurrentVCFromRootVc(rootVC.selectedViewController);
}else if([rootVC isKindOfClass:[UINavigationController class]]){
currentVC = HPGetCurrentVCFromRootVc(rootVC.visibleViewController);
}else{
currentVC = rootVC;
}
return currentVC;
};
HPCurrentVC = function(){
return HPGetCurrentVCFromRootVc(HPRootVC());
};
})(exports);
- 對(duì)于不變的內(nèi)容使用常量。
- 變化的內(nèi)容,用
function定義。
七 導(dǎo)入.cy文件
7.1 非越獄環(huán)境導(dǎo)入cy文件
-
通過Framworks導(dǎo)入
利用MonkeyDev工具導(dǎo)入.cy文件,MonkeyDev本身集成了Cycript,只需要將.cy文件通過xcode導(dǎo)入Framworks目錄即可。
image.png
- 將
HotpotCat.cy拖入工程。 - 在
Copy Files中添加HotpotCat.cy。
這個(gè)時(shí)候編譯完工程后在Frameworks中就能找到HotpotCat.cy文件了:

-
通過配置文件導(dǎo)入
這里可以參考NSLog的方式:
image.png
-
LoadAtLaunch:啟動(dòng)的時(shí)候是否加載腳本。 -
priority:優(yōu)先級(jí)。數(shù)字越小優(yōu)先級(jí)越高,適用于有依賴關(guān)系的腳本。 -
content/url:腳本可以直接寫到content里面,也可以是網(wǎng)絡(luò)的url會(huì)自動(dòng)下載下來。
7.1.1 使用自定義.cy內(nèi)容
? ~ cyConnect.sh
cy# @import HotpotCat
{}
cy# HPCurrentVC()
#"<WCAccountLoginFirstViewController: 0x11612d200>"
cy# APPHOME
@"/var/mobile/Containers/Data/Application/A3FC3D2B-03D5-436F-BD35-5560BDE37ADD"
cy# APPPATH
@"/private/var/containers/Bundle/Application/A2E20EBA-7AF7-4825-B693-13A19F626174/MonkeyDemo.app"
- 首先進(jìn)入
cycript環(huán)境。 - 導(dǎo)入
.cy文件,這里不需要后綴。如果是通過config配置并且默認(rèn)啟動(dòng)加載則不需要。 - 調(diào)用定義的常量或者方法。
HotpotCat.cy是通過libcycript.dylib加載的。
7.2 越獄手機(jī)中使用Cycript
-
越獄手機(jī)安裝
Cycript插件
Cycript插件
安裝后手機(jī)環(huán)境下就有了Cycript。 -
安裝手機(jī)終端命令插件
adv-cmds
Screen Shot 2021-05-27 at 4.33.39 PM.png
adv-cmds是手機(jī)終端命令插件,比如clear等命令。能夠幫助我們更好的使用手機(jī)終端。 手機(jī)終端使用
cycript
zaizai:~ root# ps -A | grep WeChat
21890 ?? 0:01.80 /var/containers/Bundle/Application/8F382114-BBA7-4D81-AA3E-3CD02E03E23E/WeChat.app/WeChat
21896 ttys000 0:00.01 grep WeChat
zaizai:~ root# cycript -p 21890
cy#
- 找到進(jìn)程id。
- 通過
cycript -p 進(jìn)程id/進(jìn)程名字進(jìn)入cycript環(huán)境。如果有同名進(jìn)程那么只能通過id。
cy# UIApp
#"<UIApplication: 0x110f10df0>"
zaizai:~ root# cycript -p AlipayWallet
cy# UIApp
#"<DFApplication: 0x10b30cbf0>"
這個(gè)時(shí)候就附加了微信了,可以直接在手機(jī)終端動(dòng)態(tài)調(diào)試正版微信了。
7.2.1 手機(jī)越獄環(huán)境使用Cy文件
那么怎么導(dǎo)入cy文件呢?非越獄環(huán)境是導(dǎo)入到App里面的,越獄環(huán)境可以直接導(dǎo)入到手機(jī)中。
在手機(jī)端有一個(gè)目錄cd /usr/lib/cycript0.9/,我們的cy文件需要放入這個(gè)路徑下才行。
在這個(gè)目錄下有文件目錄如下:

可以看到
MS.cy是在saurik目錄下的。這么做是為了規(guī)范 避免沖突,有點(diǎn)像BundleId。那么我們自己的腳本也應(yīng)該建立自己的目錄com/HotpotCat。
zaizai:/usr/lib/cycript0.9 root# cd com
zaizai:/usr/lib/cycript0.9/com root# ls
saurik/
zaizai:/usr/lib/cycript0.9/com root# mkdir HotpotCat
zaizai:/usr/lib/cycript0.9/com root# cd HotpotCat
zaizai:/usr/lib/cycript0.9/com/HotpotCat root# pwd
/usr/lib/cycript0.9/com/HotpotCat
zaizai:/usr/lib/cycript0.9/com/HotpotCat root#
接著將自己的腳本拷貝到這個(gè)目錄/usr/lib/cycript0.9/com/HotpotCat/:
scp -P 12345 HotpotCat.cy root@localhost:/usr/lib/cycript0.9/com/HotpotCat/
使用腳本
導(dǎo)入:
@import com.saurik.substrate.MS
@import com.HotpotCat.HotpotCat

總結(jié)
-
cycript是一種腳本語言,混合了多種語法。(混合了多種語法的解釋器),所以可以兼容。 - 越獄手機(jī)安裝
cycript插件(依賴adv-cmds插件)。 -
cycript可以附加到進(jìn)程,動(dòng)態(tài)調(diào)試應(yīng)用。cycript -p 進(jìn)程iD/名稱
-
cy文件-
/usr/lib/cycript0.9目錄中 - 為了不重名放入
com目錄中,創(chuàng)建自己的組織文件夾。 - 加載的時(shí)候
@import com.組織名稱.文件名稱
-



