iOS逆向过程思考(1)

通过隐藏iOS系统自带APP-Mail底部的编辑按钮对逆向过程的思考

对于APP来说,我们感兴趣的往往体现在UI上,UI展示了函数的执行过程和结果.函数和UI之间的关联非常紧密,如果能够拿到感兴趣的UI对象,就可以找到它对应的函数,我们称该函数为UI函数.在这个过程中,一般是利用Cycript,结合UIView中的神奇私有函数recursiveDescription和UIResponder中的nextResponder来实现的,我们通过隐藏iOS系统自带Mail的底部编辑按钮来试着去找到最终想要的UI函数(操作机型为iPhone4S,越狱iOS8.1系统).

从现象切入APP,找出UI函数

需求:我们想将下图右下角的”邮件编辑”按钮隐藏掉,试着最终找到想要的UI函数

1.用cycript定位Mail的进程并注入(如下图)

2.查看当前界面的UI层次结构,定位到”邮件编辑”按钮

UIView的私有函数recursiveDescription可以返回这个view的UI层次结构.一般来说,当前界面是由至少一个UIWindow构成的,而UIWindow继承自UIView,因此可以利用这个私有函数来查看当前界面的UI层次结构.cy# [[UIApp keyWindow] recursiveDescription]

UIApp[UIApplication sharedApplication]的简写,两者等价,调用上面的方法就可以打印出keyWindow的图层结构,输出下面的信息:

keyWindow的每个subview及二级subview的description会被完整的展示在<······>里,包括每个view的对象的在内存中的地址,frame,bounds,size等信息.其中,缩进表示了层级关系,缩进的多少体现了视图间的关系,同一缩进量的视图是平级的,如最下面的UIScrollView_TabGradientView及UIView;缩进少的视图是缩进多的视图的superview;如UIScrollView_TabGradientView及UIView都是MFTiltedTabView的subview.下面的gif动态图逐步滚动,展示了层级结构缩进及打印的信息,可仔细看一下(如下图:).

通过Cycript的”#”操作符,就可以拿到这个window上的任意view.如:通过tabview = #0x0xxx这种操作方式,能够拿到subview和superview.利用这几个函数,就可以拿到UI上任意的view,为下一步做准备(如下图):

要定位”邮件编辑”按钮,就要寻找与这个按钮的相关的的控件,我们推测是不是底部的label和按钮是在同一个superview下,所以我们应该找到UILabel的text,看看是否有”Updated 3 minutes ago”的字样(我在操作当时,手机邮箱界面显示的是”Updated 3 minutes ago”,这个是动态刷新的,文字会改变).

如上图,我们在某一UILabel中找到了”Updated 3 minutes ago”的字样,现在试着将它隐藏,UILabel是继承自UIView,对于形如<···UIView : viewAddress···>的view来说,我们可以使用[#viewAddress setHidden:YES]函数,来试着将按钮隐藏掉,从上图中我们看到UILbel的父控件是MailStatusUpdateView,我们把MailStatusUpdateView进行setHidden,如果”邮件编辑”按钮是MailStatusUpdateView的子控件,那么按钮也会隐藏掉

在上图第一个灰色方框中,我们操作的是MailStatusUpdateView的内存地址,进行隐藏,但是很遗憾,调用它隐藏的结果是下图这个样子滴,也就是说”邮件编辑”的按钮并不在MailStatusUpdateView下,既不是MailStatusUpdateView的subview.我们将UILabel上的文字还原回来,再继续找.我们再找上一层父控件,即MailStatusUpdateView的superview,我们找到了MailStatusUpdateView的父控件是MailStatusBarView,通过上图的第二个灰色方框进行setHidden操作,很遗憾,结果仍然是下图

试着隐藏他,但是并不受影响,说明MailStatusUpdateView的级别还不够高,那我们继续找MailStatusUpdateView的superview,即UIToolBar,如下图

这次将UIToolBar进行隐藏(请注意对应空间的内存地址,截图顺序有点乱,没有一步一步截图)

这次我们实现了按钮文字全都隐藏了,囧!,我们只是要隐藏一个按钮而已~.~

都隐藏了也好,反正我们都知道”邮件编辑”按钮在UIToolBar下了,那就不要一个找找了,费事~.~,直接拿着[#UIToolBar_Address subviews]看一下他的子控件,我们发现了一个UIToolBarButton,猜想这个button应该是了吧.我们对UIToolBarButton 进行hidden ,这次成功了,至此,我们完成了右下角的”邮件编辑”按钮隐藏,这是一个逆向过程的思考(本步骤请参考上上图)

3.找到”邮件编辑”按钮的UI函数

按钮的UI函数,就是点击它之后响应函数,给UIView对象加上响应函数,一般是通过[UIControl addTatget:action:forEvents:]实现的,而UIControll提供了一个actionForTarget:forControlEvent:方法,来获得这个UIControl的响应函数,基于这个条件,只要定位到的view是UIControl的子类,就可以通过这种方式找到它的响应函数.

因此,按下”邮件编辑”按钮,Mail会调用[ComposeButoonItem _sendAction:withEvent:],我们成功的找到了它的响应函数.完成了用Cycript注入,定位UI控件,找出UI函数.

你可能感兴趣的:(iOS安全,逆向,逆向Mail,iOS逆向)