- 上一篇文章 已经说完怎么封装使用
.cy
脚本文件了,这里借鉴MJ大佬
的阳光普照封装了一些常用的操作,可以帮助快速的分析软件,后续会在这基础上继续更新脚本。 - 脚本里面都有注释,可以下载自己去看看,下面会安装使用一下其中的部分方法,其他的方法也就是大同小异,可以自己参考或者自己编写了。
- 其实会了都不难,也就是
JS
+OC
,会前端
加iOS开发
都能写得出来,后面可以加入一些有难度点的东西。
一、安装使用脚本
1、下载 DZMCycript 脚本文件
2、通过 手机终端命令
或者 iFunBox
导入到手机端的 /usr/lib/cycript0.9
里面,可以看 上一篇文章 怎么使用 .cy
脚本文件的。
$ scp -P 10010 /Users/dengzemiao/Desktop/GitHub/DZMCycript/DZMCycript.cy root@localhost:/usr/lib/cycript0.9
3、文件导入到手机之后,进入手机终端,之前文章有封装 SSH
免密登录的
dengzemiaodeMacBook-Pro:ssh dengzemiao$ sh login.sh iPhone:~ root#
4、通过 Cycript
监听软件进入调试环境,并导入 DZMCycript
脚本
// 监听进入调试环境 iPhone:~ root# sycript -p neteasemusic // 导入脚本成功 cy# @import DZMCycript {} // 使用脚本 cy# DZMAppId @"com.netease.cloudmusic" cy# DZMFrontVc() #"<NMSettingTabViewController: 0x118a337a0>"
下面都是介绍一些方法的使用,会用可以不用看!!!。
二、DZMFrontVc()
DZMRectMake(x, y, w, h)
测试:在任意APP上添加UI视图
// 进入软件监听调试环境 iPhone:~ root# cycript -p neteasemusic // 导入 DZMCycript cy# @import DZMCycript {} // 获取当前最上层控制器(如果有控制器嵌套什么的这个需要自己注意,可以通过脚本里面或者自己 iOS 的代码获取到当前控制器,如果不嵌套一般都是可以正常获取到的) cy# DZMFrontVc() #"<NMPhoneLoginViewController: 0x10a968340>" // 添加一个红色 View 到软件页面上 // 创建 redView cy# var redView = [[UIView alloc] initWithFrame:DZMRectMake(50, 50, 100, 100)] #"<UIView: 0x114f3bef0; frame = (50 50; 100 100); layer = <CALayer: 0x280c718c0>>" // 设置颜色 cy# redView.backgroundColor = [UIColor redColor] #"UIExtendedSRGBColorSpace 1 0 0 1" // 添加到当前控制器 View 上显示 cy# [#0x10a968340.view addSubview: redView]
三、DZMLoadFramework(name)
测试:动态给软件添加系统库
- 比如我们要给一个
APP
添加上地图,但是APP
没有导入地图库MapKit.framework
,那么也就不能使用地图对象MKMapView
去创建地图,如果不导入库直接创建使用地图对象会报错的。 - 通过
DZMCycript
脚本动态导入库,并使用,其实跟iOS
开发是一样的
// 进入软件监听调试环境 iPhone:~ root# cycript -p neteasemusic // 导入 DZMCycript cy# @import DZMCycript {} // 获取当前控制器 cy# DZMFrontVc() #"<NMPhoneLoginViewController: 0x1121d5d20>" // 导入 MapKit 库,字符串即可 cy# DZMLoadFramework('MapKit') #"NSBundle </System/Library/Frameworks/MapKit.framework> (loaded)" // 创建 MapView cy# var mapView = [[MKMapView alloc] initWithFrame: DZMRectMake(50, 50, 100, 100)] #"<MKMapView: 0x10b3c5c00; frame = (50 50; 100 100); clipsToBounds = YES; layer = <CALayer: 0x280cd9c20>>" // 添加到当前控制器 View 上显示地图 cy# [#0x1121d5d20.view addSubview: mapView]
四、DZMInstanceMethodNames(className, reg)
测试:获取指定对象里面有哪些对象方法,这样我们就可以拿到任何对象里面的方法,这样不就可以随便手动调用了
// 获得当前控制器 登录控制器 cy# DZMFrontVc() #"<NMPhoneLoginViewController: 0x1121d5d20>" // 获取登录控制器有哪些对象方法 cy# DZMInstanceMethodNames(#0x1121d5d20) [&"backAction:",&"pageName",&"notNeedShowShareMenu",&"loginView",&"stopActivityWithText:",&"onResetPhoneClicked:",&"captchaDidChanged:",&"onCaptchaReturn",&"onEditPhoneButtonDidClicked:",&"setLoginView:",&"captchaView",&"setCurrentPhoneNumberExist:",&"setCurrentPhoneNumberNickname:",&"setCaptchaView:",&"_passwordLoginButtonDidClicked:",&"currentPhoneNumberExist",&"setIsVerifyingCaptcha:",&"_dismissCapthcaView:",&"currentPhoneNumberNickname",&"phoneNumberViewNextButtonClicked:",&"phoneNumberViewTextDidChanged:",&"resendButtonClicked:",&"isVerifyingCaptcha",&"startActivity",&"init",&"dealloc",&".cxx_destruct",&"viewWillAppear:",&"viewWillDisappear:",&"viewDidLoad",&"viewDidAppear:",&"shouldAutorotateToInterfaceOrientation:"]
- 可以看到里面的
返回事件
、登录事件
、声明周期函数
… 都拿到了,拿到之后则可以手动调用了,对象调用方法属性不用教了吧。
// 也支持正则表达式过滤,怎么使用正则筛选取决于你的正则使用水平了 cy# DZMInstanceMethodNames(#0x1121d5d20, /Click/) [&"onResetPhoneClicked:",&"onEditPhoneButtonDidClicked:",&"_passwordLoginButtonDidClicked:",&"phoneNumberViewNextButtonClicked:",&"resendButtonClicked:"]
五、DZMIvarNames(obj, reg)
测试:获取对象的所有成员变量名称
// 也支持正则表达式过滤,怎么使用正则筛选取决于你的正则使用水平了 cy# DZMIvarNames(#0x1121d5d20) // 同样支持正则匹配 cy# DZMIvarNames(#0x1121d5d20, /view/)
六、DZMSublasses(className, reg)
测试:输出指定类型的所有子类,也就是继承这个指定类的所有类列出来
// 列出所有继承 UIViewController 的控制器 cy# DZMSublasses(UIViewController) // 列出所有继承 UINavgationController 的控制器,看有没有自定义导航栏 cy# DZMSublasses(UINavgationController) // 这样可以帮助快速排查找到一些类或者控制器,缩小范围 ....
七、DZMChildVcs(vc)
测试:获取指定控制器里面的所有子控制器,还要其他获取子视图的方法就自己去试试了,例如 DZMSubviews(view)
// 获取根控制器里面的所有子控制器 cy# DZMChildVcs(DZMRootVc())