cycript是混合了objective-c与javascript语法的一个工具,让开发者在命令行下和应用交互,在运行时查看和修改应用。
基本使用方法。以SpringBoard为例
在mac上ssh登录手机,或者在手机上安装 Terminal
,找到SpringBoard进程
didi:~ root# ps -e | grep SpringBoard
1759 ?? 0:22.40 /System/Library/CoreServices/SpringBoard.app/SpringBoard
1835 ttys000 0:00.01 grep SpringBoard
获取到进程的id是 1759
,然后用 cycript - p
命令注入这个进程
didi:~ root# cycript - p 1759
想要在SpringBoard界面弹出一个提示框,上节使用Tweak工程实现了这个功能,但用cycript的话,只要两句代码就可以了,而且是实时注入的。
cy# alertView = [[UIAlertView alloc] initWithTitle:@"test" message:@"liuchendi" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]
#"<UIAlertView: 0x18b6c8d0; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x18b85720>>"
cy# [alertView show]
不需要声明类型,不需要输入分号。使用过程中还能打印一些生成的信息。
运行结果:
知道内存地址,获取对象
通过 #
获取对象,比如刚刚生成的UIAlertView对象的内存地址是 0x18b6c8d0
cy# [#0x18b6c8d0 show]
一样可以弹出提示框
知道一个类,获取内存地址
通过 choose
命令可以查看,这个命令不一定百发百中,如果没找到需要自己手动找。
cy# choose(SBScreenShotter)
[#"<SBScreenShotter: 0x18bc25c0>"]
例子:获取私有函数,登录iMessage
获取iMessage的控制器
cy# controller = [CNFRegController controllerForServiceType:1]
#"<CNFRegController: 0x18e9f990>"
登录iMessage,这里屏蔽了敏感的信息.用自己的帐号密码登录
cy# [controller beginAccountSetupWithLogin:@"appID" password:@"appPassword" foundExisting:NO]
#"IMAccount: 0x18fcbab0 [ID: 89E8048D-183C-460D-9438-719738CBBC13 Service: IMService[iMessage] Login: E:appID Active: YES LoginStatus: Connected]"
这里返回了一个 IMAccount
对象
选择收发的邮件地址
cy# [controller setAliases:@[@"xxx@qq.com"] onAccount:#0x18fcbab0]
1
返回值为1表示成功登录了iMessage