美文网首页
2019年iOS逆向最新学习资料(一):理论基础和工具准备

2019年iOS逆向最新学习资料(一):理论基础和工具准备

作者: 是張張啊 | 来源:发表于2019-10-03 14:54 被阅读0次

    1、前言

    提到iOS逆向,网上的文章铺天盖地,创作时间从2014年到2019年不等。绝大部分的工具或命令都过时了。书籍更不用说。

    我刚刚结束了为期1月的零基础iOS逆向研究,现已经成功逆向了微信的一些稍复杂逻辑(复杂主要是因为我想hook的功能,微信有个小bug)。现在分享一下我的一些学习路线和心得。

    • 郑重声明:本次逆向仅限于对iOS底层知识的学习,无任何恶意行为

    2、工具篇

    2.1 MonkeyDev 逆向集成环境

    工欲善其事 必先利其器
    iOS后起之秀AloneMonkey在旧的逆向集成环境iOSOpenDev的基础上,进行了升级。变成了一款非越狱插件开发集成神器:MonkeyDev,它提供了我们一个像开发普通iOS应用一样简单的开发平台。
    源码地址
    安装和使用方法请看这里
    我们先看一眼项目的创建:

    跟创建其他iOS项目一样简单
    再来看一眼project结构目录:
    拖入无壳的app即可
    只需要拖入一个砸壳的应用即可。关于如何砸壳,这不是逆向的重点,所以本篇不教,有兴趣的同学可以自行查资料解决。可以先到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 文件,标识哪些进程会加载,如图:

    image
    方法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、反汇编工具:IDAHopper Disassembler
    Hopper可以试用大约20分钟?分析比IDA较快(不过也需要近半小时),但试用版不能保存分析结果,下次打开又要等待半小时。网上的破解版都不好用。
    所以我选择购买了IDA 破解版:购买地址
    当然,有钱的童鞋,还是建议支持买正版。也就¥900多。
    汇编指令和二进制机器码是一一对应的,所以有了Mach-O二进制文件,反汇编回汇编代码 也是可行的。
    至于为什么要使用反汇编工具,看看下面的图片就懂了。
    1、函数列表
    1、函数列表。不过看起来还不如我们class-dump导出的头文件包,别急,一旦双击某个函数名,就可以看到该函数的汇编代码了。见下图:
    doSearch函数汇编位置
    这是搜索好友的doSearch函数,如果你觉得汇编看不太懂,想要看点能看懂的,按F5IDA会帮你转成伪代码,如下图:
    这是之前用hopper工具转化的伪代码,IDA的差不多,就不另行截图了
    一个细节可以看出:函数地址在整个Mach-O中的偏移位置。

    好了,前期的工具和理论基础,先准备这些就够了,迫不及待的小伙伴们 你们可以开始动手试验了,请移步: iOS最新学习资料(二):实践篇

    相关文章

      网友评论

          本文标题:2019年iOS逆向最新学习资料(一):理论基础和工具准备

          本文链接:https://www.haomeiwen.com/subject/frmdpctx.html