iOS逆向学习~Mach-O(2)

综合技术 2018-03-14

逆向学习,咱先简单了解一下app 从开发到安装到手机上是怎么一个过程。平时咱开发,有代码、有图片、有storyboard、有xib、有plist等等。一般情况下要经历 编译、链接、签名,这些操作做完后就会变成.app包。然回就会在Xcode的内容区(content area)的 Products 文件夹下有一个app包文件。代码、图片等等资源都在这个app包里面。

有了app后就要做一个zip压缩,变成ipa文件,然后就可以安装到咱手机上了。

app怎么变成ipa文件呢?其实很简单,先建一个 Payload 文件夹,然后将 app 拖到 Payload 文件夹中,然后压缩一下 Payload 文件夹,再把文件名后缀改为 ipa 就好了。然后怎么安装到手机上呢,一种方式就是上传到App store,然后用户再从App Store下载就好了。还有一种方式可以通过PP助手、iFunBox、Xcode等工具安装。当然了,这么做有个前提条件,那就是要在Xcode的 Scheme menu 里选择真机设备, Edit Scheme->Run->Info->Build configuration 改成 Release ,然后选中工程, TARGETS->General->Siging 里配上你的证书, command+b 编译一下,这种状态下的app包才能安装,因为有证书签名。

在app包里会有一个种类为 Unix executable 的文件(一般文件名和app包名相同),这个文件就是iOS里面的一个可执行文件,代码就都在这个文件里(动态库另说)。这个文件的格式就是 Mach-O

逆向app,一般是先用 CycriptReveal 做界面分析,然后就是对 Mach-O 文件做代码的静态分析.就是不运行app,直接看代码,这个时候,还是需要借助一些工具比如说, MachOView 或者 MachOExplorerclass-dumpHopper disassemblerida 等,再然后就是动态调试,让app运行起来,在内存中进一步确定它代码的执行流程,这个过程借助到的工具就是 debugserverLLDB ,最后就是编写咱自己的代码,注入到app中,必要时还可能需要重新签名打包 ipa

class-dump 应用

下面下载 class-dump http://stevenygard.com/projects/class-dump/

class-dump 的作用就是把 Mach-O 文件的 class 信息给dump出来,生成对应的.h头文件(只能生成头文件)。

下载完成后,将 class-dump 文件拖到电脑的 /usr/local/bin/ 文件夹下,然后在终端敲 class-dump 命令才会识别。

class-dump -H Mach-O文件 -o 头文件存放目录

命令执行完后就会在目录里看到一大堆头文件,可以用 Sublime Text 等工具查看。(做练习的时候可以用咱自己编译的app,或者是从pp助手等第三方下载的app)

代码是怎么变成 Mach-O 文件呢?简单说就是代码语言编译成汇编语言,然后汇编语言编译成机器语言。 Mach-O 文件用 Hex Fiend 打开,看到的16进制就有一部分是机器语言,还有一些符号表等。

我觉得能通过 Mach-O 做代码分析代码的一个重要原因就是机器语言可以反推成汇编语言,是可逆的。原因就是在同一种架构平台下,每一条汇编指令都有与之对应的唯一的机器指令,这种反推行为一般叫反编译。但是 汇编语言不能百分百反推oc等高级语言,因为有些不同但相似的代码,编译成汇编语言是一模一样的。比如具有相同元素的结构体和数组,编译后汇编语言就是一样的。所以说不能百分百还原,但是因为部分代码还是相似的,所以还是可以看个大概的。下面咱就借助 Hopper disassembler 工具将 Mach-O 文件的机器语言代码反编译成汇编代码、OC伪代码或者Swift伪代码。

Mach-O 文件拖到 Hopper disassembler 软件中心区域就会打开该文件,如果该 Mach-O 是通用二进制文件( FAT archive ),会让你选择参数 AArch64 或者 ARM v7s ,这是 cpu 架构,选择任何一个都可以,我选的是 AArch64

上面的图我打开的是手机上的 UIKitMach-O ,通过文章 iOS逆向学习之UIKit框架的Mach-O文件查找 找到的。

简单介绍一下上图中显示的内容

在左边的控制面板中,可以通过字符串搜索字段,函数名类名等等.

控制面板上面的导航条不同颜色代表了不同的含义

逆向学习,咱先简单了解一下app 从开发到安装到手机上是怎么一个过程。平时咱开发,有代码、有图片、有storyboard、有xib、有plist等等。一般情况下要经历 编译、链接、签名,这些操作做完后就会变成.app包。然回就会在Xcode的内容区(content area)的 Products 文件夹下有一个app包文件。代码、图片等等资源都在这个app包里面。

有了app后就要做一个zip压缩,变成ipa文件,然后就可以安装到咱手机上了。

app怎么变成ipa文件呢?其实很简单,先建一个 Payload 文件夹,然后将 app 拖到 Payload 文件夹中,然后压缩一下 Payload 文件夹,再把文件名后缀改为 ipa 就好了。然后怎么安装到手机上呢,一种方式就是上传到App store,然后用户再从App Store下载就好了。还有一种方式可以通过PP助手、iFunBox、Xcode等工具安装。当然了,这么做有个前提条件,那就是要在Xcode的 Scheme menu 里选择真机设备, Edit Scheme->Run->Info->Build configuration 改成 Release ,然后选中工程, TARGETS->General->Siging 里配上你的证书, command+b 编译一下,这种状态下的app包才能安装,因为有证书签名。

在app包里会有一个种类为 Unix executable 的文件(一般文件名和app包名相同),这个文件就是iOS里面的一个可执行文件,代码就都在这个文件里(动态库另说)。这个文件的格式就是 Mach-O

逆向app,一般是先用 CycriptReveal 做界面分析,然后就是对 Mach-O 文件做代码的静态分析.就是不运行app,直接看代码,这个时候,还是需要借助一些工具比如说, MachOView 或者 MachOExplorerclass-dumpHopper disassemblerida 等,再然后就是动态调试,让app运行起来,在内存中进一步确定它代码的执行流程,这个过程借助到的工具就是 debugserverLLDB ,最后就是编写咱自己的代码,注入到app中,必要时还可能需要重新签名打包 ipa

class-dump 应用

下面下载 class-dump http://stevenygard.com/projects/class-dump/

class-dump 的作用就是把 Mach-O 文件的 class 信息给dump出来,生成对应的.h头文件(只能生成头文件)。

下载完成后,将 class-dump 文件拖到电脑的 /usr/local/bin/ 文件夹下,然后在终端敲 class-dump 命令才会识别。

class-dump -H Mach-O文件 -o 头文件存放目录

命令执行完后就会在目录里看到一大堆头文件,可以用 Sublime Text 等工具查看。(做练习的时候可以用咱自己编译的app,或者是从pp助手等第三方下载的app)

代码是怎么变成 Mach-O 文件呢?简单说就是代码语言编译成汇编语言,然后汇编语言编译成机器语言。 Mach-O 文件用 Hex Fiend 打开,看到的16进制就有一部分是机器语言,还有一些符号表等。

我觉得能通过 Mach-O 做代码分析代码的一个重要原因就是机器语言可以反推成汇编语言,是可逆的。原因就是在同一种架构平台下,每一条汇编指令都有与之对应的唯一的机器指令,这种反推行为一般叫反编译。但是 汇编语言不能百分百反推oc等高级语言,因为有些不同但相似的代码,编译成汇编语言是一模一样的。比如具有相同元素的结构体和数组,编译后汇编语言就是一样的。所以说不能百分百还原,但是因为部分代码还是相似的,所以还是可以看个大概的。下面咱就借助 Hopper disassembler 工具将 Mach-O 文件的机器语言代码反编译成汇编代码、OC伪代码或者Swift伪代码。

Mach-O 文件拖到 Hopper disassembler 软件中心区域就会打开该文件,如果该 Mach-O 是通用二进制文件( FAT archive ),会让你选择参数 AArch64 或者 ARM v7s ,这是 cpu 架构,选择任何一个都可以,我选的是 AArch64

上面的图我打开的是手机上的 UIKitMach-O ,通过文章 iOS逆向学习之UIKit框架的Mach-O文件查找 找到的。

简单介绍一下上图中显示的内容

在左边的控制面板中,可以通过字符串搜索字段,函数名类名等等.

控制面板上面的导航条不同颜色代表了不同的含义

  • 蓝色 部分表示代码(code)
  • 黄色 部分表示程序(procedure)
  • 绿色 部分表示ASCII字符串(string)
  • 紫色 部分表示数据(data)
  • 灰色 部分是不能识别的类型 红色小箭头表示当前你的光标所在的位置

导航条上面 Transformations 上的 DACPU 的意思是

  • Data :当Hopper认为数据中的一块区域表示常量的时候,这块区域将被设置为data(数据)类型。例如一段int数组,这样的情况就会被设置。
  • ASCII : 一个以空值为终止的C字符串。
  • Code :一个指令。
  • Procedure (程序):一旦确定它是由Hopper重新构建的函数的一部分,则该字节接受该类型。
  • Undefined (无法识别):这是目前为止还未被Hopper探索的一块区域。

D 按键不断点击,在汇编代码区会有不同的变化

再右边的 View Mode 的4个按钮代表了4种不同的显示方式依次为

汇编模式控制浮动图表模式伪代码模式十六进制模式

上图是 汇编模式 ,下面的图是 伪代码模式 ,功能上相当于原始的CPU指令,但是它们更像是Objective-C的函数。

在第一个张图 汇编模式 下,将鼠标放在 [UIViewController loadView] 处单击右键,选择 references to selector loadView ,就可以看到哪些函数引用了该函数。

我选择 [UIViewController loadViewIfRequired] ,然后再向上找到 loadViewIfRequired 再右击选择 references to selector loadViewIfRequired ,就会发现是 [UIViewController view] 调用了该函数。

目前咱就知道简单的函数调用顺序是 [UIViewController view] -> [UIViewController loadViewIfRequired] -> [UIViewController loadView]
,然后再结合 class-dumpCycript 是不是就能做些什么呢?

逆向学习,咱先简单了解一下app 从开发到安装到手机上是怎么一个过程。平时咱开发,有代码、有图片、有storyboard、有xib、有plist等等。一般情况下要经历 编译、链接、签名,这些操作做完后就会变成.app包。然回就会在Xcode的内容区(content area)的 Products 文件夹下有一个app包文件。代码、图片等等资源都在这个app包里面。

有了app后就要做一个zip压缩,变成ipa文件,然后就可以安装到咱手机上了。

app怎么变成ipa文件呢?其实很简单,先建一个 Payload 文件夹,然后将 app 拖到 Payload 文件夹中,然后压缩一下 Payload 文件夹,再把文件名后缀改为 ipa 就好了。然后怎么安装到手机上呢,一种方式就是上传到App store,然后用户再从App Store下载就好了。还有一种方式可以通过PP助手、iFunBox、Xcode等工具安装。当然了,这么做有个前提条件,那就是要在Xcode的 Scheme menu 里选择真机设备, Edit Scheme->Run->Info->Build configuration 改成 Release ,然后选中工程, TARGETS->General->Siging 里配上你的证书, command+b 编译一下,这种状态下的app包才能安装,因为有证书签名。

在app包里会有一个种类为 Unix executable 的文件(一般文件名和app包名相同),这个文件就是iOS里面的一个可执行文件,代码就都在这个文件里(动态库另说)。这个文件的格式就是 Mach-O

逆向app,一般是先用 CycriptReveal 做界面分析,然后就是对 Mach-O 文件做代码的静态分析.就是不运行app,直接看代码,这个时候,还是需要借助一些工具比如说, MachOView 或者 MachOExplorerclass-dumpHopper disassemblerida 等,再然后就是动态调试,让app运行起来,在内存中进一步确定它代码的执行流程,这个过程借助到的工具就是 debugserverLLDB ,最后就是编写咱自己的代码,注入到app中,必要时还可能需要重新签名打包 ipa

class-dump 应用

下面下载 class-dump http://stevenygard.com/projects/class-dump/

class-dump 的作用就是把 Mach-O 文件的 class 信息给dump出来,生成对应的.h头文件(只能生成头文件)。

下载完成后,将 class-dump 文件拖到电脑的 /usr/local/bin/ 文件夹下,然后在终端敲 class-dump 命令才会识别。

class-dump -H Mach-O文件 -o 头文件存放目录

命令执行完后就会在目录里看到一大堆头文件,可以用 Sublime Text 等工具查看。(做练习的时候可以用咱自己编译的app,或者是从pp助手等第三方下载的app)

代码是怎么变成 Mach-O 文件呢?简单说就是代码语言编译成汇编语言,然后汇编语言编译成机器语言。 Mach-O 文件用 Hex Fiend 打开,看到的16进制就有一部分是机器语言,还有一些符号表等。

我觉得能通过 Mach-O 做代码分析代码的一个重要原因就是机器语言可以反推成汇编语言,是可逆的。原因就是在同一种架构平台下,每一条汇编指令都有与之对应的唯一的机器指令,这种反推行为一般叫反编译。但是 汇编语言不能百分百反推oc等高级语言,因为有些不同但相似的代码,编译成汇编语言是一模一样的。比如具有相同元素的结构体和数组,编译后汇编语言就是一样的。所以说不能百分百还原,但是因为部分代码还是相似的,所以还是可以看个大概的。下面咱就借助 Hopper disassembler 工具将 Mach-O 文件的机器语言代码反编译成汇编代码、OC伪代码或者Swift伪代码。

Mach-O 文件拖到 Hopper disassembler 软件中心区域就会打开该文件,如果该 Mach-O 是通用二进制文件( FAT archive ),会让你选择参数 AArch64 或者 ARM v7s ,这是 cpu 架构,选择任何一个都可以,我选的是 AArch64

上面的图我打开的是手机上的 UIKitMach-O ,通过文章 iOS逆向学习之UIKit框架的Mach-O文件查找 找到的。

简单介绍一下上图中显示的内容

在左边的控制面板中,可以通过字符串搜索字段,函数名类名等等.

控制面板上面的导航条不同颜色代表了不同的含义

  • 蓝色 部分表示代码(code)
  • 黄色 部分表示程序(procedure)
  • 绿色 部分表示ASCII字符串(string)
  • 紫色 部分表示数据(data)
  • 灰色 部分是不能识别的类型 红色小箭头表示当前你的光标所在的位置

导航条上面 Transformations 上的 DACPU 的意思是

  • Data :当Hopper认为数据中的一块区域表示常量的时候,这块区域将被设置为data(数据)类型。例如一段int数组,这样的情况就会被设置。
  • ASCII : 一个以空值为终止的C字符串。
  • Code :一个指令。
  • Procedure (程序):一旦确定它是由Hopper重新构建的函数的一部分,则该字节接受该类型。
  • Undefined (无法识别):这是目前为止还未被Hopper探索的一块区域。

D 按键不断点击,在汇编代码区会有不同的变化

再右边的 View Mode 的4个按钮代表了4种不同的显示方式依次为

汇编模式控制浮动图表模式伪代码模式十六进制模式

上图是 汇编模式 ,下面的图是 伪代码模式 ,功能上相当于原始的CPU指令,但是它们更像是Objective-C的函数。

在第一个张图 汇编模式 下,将鼠标放在 [UIViewController loadView] 处单击右键,选择 references to selector loadView ,就可以看到哪些函数引用了该函数。

我选择 [UIViewController loadViewIfRequired] ,然后再向上找到 loadViewIfRequired 再右击选择 references to selector loadViewIfRequired ,就会发现是 [UIViewController view] 调用了该函数。

目前咱就知道简单的函数调用顺序是 [UIViewController view] -> [UIViewController loadViewIfRequired] -> [UIViewController loadView]
,然后再结合 class-dumpCycript 是不是就能做些什么呢?

您可能感兴趣的

iOS自定义代码块(快速开发) 在工程中选中代码,用鼠标左键拖到 下图中指示的代码片段在Xcode中的区域里,就新建了一个代码片段 代码块 松开鼠标左键的同时,会弹出代码片段编辑窗口,如下图所示: 编辑代码块 图中从上到下的含义依...
iOS 判断当前网络状态的三种方法 在项目中,为了好的用户体验,有些场景必须线判断网络状态,然后才能决定改干嘛。比如视频播放,需要线判断是Wifi还是4G,Wifi直接播放,4G先提示用户。获取网络状态的方法大概有三种: 1. Reachability 这是苹果的官方演示demo中使用到的方法,我们可以到苹果官方文档里 ...
IPhone sdk Tool Tip Compile my source code using iphone sdk without xcode ide I hope to compile my source codes using iphone sdk, but I do not hope ...
iOS 真机调试如何安装 WebDriverAgent 近期,微信 跳一跳外挂 火了,看了作者的思路和教程,感觉挺简单,不过在实现(照葫芦画瓢)的过程中,遭遇到不少问题。 其中之一便是,真机调试 WDA,参考 iOS 真机如何安装 WebDriverAgent · TesterHome ,下面就按照这篇教程,各...
OpenGL ES on iOS — 坐标系统与矩阵转换... 本文记录我记录我学习 坐标体系和矩阵转换的过程,加深学习便于后续查询,可能有些描述不够准确,或者内容不够充实,还请多多指正,共同学习 矩阵变换 我们将物体坐标进行一系列变换,达到自己期望的位置,需要使用到矩阵.先说一下矩阵的公式.这里我是本着了解的心态去学习的,因为已经有趁手的数学工具了,把...