1、前言
提到iOS逆向,网上的文章铺天盖地,创作时间从2014年到2019年不等。绝大部分的工具或命令都过时了。书籍更不用说。
我刚刚结束了为期1月的零基础iOS逆向研究,现已经成功逆向了微信的一些稍复杂逻辑(复杂主要是因为我想hook的功能,微信有个小bug)。现在分享一下我的一些学习路线和心得。
- 郑重声明:本次逆向仅限于对iOS底层知识的学习,无任何恶意行为
2、工具篇
2.1 MonkeyDev 逆向集成环境
工欲善其事 必先利其器
iOS后起之秀AloneMonkey在旧的逆向集成环境iOSOpenDev的基础上,进行了升级。变成了一款非越狱插件开发集成神器:MonkeyDev,它提供了我们一个像开发普通iOS应用一样简单的开发平台。
源码地址
安装和使用方法请看这里
我们先看一眼项目的创建:
再来看一眼project结构目录:
只需要拖入一个砸壳的应用即可。关于如何砸壳,这不是逆向的重点,所以本篇不教,有兴趣的同学可以自行查资料解决。可以先到PP助手的应用商店下载脱壳应用。
该平台集成了以下hook工具:
CaptainHook:
利用c语言构造器 & dyld加载原理和时机,hook目标函数. CaptainHook基本原理
fishhook:
FaceBook出品,通过动态修改Mach-O(后面会提到该文件)懒加载、非懒加载函数表指针的途径,达到hook的功能 fishhook原理 & Mach-O动态加载过程
theos:
引擎会把logos语法写的.xm文件,利用fishhook工具,编译成.mm(纯c++函数)文件,加载到动态库。
MonkeyDev动态库注入原理
前面提到了,我们的代码都被做成动态库了,动态库要注入到APP才能生效。动态库如何注入到APP呢?
iOS动态库注入方法有这三种:
方法1:将dylib文件放入DynamicLibraries目录
比如Tweak 产生的 dylib 实际会安装到 /Library/MobileSubstrate/DynamicLibraries 目录,在这个目录的 dylib 会被应用加载,里面的 dylib 会有一个 plist 文件,标识哪些进程会加载,如图:
方法2:修改Mach-O文件
只要我们在Mach-O文件中添加一条 LoadCommand,类型为 LC_LOAD_DYLIB,并将路径指定我们的dylib即可。
方法3:设置 DYLD_INSERT_LIBRARIES 环境变量
dumpdecrypted的脱壳原理,就是使用 DYLD_INSERT_LIBRARIES 注入进程,然后把文件从内存中给 dump 下来。
DYLD_INSERT_LIBRARIES = test.dylib /var/mobile/Containers/Bundle/Application/143A710D-4395-4765-872C-148EA6C86936/WeChat.app/WeChat
为什么 DYLD_INSERT_LIBRARIES 能够注入呢?这是苹果本身提供的一个功能,我们可以看苹果开源的 dyld 的源码,在 main 函数里相关的代码,判断了 DYLD_INSERT_LIBRARIES 环境变量,如果有的话就会加载。
// load any inserted libraries
if ( sEnv.DYLD_INSERT_LIBRARIES != NULL ) {
for (const char* const* lib = sEnv.DYLD_INSERT_LIBRARIES; *lib != NULL; ++lib)
loadInsertedDylib(*lib);
}
MonkeyDev用的是方法2。
2.2 iOS基础篇
A、初识 Mach-O
什么是Mach-O 以及查看工具
B、动态链接过程
提到Mach-O就不得不提 动态链接
因为看完这些资料,你可能会越来越懵逼,Mach-O是被谁加载的呢?Mach-O怎么跟我们的函数怎么关联上的呢?静态库和动态库的区别是什么呢?
别急 回头看看 fishhook原理篇 ,这些问题基本就可以解答了,
如果你还是不满足,想要更深入的理解动态链接过程,请看阿里iOSer 刘坤的这篇博客
如果你想对Mach-O有更深入、全面的了解,可以看看这些:
Mach-O分析:解析一个类 该篇讲较基础,作为入门比也较合适
Mach-O 内存分布
由App的启动说起
深入剖析Macho (1)
Mach-O文件格式
2.3 必要辅助工具篇
1、class-dump 分析mach-o 导出所有类的头文件(非开发中的头文件,它包括所有的属性、类方法、对象方法)
同样,这里是它的安装和使用说明
导出来之后 长这样:(建议用sublime打开,如果你用xcode打开该文件夹,你就会知道我这条建议有多么感人了)
2、反汇编工具:IDA 或 Hopper Disassembler
Hopper可以试用大约20分钟?分析比IDA较快(不过也需要近半小时),但试用版不能保存分析结果,下次打开又要等待半小时。网上的破解版都不好用。
所以我选择购买了IDA 破解版:购买地址
当然,有钱的童鞋,还是建议支持买正版。也就¥900多。
汇编指令和二进制机器码是一一对应的,所以有了Mach-O二进制文件,反汇编回汇编代码 也是可行的。
至于为什么要使用反汇编工具,看看下面的图片就懂了。
1、函数列表。不过看起来还不如我们class-dump导出的头文件包,别急,一旦双击某个函数名,就可以看到该函数的汇编代码了。见下图:
这是搜索好友的doSearch函数,如果你觉得汇编看不太懂,想要看点能看懂的,按F5,IDA会帮你转成伪代码,如下图:
一个细节可以看出:函数地址在整个Mach-O中的偏移位置。
好了,前期的工具和理论基础,先准备这些就够了,迫不及待的小伙伴们 你们可以开始动手试验了,请移步: iOS最新学习资料(二):实践篇