iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳

使用frida-ios-dump工具,一键脱壳

一、加壳
    1. 我们知道App上传到AppStore后,会被自动加壳,那么什么是加壳呢?加壳就是利用特殊的算法, 对可执行文件的编码进行改变(例如:压缩、加密),已达到保护程序代码的目的。
    1. 加壳之前,执行程序,就会直接把可执行文件载入到内存中,如下图所示:
      iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳_第1张图片
      加壳之前的执行过程.png
    1. 加壳之后,执行程序,会把包裹着加密可执行文件的壳程序载入内存,在内存中,由壳程序对可执行文件进行解密,然后才会执行,如下图所示:
      iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳_第2张图片
      加壳之后的执行过程.png
    1. 加壳之后,由于可执行文件被加密了,所以就无法通过MachOView、Hopper Disassembler、class-dump、IDA等工具分析Mach-O文件了
二、脱壳
    1. 脱壳就是摘掉壳程序,将未加密的可执行文件还原出来
    1. 脱壳的办法主要有两种:硬脱壳、动态脱壳
  • 3.硬脱壳就是编写解密算法,把经过壳程序加密的可执行文件解密出来,如下图所示:

    iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳_第3张图片
    硬脱壳.png

    1. 动态脱壳就是把内存中已经解密的可执行文件,直接从内存中导出来,如下图所示:
      iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳_第4张图片
      动态脱壳.png
    1. 如何判断可执行文件是否已经脱壳了呢?这里介绍两种办法:
    • 使用MachOView工具查看可执行文件,查看Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID的值,0代表未加密,1代表已加密,如下所示:


      iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳_第5张图片
      MachOView工具判断是否脱壳
    • 在终端中,通过otool命令判断,otool的语法是:otool -l 可执行文件路径 | grep crypt,如下所示:

iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳_第6张图片
通过otool命令判断是否脱壳.png
三、脱壳工具介绍
    1. 最早的砸壳工具是stefanesser写的dumpdecrypted,通过手动注入然后启动应用程序在内存进行dump解密后的内存实现砸壳,这种砸壳只能砸主App可执行文件。
    1. 对于应用程序里面存在framework的情况可以使用conradev的dumpdecrypted,通过_dyld_register_func_for_add_image注册回调对每个模块进行dump解密。但是这种还是需要拷贝dumpdecrypted.dylib,然后找路径什么的,还是挺麻烦的。
    1. 然后有了KJCracks的Clutch,通过posix_spawnp创建进程然后dump直接生成ipa包在设备,可以说是很方便了。这个是工具在使用的时候大部分应用会出报错,此外生成的包还需要自己拷贝。
    1. 以上两种工具,都有各自的缺陷,于是便有了本文将要介绍的frida-ios-dump,该工具基于frida提供的强大功能,通过注入js实现内存dump,然后通过python自动拷贝到电脑生成ipa文件,通过以下方式配置完成之后真的就是一条命令砸壳。
四 、配置frida-ios-dump,实现一键脱壳
    1. frida-ios-dump是基于frida的,所以先要在手机和电脑上安装frida,命令如下:(注意,手机和电脑上的frida的版本需要保持一致)
Mac上安装frida的命令:
sudo pip install frida
或者 
sudo pip install frida –upgrade –ignore-installed six

iPhone上安装frida的方法:
打开Cydia->软件源->编辑->添加,输入build.frida.re,添加软件源后,搜索安装Frida即可
    1. 然后将越狱设备通过USB连上电脑,进行端口映射,默认是将Mac的2222端口映射到手机的22端口,命令如下:(注意,这里的映射的端口必须与frida-ios-dump中的dump.py文件指定的端口一致,只要是未被占用的端口就可以,也可以用以前说过的10010端口,这样用sh usb.sh命令就可以代替iproxy 2222 22了)
iproxy 2222 22
iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳_第7张图片
映射端口保持一致即可.png
    1. 下载frida-ios-dump,在手机上运行需要脱壳的App,然后回到Mac新开一个终端 ,cd进入下载好的frida-ios-dump目录后,运行./dump.py Display name或Bundle identifier,就可脱壳成功,如下所示:
可以先用./dump.py -l命令,列出来所有的可脱壳的应用名称和BundleID
./dump.py -l

让然后选择其中一个,执行./dump.py Display name命令,以微信为例:
./dump.py com.tencent.xin
iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳_第8张图片
脱壳成功.png
    1. 到此就已经配置完成了,以后想要脱壳,只需要映射端口,并且运行./dump.py,就可以脱壳了,需要注意以下几点:
    • 由于通过SSH的方式连接手机,所以请先确保已将公共密钥添加到目标设备的〜/ .ssh / authorized_keys文件中,具体方法请看iOS逆向工程(二):Mac远程登录iPhone

    • 如果运行./dump.py命令后,手机出现了崩溃重启,可以这样解决:从frida-releases下载相应版本的frida-server,替换手机里 /usr/sbin/frida-server文件,重启手机,再越狱,就可以修复。

    • 如果发生了设备重启、失去了连接等错误,尝试在./dump.py之前打开要脱壳的App

    • 请确保你要脱壳的App是从AppStore下载的App,否则可能会出现莫名其妙的卡住不动

五 、脱壳之后
    1. 脱壳之后,我们就可以拿到未加密的可执行文件了,可以用MacOView工具观察,也可以用class-dump工具导出头文件,也可以用Hopper Disassembler工具分析汇编代码和伪代码
    1. 目前为止,我们已经学会了分析界面(用Reveal以3D的视角查看层级结构)、分析代码(用class-dump导出头文件),接下来,我们将要学习动态调试和代码注入,最终实现将注入的代码的App重新打包,安装到非越狱的设备上。

你可能感兴趣的:(iOS逆向工程(六):使用frida-ios-dump工具,一键脱壳)