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

来源:互联网 发布:apple淘宝旗舰店 编辑:程序博客网 时间:2024/05/02 05:05

我们看待每一样事物,首先看到是其现象,再通过现象切入其本质。一般情况下,一个软件之所以能引起我们的兴趣,无非是两个元素:功能和数据。如果发现了自己感兴趣的功能,但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 还会远吗
























0 0
原创粉丝点击