前言

最近想了解别人app的一个功能实现,入了逆向的坑,也当做一次更深了解oc底层的机会。前前后后看了几篇相关文章,就拿个App练了练手,在此记录下学习过程,方便以后回忆。首先,上传到AppStore的App都是经过苹果签名加密的(具体加密过程可以看我写的这篇文章),所以我们要拿到App代码的头文件,必须解密,俗称砸壳,接下来,我会用以下三种工具来实现砸壳并且导出头文件。此篇介绍的是Clutch

准备

  1. 越狱的iPhone

    • Cydia安装OpenSSH(Mac 上远程输入命令操作 iOS 设备)
    • Cydia安装Apple File Conduit “2”(方便ifunbox等工具访问iOS系统目录)

      安装 afc2add 也是一样,不过我在安装 afc2add 后无法访问系统目录,才用 Apple File Conduit “2” 这个插件的,这个插件要通过添加 apt.25pp.com 这个源来装,你用Cydia的源访问不了,应该是要翻墙。
      (这里小记录下,每次重新越狱, Apple File Conduit “2” 这个插件都要重新安装一遍,不然会失效)

  2. 电脑安装ifunbox,usbmuxd,class-dump

    • iFunBox自己找,主要用来iPhone和Mac传输文件,实在不用也行,可用scp命令代替

      usb连接手机情况下:

      1
      2
      scp -P 12345 root@localhost:<手机上文件的路径> <复制的文件存放到电脑的路径>
      scp -P 12345 <电脑上文件的路径> root@localhost:<复制的文件存放到手机的路径>

      wifi连接手机情况下:

      1
      2
      scp <电脑上文件的路径> root@越狱机ip地址:<复制的文件存放到手机的路径>
      scp root@越狱机ip地址:<手机上文件的路径> <复制的文件存放到电脑的路径>
    • usbmuxd可通过下面命令安装,前提是你Mac装了Homebrew

      1
      brew install usbmuxd
    • 如果你安装了或者打算装 Monkey Dev 的,就可以不用装 class-dump,因为它里面已经自带了。自己安装 class-dump 可以通过此地址下载,下载后打开,把里面的 class-dump 复制到 /usr/local/bin 路径下,打开终端,执行:

      1
      class-dump

      成功安装好class-dump~

过程

安装Clutch

  1. 先从GitHub下载最新Clutch

    下载地址:https://github.com/KJCracks/Clutch/releases

  2. ssh连接iPhone

    • 由于Mac上只支持4位的端口号,所以需要把iPhone的默认端口22映射到Mac上,相当于建立一个Mac和iPhone之间的通道。打开终端,执行:

      1
      iproxy 12345 22
    • 这时终端会显示 waiting for connection 这表示我们已经搭建好Mac和iPhone的通道,现在我们直接和本地的12345端口通信就能和iPhone通信了。保持上一个命令显示的状态,新建个终端执行:

      1
      ssh -p 12345 root@127.0.0.1

      如果要你输入密码则输入:alpine,显示 iPhone:~ root# 代表成功,你可以在后面输入命令操作设备啦。

  3. 移到iPhone的Device->usr->bin目录下

    直接拖动下载 Clutch-2.0.4文件 到iFunBox的 Device/usr/bin 目录下就算安装成了。

砸壳

  1. 给 clutch 加权限

    cd到 clutch 所在位置:

    1
    2
    iPhone:~ root# cd /usr/bin
    iPhone:/usr/bin root#

    直接执行:

    1
    2
    iPhone:/usr/bin root# Clutch-2.0.4
    -sh: /usr/bin/Clutch-2.0.4: Permission denied

    这是因为没有权限,给他加一下就好了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    iPhone:/usr/bin root# chmod +x Clutch-2.0.4
    iPhone:/usr/bin root# Clutch-2.0.4
    Usage: Clutch-2.0.4 [OPTIONS]
    -b --binary-dump <value> Only dump binary files from specified bundleID
    -d --dump <value> Dump specified bundleID into .ipa file
    -i --print-installed Print installed applications
    --clean Clean /var/tmp/clutch directory
    --version Display version and exit
    -? --help Display this help and exit
    -n --no-color Print with colors disabled

    这里很明显成功了,可以砸壳了。

  2. 找出要砸壳app的包名,砸壳

    我们执行这句查看手机安装的App:

    1
    2
    3
    4
    5
    iPhone:/usr/bin root# Clutch-2.0.4 -i
    Installed apps:
    1: 微信 <com.tencent.xin>
    2: 大众点评-分享你的潮生活 <com.dianping.dpscope>
    3: Keep - 自由运动场 <com.gotokeep.keep>

    找到你想砸壳的App,复制他的包名,执行:

    1
    2
    3
    4
    5
    6
    7
    iPhone:/usr/bin root# Clutch-2.0.4 -d com.tencent.xin
    Zipping MacauLife.app
    ASLR slide: 0x10009c000
    Dumping <MacauLife> (arm64)
    ...
    DONE: /private/var/mobile/Documents/Dumped/com.tencent.xin-iOS9.0-(Clutch-2.0.4).ipa
    Finished dumping com.tencent.xin in 17.6 seconds

    砸壳成功~

导出头文件

  1. 拿到可执行文件

    从上面砸壳我们已经成功得到砸完壳的ipa包了,接着只要根据返回的路径,从iFunBox找到ipa包,拖到你的Mac电脑上,右键解压,然后你会发现一个Payload文件夹,右键显示包内容,在里面找到 WeChat 这个文件,把它复制出来放到你喜欢的路径下,这就是微信的可执行文件啦,我们要利用这个文件来导出头文件。

    如果没有iFunBox可以用命令代替这个操作:

    1
    scp -P 12345 root@localhost:/private/var/mobile/Documents/Dumped/com.tencent.xin-iOS9.0-\\\(Clutch-2.0.4\\\).ipa ~/

    注意:

    • 此命令是在电脑终端执行,而不是在手机端终端下。
    • -P 的 P 必须是大写,指定端口的意思。
    • Clutch砸壳后生成的ipa包命名有’(‘,’)’这两个符号,要加反斜杠,不然会报找不到文件问题。或者你直接用mv命令重新命名这个ipa包名,去掉括号在进行scp复制到电脑也行。
  2. 导出头文件

    用class-dump导出头文件,到终端执行(包括两个符号’<’,’>’整个替换路径):

    1
    class-dump -H <你放WeChat可执行文件的路径> -o <你打算放导出的头文件的文件夹路径>

    喝杯咖啡,emmmm,头文件就出来啦。

总结

至此,clutch砸壳&获取头文件完毕,你可以用ida来打开上面得到可执行文件,它可以生成伪代码,免去看汇编的痛苦,配合sublime来看头文件,进而分析,学习别人App某些功能的实现,下一篇将讲用 dumpdecrypted 砸壳。