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 中文逆向论坛

目录
相关文章
|
1月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
166 4
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
12天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
100 66
|
27天前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
30 8
|
23天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
27天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
28天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
1月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
39 1
|
1月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
1月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
33 2