Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Xu, Zhaocheng committed Mar 27, 2020
1 parent 6dd55fd commit c7aefb6
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion 2019-12-31-iOS逆向.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ tags:
第一步是得到App的二进制文件,我们可以有很多办法拿到一个iOS App的安装包,最常见的格式是`.ipa`,它相当于一个压缩文件,解压后就能得到一个可执行二进制文件,这个文件往往就是我们编译后得到的文件。<!-- more -->但是所有从App Store上下载的安装包中的可执行文件都是经由Apple的服务器使用Apple的一枚公钥加密过的,私钥存在于每部iOS设备中。所以你有两个选择:1.破解iOS系统获取这枚私钥。2.想其他办法。相信我,你不会去想要尝试第一种办法的,如果是,你也不会来读这篇文章了。所以让我们来换个思路,操作系统内核会加载App的可执行文件,并且会根据标志位判断是否需要解密,如果是加密的可执行文件,系统内核会先对其进行解密,然后交由`dyld`加载进虚拟内存空间,所以最后在内存中的形态肯定是经过解密后的,那么问题就变成了:如何从内存中dump出App的二进制文件?(前者被称为静态脱壳,因为不需要运行程序,后者称为动态脱壳)我们经常看见的“砸壳”做的就是这个事情。要完成这一步骤,有一个大前提,你必须拥有一台越狱后的iOS设备。再者就是需要对iOS App的二进制格式Mach-O有一定的了解。限于篇幅原因,Mach-O文件结构就不在此介绍了。事实上前人已经在这方面做了非常多的工作,有一些优秀的工具可以来使用。

#### dumpdecrypted
[dumpdecrypted](https://github.com/stefanesser/dumpdecrypted)应该是最早的砸壳工具,它的原理用一句话描述来说:在目标App完成加载之后,插入代码导出内存中已经解密的二进制文件,从而达到脱`壳的目的。那么如何找到目标App完成加载后这一时机?如何插入这段代码?如何导出?这些都是问题。
[dumpdecrypted](https://github.com/stefanesser/dumpdecrypted)应该是最早的砸壳工具,它的原理用一句话描述来说:在目标App完成加载之后,插入代码导出内存中已经解密的二进制文件,从而达到脱壳的目的。那么如何找到目标App完成加载后这一时机?如何插入这段代码?如何导出?这些都是问题。
我们知道iOS系统启动App使用的是`dyld`这一系统工具,`dyld`已经开源,我们可以方便的找到源码来研究。具体的细节这儿就不展开了,在这里我们得知道`dyld`加载App时的一个环境变量`DYLD_INSERT_LIBRARIES`,顾名思义,这个环境变量允许我们在App启动时注入第三方lib。那么时机找到了,该如何插入运行我们的代码呢?
要想让一个注入的lib在加载后自动运行代码,我们有以下几种方法:
- 创建一个C++全局对象,在其类的构造函数中的代码添加代码
Expand Down

0 comments on commit c7aefb6

Please sign in to comment.