您的位置:首页 > 移动开发 > IOS开发

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

2015-11-18 16:19 507 查看
我们看待每一样事物,首先看到是其现象,再通过现象切入其本质。一般情况下,一个软件之所以能引起我们的兴趣,无非是两个元素:功能和数据。如果发现了自己感兴趣的功能,但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 还会远吗
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: