iOS 逆向编程(十六)DZMCycript 脚本使用(封装了常用的快捷函数,后续会继续添加)

// 进入软件监听调试环境

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)

总结

面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。

万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

前端面试题汇总

JavaScript

前端资料汇总

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值