iOS应用逆向工程(五):利用Cycript 定位目标函数

原创 2015年11月18日 16:19:40

我们看待每一样事物,首先看到是其现象,再通过现象切入其本质。一般情况下,一个软件之所以能引起我们的兴趣,无非是两个元素:功能和数据。如果发现了自己感兴趣的功能,但class-dump的头文件找不到可疑的关键词,怎么办。如果发现了我们感兴趣的数据,如何获取呢。我们知道,从appstore 下载下来的app都是经过加密的。class-dump 是没有办法破解的。因此,我们就要需找更加高级的工具。Cycript! ,这个在上一篇已经介绍过,但那只是他的一部分功能。

首先从现象切入app,找出UI函数

先以mail为例

# ps -e |grep Application

  672 ??         0:00.55 /private/var/db/stash/_.gcvMBl/Applications/MobileCal.app/PlugIns/CalendarWidget.appex/CalendarWidget

  674 ??         0:19.62 /private/var/db/stash/_.gcvMBl/Applications/Stocks.app/PlugIns/StocksWidget.appex/StocksWidget

  762 ??         0:39.44 /Applications/MobileMail.app/MobileMail


看到了这个 MobileMail 了吧,若果不确定,验证一下。

# kill -9 762


看看mobilemail是不是闪退了

然后查看当前界面的UI层次架构,定位“编写邮件”按钮

我们知道苹果有很多私有函数在正向开发中是不让用的,这些私有函数就有一个recurisveDecription ,这个函数可疑返回这个View 的UI层次结构,下面我们就来用用。

# cycript -p MobileMail

cy# ?expand

expand == true

cy# [[UIApp keyWindow]recursiveDescription]

@"<UIWindow: 0x16546a20; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0x1654ab40>; layer = <UIWindowLayer: 0x166b7230>>


以上UIApp  是[UIApplication sharedApplication]  的简写

cy# [[[UIApplication sharedApplication]keyWindow]recursiveDescription]

@"<UIWindow: 0x16546a20; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0x1654ab40>; layer = <UIWindowLayer: 0x166b7230>>

..........

  |    | <MFTiltedTabView: 0x16643d30; frame = (0 0; 320 480); userInteractionEnabled = NO; gestureRecognizers = <NSArray: 0x1652d200>; layer = <CALayer: 0x16643ba0>>

   |    |    | <UIScrollView: 0x166438b0; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0x1652e960>; layer = <CALayer: 0x16643720>; contentOffset: {0, 0}; contentSize: {320, 77.5}>

   |    |    | <_TabGradientView: 0x1652e3f0; frame = (-320 -420; 960 480); alpha = 0; userInteractionEnabled = NO; layer = <CAGradientLayer: 0x1652e170>>

   |    |    | <UIView: 0x1652d550; frame = (-10000 480; 10320 10000); layer = <CALayer: 0x1652d520>>"



两者是等价的

输出了一大串东西,看着头晕。但仔细一看,可疑看出来keyWindow  的每个subview 及二级subview 的description  会被完整的展示在<......>中,包括每个view 对象在内存中的地址,以及它的坐标。尺寸等基本信息,其中缩进的多少体现了视图之间的父子关系。同一缩进量的视图是平级的。

这样,通过cycript  可以拿到所有的window

cy# tableView = #0x16643d30

#"<MFTiltedTabView: 0x16643d30; frame = (0 0; 320 480); userInteractionEnabled = NO; gestureRecognizers = <NSArray: 0x1652d200>; layer = <CALayer: 0x16643ba0>>"

cy# [#0x16643d30 subviews]

@[#"<UIScrollView: 0x166438b0; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0x1652e960>; layer = <CALayer: 0x16643720>; contentOffset: {0, 0}; contentSize: {320, 77.5}>",#"<_TabGradientView: 0x1652e3f0; frame = (-320 -420; 960 480); alpha = 0; userInteractionEnabled = NO; layer = <CAGradientLayer: 0x1652e170>>",#"<UIView: 0x1652d550; frame = (-10000 480; 10320 10000); layer = <CALayer: 0x1652d520>>"]


我们可以看到这行

<MailStatusBarView: 0x16522570; frame = (69 0; 182 44); opaque = NO; autoresize = BM; layer = <CALayer: 0x165223e0>>


cy# [#0x16522570 setHidden:YES]

cy# [#0x16522570 setHidden:NO]

 分别执行这两行代码,执行第一行后可以发现,下边那行“Update 3 minutes ago” 不见了

然后在执行下面这行,可以发现,“Update 3 minutes ago”又出现了

再来看看

<UIToolbar: 0x1653d940; frame = (0 436; 320 44); opaque = NO; autoresize = W+TM; layer = <CALayer: 0x165e6320>>


这个大家都熟悉,我们试着隐藏它

cy# [#0x1653d940 setHidden:YES]

cy# [#0x1653d940 setHidden:NO]


<UILabel: 0x166b9350; frame = (55 12; 43 20.5); text = 'Inbox'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x17854800>>


cy# #0x166b9350.text = @"test"

@"test"

再看看你的mail 里有什么变化


同样可以隐藏掉,这样我们可以对这个app  的UI  基本上完全掌握了

当然,我们这么大费周章,仅仅只是为了了解这个app  的UI层次结构吗?当然不是。

按照MVC 设计标准,M代表model,即数据源,是未知的,这也是我们感兴趣的。V代表view,C代表controller 也是未知的。M和V 之间没有直接联系,而C既可以访问M 也可以访问V ,是M和V  的交流中枢。如果利用已知的V 获得C ,不就可以访问M了吗。nextResponder 就出场了。

cy# [#0x166b9350 nextResponder]

#"<UITableViewCellContentView: 0x166371f0; frame = (0 0; 286 44); gestureRecognizers = <NSArray: 0x16636b80>; layer = <CALayer: 0x16637260>>"

cy# [#0x166371f0 nextResponder]

#"<MailboxTableCell: 0x17852970; baseClass = UITableViewCell; frame = (0 28; 320 44.5); autoresize = W; layer = <CALayer: 0x166a88b0>>"

cy# [#0x17852970 nextResponder]

#"<UITableViewWrapperView: 0x16528ac0; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0x16528770>; layer = <CALayer: 0x16528930>; contentOffset: {0, 0}; contentSize: {320, 480}>"

cy# [#0x16528ac0 nextResponder]

#"<UITableView: 0x168f2200; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x165290d0>; layer = <CALayer: 0x165295d0>; contentOffset: {0, -64}; contentSize: {320, 504.5}>"

cy# [#0x168f2200 nextResponder]

#"<MailboxPickerController: 0x16547490>"

这样我们通过刚才的UILabel获取到controller

今天先到这吧,拿到C ,获取M 还会远吗
























iOS应用程序安全(5)-用Cycript做运行时分析的高级技巧(Yahoo天气应用)

http://wufawei.com/2013/11/ios-application-security-5/ 作者:Prateek Gianchandani 译者:吴发伟 原文网址:...

iOS逆向入门实践 — 逆向微信,伪装定位(二)

1. 创建工程 还是跟之前的步骤一致,创建工程,然后配置 Makefile。注意创建工程时名字只能包含数字跟字母。 Makefile 上面引入的 FakeWeChatLo...

iOS逆向入门实践 — 逆向微信,伪装定位(一)

ios微信定位,tweak, ios reverse
  • HK_5788
  • HK_5788
  • 2016年09月14日 16:16
  • 6138

cycript工具的简单使用

1、cycript       官网:http://www.cycript.org/       越狱的设备,在cydia中将自动安装这个插件。          2、设备环境        ma...
  • HK_5788
  • HK_5788
  • 2016年08月21日 20:36
  • 2083

iOS运行时工具-cycript

cycript是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在运行时查看和修改应用。...

iOS应用逆向工程(四):利用Cycript 操作运行时

今天来介绍攻击iOS软件的好工具:Cycript。 Cycript 是由saurik 推出的一款脚本语言,介于Object-C 和javascript 之间的编程语言。Cycript工具完全兼容jav...

Cycript基本语法与使用-iOS逆向工程

Cycript基本语法与使用-iOS逆向工程

iOS逆向工程(简单利用"dumpdecrypted"给ipa砸壳)

iOS逆向工程(简单利用"dumpdecrypted"给ipa砸壳) 网上找了好多教程,都是巨坑,还是这个好文解决了我的问题,给大家分享出来 一、前提介绍 1,有些从 APPStore ...
  • App_IOS
  • App_IOS
  • 2016年09月19日 10:46
  • 2961

iOS应用程序安全(2)-获得iOS应用程序的类信息

http://wufawei.com/2013/11/ios-application-security-2/ 作者:Prateek Gianchandani 译者:吴发伟 原文网址:ht...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS应用逆向工程(五):利用Cycript 定位目标函数
举报原因:
原因补充:

(最多只允许输入30个字)