IOS开发之逆向分析

简介:

首先,本逆向分析是系列文章,会分别从常见的逆向技巧来介绍iOS开发中常见的逆向技术。

网络分析

在逆向过程中很多时候需要分析APP和Web端数据交互的内容那么最简单的方式即是抓包网络分析,而使用Charles、Tcpdump也是逆袭分析最基本的手段。本文以Charles为例来介绍网络相关的内容。

Charles 是在 Mac 下常用的网络封包截取工具,在做 移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。除了在做移动开发中调试端口外,Charles 也可以用于分析第三方应用的通讯协议。配合 Charles 的 SSL 功能,Charles 还可以分析 Https 协议。

Charles 主要的功能包括:

  • 截取 Http 和 Https 网络封包;
  • 支持重发网络请求,方便后端调试;
  • 支持修改网络请求参数;
  • 支持网络请求的截获并动态修改;
  • 支持模拟慢速网络。

Charles安装好后只需自己设置成代理服务器来完成封包的截取,设置也很简单选择菜单中的 “Proxy” –> “Mac OS X Proxy” 来将 Charles 设置成系统代理。
这里写图片描述

这样你就可以看到网络请求出现在 Charles 的界面中,包括你模拟器你的请求也会在这里,那么小伙伴会有疑问iPhone真机设备的网络数据包如何截取呢,也很简单只需将手机的代理服务器设置为电脑IP即可,如下操作

第一步:Charles 的菜单栏上选择 “Proxy”–>“Proxy Settings”,填入代理端口 8888,并且勾上 “Enable transparent HTTP proxying” 就完成了在 Charles 上的设置。
这里写图片描述

第二步:获取Charles 运行所在电脑的 IP 地址,Charles 的顶部菜单的 “Help”–>“Local IP Address”,即可在弹出的对话框中看到 IP 地址,如下图所示:
这里写图片描述

第三步:设置iPhone设备Http代理,在 iPhone 的 “ 设置 ”–>“ 无线局域网 ” 中,点击当前连接的 wifi 名,可以看到当前连接上的 wifi 的详细信息,在其最底部有「HTTP 代理」一项,点击后,然后填上 Charles 运行所在的电脑的 IP,以及端口号 8888,如下图所示:

这里写图片描述

至此所有电脑,模拟器,iOS真机设备所有的Http请求都已经可以通过上边的方法抓包分析获取Request和Respone等具体网络请求数据,可是Https的加密请求如何抓取呢?如果你需要截取分析 Https 协议相关的内容。那么需要安装 Charles 的 CA 证书。具体步骤如下。

第一步:我们需要在你要分析的设备上安装Charles证书。点击 Charles 的顶部菜单,选择 “Help” –> “SSL Proxying” ,–> “Install Charles Root Certificate”安装到Mac上抓取Mac产生的Https请求,Install Charles Root Certificate on a Mobile Device or Remote Browser”安装到iOS 真机设备抓取iOS设备产生的Https请求,如下图所示:
这里写图片描述

第二步:Charles 的菜单栏上选择 “Proxy”–>“SSL Proxy Settings”添加需要抓取的域名,如下图所示:
这里写图片描述

这样就可以分析目标App的所有网络请求,对其进行逆向数据分析,学习下优秀的API设计规范,根据抓包分析的数据格式,通过脚本语言或其他方式伪造网络请求修改数据。比如想自己写个新闻类App就可以抓黄易,某条分析其网络数据,笔者之前分析时记得黄易的接口设计要比某条的清晰明了,然后将就可以在自己的App中使用了。

如果是返回https的接口,可以参考下面的文章:Charles https使用

静态分析

在逆向过程中很多时候仅仅对数据交互的分析并不能看出业务大概实现逻辑,技术方案,这个时候我们就需要静态分析这个App,今天就浅显的讲下如何静态分析目标APP的方法论。

首先分析目标APP我们需要获取Ipa,那么怎么获取呢,上次我逆向冲顶大会后,有小伙伴问,怎么获取Ipa,其实很简单,虽然Itunes 在新版中去掉了AppStore,但我们可以通过其他渠道下载,如PP助手同步推、91等越狱市场下载。以最近很火小佛系游戏旅かえる(旅行青蛙)为例我们直接搜索如下图:
这里写图片描述

获取Ipa文件后,把旅かえる旅行青蛙-1.0.1.ipa 后缀名改为zip,然后解压可以看到iTunesArtwork,iTunesMetadata,META-INF,Payload四个文件,其中iTunesMetadata里边有BundleId,bundleDisplayName,VersionString等等应用相关的信息。

这里写图片描述

Payload里只有一个文件tabikaeru,这个文件也是我们重点要分析的文件,我们直接右键显示,可以看到如下内容,在这里可以看到一些三方库,界面nib文件,图片资源,数据等,其中_Codesignature里边包含了这个包的签名信息,如果我们修改了ipa内部的任一文件重新压缩改为ipa然后安装就会报签名错误,这就是下一节动态分析要用到的技术重签,最重要的可执行文件tabikaeru这个就是所有编译后的二进制代码块。

这里写图片描述

这里简单讲下二进制可执行文件的结构,主要分三部分Object files,Sections,Symbols。其中Object files包括 .o , .framework,.a文件;Sections 对二进制文件进行了一级划分,描述可执行文件全部内容,提供segment,section位置和大小;Symbols 对Section中的各个段进行了二级划分。以下图为例,对于__TEXT __text,表示代码段中的代码内容,其对应地址为0x1000021B0,然后我们拿着这个地址去符号表中查询会发现,这一地址对应的代码0x1000021B0 -[ULWBigResponseButton pointInside:withEvent:],理解了这个过程我们就可以更好的理解反编译的过程,也能理解友盟Crash分析是如何把那些你看不懂的错误信息还原成你看得懂的函数调用栈的过程。

这里写图片描述

其实介绍到这里都还不是静态分析的重点内容,我们是要反编译,反汇编对不对,那么我们把二进制文件直接丢入Hopper disassembler(反编译工具)看下呢,试过的小伙伴肯定要说了,看到一堆没意义的字符,是的,因为开发者将自己的Ipa打包上传后,Apple对Ipa加了一层壳,也就是加固,怎么办呢?有很多方式如Dumpdecrypted,Clutch等工具可以砸壳,特别说明砸壳需要越狱手机,因为要使用SSH连接到手机,这里不对该过程展开说明,需要的同学自行学习,《iOS应用逆向工程》小黄书里边有讲,或者一些博客也有介绍。我在这里介绍另一种获取脱壳Ipa的方式,直接在PP助手搜越狱栏目下的Ipa,就是脱壳的Ipa。

这里写图片描述

如上图我们可以看到游戏是基于Unity3D做的,可以看到定位服务LocationService,SplashScreen业务类,三方库GADSDK三方库等内容,如果要进一步看具体方法实现,就需要读图里的汇编代码了,关于ARM汇编一级的逆向知识就更低层包括ARM指令集,各种寄存器操作等不做展开讨论,另外如果是应用类APP分析到这里,整个APP的头文件就都看到,由于该游戏采用Unity3D引擎C#开发如果反编译C#代码还需要其他工具才能进一步看,这里笔者只是举例,有兴趣的同学可以进一步分析。

最后静态分析在逆向中是非常重要的手段,很多时候我们需要静态分析提供线索,寻找蛛丝马迹,动态分析去论证,多种技术手段互相交替使用,逐步突破,才能一窥究竟,那么我会在下一节中讲解如何动态分析目标APP,如分析UI结构,分析关键技术,或者注入自己的代码改变业务流程,更多骚操作,尽在iOSTips。

附静态分析工具集:

  • Dumpdecrypted:砸壳
  • class-dump-z: 用于简单分析出工程中的头文件和函数名
  • IDA:强大的反编译工具
  • Hopper Disassembler:类似IDA

动态分析

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

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

这里写图片描述

这里写图片描述

通过Hooper发现,和广告相关的代码真多啊,不知道企鹅的程序猿是怎么设计的。
这里写图片描述

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

这里写图片描述

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

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

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

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

通过上图,可以看出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代码,或自定义功能

附:
《iOS Hacker's Handbook》
《iOS应用逆向工程:分析与实战》小黄书
iOSRE 中文逆向论坛

目录
相关文章
|
16天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
10天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
31 9
|
9天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
7天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
10天前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
15天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第31天】在这篇文章中,我们将一起踏上iOS开发的旅程。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。我们将从基础开始,逐步深入到更高级的技术和概念。让我们一起探索iOS开发的世界吧!
|
18天前
|
设计模式 前端开发 Swift
探索iOS开发:从初级到高级的旅程
【10月更文挑战第28天】在这篇技术性文章中,我们将一起踏上一段探索iOS开发的旅程。无论你是刚入门的新手,还是希望提升技能的开发者,这篇文章都将为你提供宝贵的指导和灵感。我们将从基础概念开始,逐步深入到高级主题,如设计模式、性能优化等。通过阅读这篇文章,你将获得一个清晰的学习路径,帮助你在iOS开发领域不断成长。
49 2
|
23天前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
25天前
|
Swift iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】在苹果生态系统中,SwiftUI的引入无疑为iOS应用开发带来了革命性的变化。本文将通过深入浅出的方式,带领读者了解SwiftUI的基本概念、核心优势以及如何在实际项目中运用这一框架。我们将从一个简单的例子开始,逐步深入到更复杂的应用场景,让初学者能够快速上手,同时也为有经验的开发者提供一些深度使用的技巧和策略。
45 1
|
13天前
|
存储 数据可视化 Swift
探索iOS开发之旅:从新手到专家
【10月更文挑战第33天】在这篇文章中,我们将一起踏上一场激动人心的iOS开发之旅。无论你是刚刚入门的新手,还是已经有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技能。我们将从基础的iOS开发概念开始,逐步深入到更复杂的主题,如用户界面设计、数据存储和网络编程等。通过阅读这篇文章,你将获得成为一名优秀iOS开发者所需的全面技能和知识。让我们一起开始吧!