81

iOS逆向分析之动态分析(三)

 6 years ago
source link: http://mp.weixin.qq.com/s/5dccKE3mcw0JjqvvHnn9gw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

iOS逆向分析之动态分析(三)

Original 老峰 iOSTips 2018-01-31

        动态分析本来是上周日要发的,但是写到第三篇的时候,我开始思考怎样把原理讲的深入浅出,怎样把故事讲的有趣生动,于是本来写好的动态分析又操了重来,那么今天我准备带着问题来讲动态分析,先抛出我们这次逆向的目标,腾讯视频广告移除,以此为例讲解动态分析。

       首先我们进入视频播放页,点击最近的热片《战长沙》,进入详情页如下图,VIP可关闭广告,那么这个详情页肯定会有与与VIP广告相关的业务,我们只要找到对应的ViewController然后丢给Hooper反编译就应该可以看到VIP相关的业务函数。那么怎么知道这一页对应的ViewController呢,有2种办法,一种全局hook viewDidLoad 在这里断点看vc,还有直接看视图堆栈。

Image

      首先我们通过hook viewDidLoad方式书写如下代码,当点击详情时开启断点,可以看到程序被中断,控制台self=QLVideoDetailViewController,我们通过这种方式很容易确定详情播放的控制器为这个类。直接查看UI堆栈发现也是这个类,并且获得了更多信息,可以看到广告相关的View,这里想下下是不可以直接隐藏这个ad view呢?

640?wx_fmt=jpeg
640?wx_fmt=jpeg

       先不猜了,去Hooper里看下这个类到底有哪些相关的方法,这里要用到iOS逆向分析之静态分析(二)介绍的内容,这里不做重复,丢进去就惊呆了,尼玛这方法真吉尔多,我这里只贴一屏与广告相关的,但是仔细分析后并没什么卵用。

640?wx_fmt=jpeg

          通过上面静态分析的内容并不能提供明显的思路让我去广告,我准备回到UI堆栈那里,我在这里发现了QNBPlayerVideoAdsViewController,看名字就知道播广告的,邪恶的笑下,鹅肠同学名字起得真是清晰明了,这次试一下直接hide这个控制器看广告会不会消失。

640?wx_fmt=jpeg

          我写了如下代码以后,很暴力直接隐藏了广告视图,发现广告会消失一会儿,然后又显示,经过静态分析发现QNBPlayerVideoAdsViewController这个类里边有adsStartPlay,那我更暴力一点,在这个方法里只要你播广告我就影藏这个view,command r运行,看电视剧,妥妥的没广告了,最终代码如下。

640?wx_fmt=jpeg

       故事讲到这里算是讲完了,有兴趣的同学可以进一步研究vip付费视频如何直接看,整体而言,这次分析的过程比较顺利,我们可以看到在逆向过程中是动态,静态分析结合相互提供线索一步步逼近真相,我们现在复盘,通过复盘来来解密我们使用的工具,以及这些工具背后的原理。

       我们这次动态分析使用的是IPAPatch,和这个类似的有AloneMonkey的MonkeyDev,这俩库原理类似核心思想都是将我们自己写的代码编成动态库注入目标App,然后重签,作为一个有情怀的开发者,仅仅会使用工具肯定不是我们的目标对不对,我们要做的是探究这个过程是如何实现的,这里我抛出几个问题动态库是如何注入的?App重签名的过程是怎样的?今天我们大概简单聊聊有个印象,这些内容每一个点都很重要,都是逆向的基础知识,虽然枯燥但是,但可以让你更好的理解这些原理。

       如果要理解动态库注入那还需要更深入的理解Mach-o的文件结构,我在上篇文章中简单讲了下,这里再详细的讲下,一个典型的Mach-O文件格式如图所示

640?wx_fmt=jpeg

通过上图,可以看出Mach-O主要由以下三部分组成:

  • Mach-O头部(mach header)。描述了Mach-O的cpu架构、文件类型以及加载命令等信息。

  • 加载命令(load command)。描述了文件中数据的具体组织结构,不同的数据类型使用不同的加载命令表示。

  • Data。Data中的每个段(segment)的数据都保存在这里,段的概念与ELF文件中段的概念类似。每个段都有一个或多个Section,它们存放了具体的数据与代码。

二进制当中所有引用到的动态库都放在Load commands段当中,那么我们只要,通过给这个段增加记录,就可以注入我们自己写的动态库了,对不对。那么问题来了,在这里插入我们自己的动态库有什么用?我们自己写的代码没有执行的入口,一样什么都不能干,我们还需要一个”main”函数来执行我们自己的代码,不要忘了,这个”main”函数在oc里面称为构造函数,只要在函数前声明 “attribute((constructor)) static” 即可,这样你的代码就可以被目标APP执行了。

关于重签名,有兴趣的同学可以学习下整个签名过程,包括代码如何签名,证书如何校验等,重签名大概过程如下,

1、解压ipa安装包 cp test.ipa olinone.zip

2、替换证书配置文件(文件名必须为embedded)

cp embedded.mobileprovision Payload/test.app

3、重签名(certifierName为重签名证书文件名,可以加证书ID后缀)

certifierName="iPhone Distribution: olinone Information Technology Limited(6a5LOVE58MYX)"

codesign -f -s $certifierName  --entitlements entitlements.plist Payload/test.app

4、打包 zip -r test.ipa Payload

      至此逆向系列的入门教程已经全部更完,现在应该拿到一个App应该已经可以自己玩了,篇幅有限,有很多内容不能展开讲,也没讲到,比如有攻就有防,了解防才可以更好的绕过,如何为自己的App加固,再比如一些细节符号表是怎样恢复的,砸壳的原理到底是怎样的,这些有趣的话题我们只能后边再聊,更多骚操作,尽在iOSTips,关注公众号,第一时间get新姿势。

附静态分析工具集:

  •         Dumpdecrypted:砸壳

  • class-dump-z: 用于简单分析出工程中的头文件和函数名

  • IDA:强大的反编译工具

  • Hopper Disassembler:类似IDA

附动态分析工具集:

  •         IPAPatch,MonkeyDev:

  • Reveal 界面分析

  •         CaptainHook,Tweak 编写hook代码,或自定义功能

附逆向相关资料 :       


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK