转:http://book.51cto.com/art/201504/472957.htm
3.4.3 IDA分析示例
说了IDA的这么多使用方法,下面用一个简单的例子向大家演示IDA的威力。越狱iOS的用户都知道,在Cydia中安装完一个tweak后,Cydia会建议我们“Restart SpringBoard”,那么这个respring的操作是如何实现的呢?请大家快速浏览3.5节,用iFunBox将iOS中的“/System/Library/CoreServices/SpringBoard.app/SpringBoard”拷贝到
OSX中,并用IDA打开它,等待初始分析结束后在Function window里搜索“relaunch SpringBoard”,定位到这个函数,双击跳转到它的实现代码中,如图3-47所示。
可以看到,这个函数的实现流程既简单又清晰。根据从上到下的执行顺序,首先调用beginIgnoringInteractionEvents,开始忽略所有用户交互事件;然后调用hideSpringBoardStatusBar来隐藏状态栏;接着连续执行2个subroutine,分别是sub_35D2C和sub_350B8。接下来,双击sub_35D2C,跳转到它的实现,看看它做了什么,如图3-48所示。
在图3-48中,一眼就能看到好多含有“log”字样的关键词,先“initialize”,然后判断是否“enabled”,最后“log”。稍微懂一点英语的朋友都能猜到,sub_35D2C的作用是将respring的一些操作记录下来,与respring的主体功能无关。点击IDA菜单栏上的蓝色后退按钮(如图3-49所示),或直接按ESC,回退到relaunchSpringBoard函数体中,继续往下分析。
双击sub_350B8,跳转到如图3-50所示的界面。
从图3-50可以看到,这个subroutine只是在为调用sub_350C4作一些准备工作而已。双击sub_350C4,跳转到它的实现,你会发现sub_350C4的上半部分与图3-48所示的sub_35D2C非常类似,都只是做了一些操作记录。但与sub_35D2C不同的是,sub_350C4还做了一些实际工作,如图3-51所示。
我们现在还不了解汇编语言,只能大致浏览一下这些关键词,不过,可以猜测出这个subroutine的作用是生成一个名为“TerminateApplicationGroup”的事件,指定其处理方法为sub_351F8,然后把生成的事件加入一个处理队列里,并依次处理队列里的事件,从而关掉所有的App——商城关门之前,要关闭里面的所有店铺;respring之前,自然也要关掉所有的App。现在去看看sub_351F8的实现,如图3-52所示。
从BKSTerminateApplicationGroupForReasonAndReportWithDescription的名字来看,其作用已经很明显了,它印证了刚刚对sub_350C4的分析。再次回退到relaunchSpringBoard函数体里,到这里,分析已经接近尾声了:函数调用_relaunchSpringBoardNow,完成respring操作。
不需要了解汇编代码,也不用熟悉调用规则,我们以几乎零基础的水平成功完成了这次逆向工程,不是吗?当然,这不能说明我们的水平有多么高深,而是提醒我们应该为拥有IDA这样强大且免费的神器感到幸运,从而激励我们加倍努力。在绝大多数情况下,对IDA的使用跟上面的示例没有本质区别,你只需要耐着性子,仔细咀嚼IDA呈现出的每一行代码,要不了多久,你就会深切感受到逆向工程的艺术之美。
IDA的用法远不止本节所示的这么简单,如果你在使用过程中有任何疑问,都欢迎来http://bbs.iosre.com讨论交流。
联系客服