iOS逆向工程(六):使用frida-ios-dump工具,一键
2020-03-13 本文已影响0人
冰风v落叶
使用frida-ios-dump工具,一键脱壳
一、加壳
- 我们知道App上传到AppStore后,会被自动加壳,那么什么是加壳呢?加壳就是利用特殊的算法, 对可执行文件的编码进行改变(例如:压缩、加密),已达到保护程序代码的目的。
- 加壳之前,执行程序,就会直接把可执行文件载入到内存中,如下图所示:
加壳之前的执行过程.png
- 加壳之前,执行程序,就会直接把可执行文件载入到内存中,如下图所示:
- 加壳之后,执行程序,会把包裹着加密可执行文件的壳程序载入内存,在内存中,由壳程序对可执行文件进行解密,然后才会执行,如下图所示:
加壳之后的执行过程.png
- 加壳之后,执行程序,会把包裹着加密可执行文件的壳程序载入内存,在内存中,由壳程序对可执行文件进行解密,然后才会执行,如下图所示:
- 加壳之后,由于可执行文件被加密了,所以就无法通过
MachOView、Hopper Disassembler、class-dump、IDA
等工具分析Mach-O文件了
- 加壳之后,由于可执行文件被加密了,所以就无法通过
二、脱壳
- 脱壳就是摘掉壳程序,将未加密的可执行文件还原出来
- 脱壳的办法主要有两种:硬脱壳、动态脱壳
-
3.硬脱壳就是编写解密算法,把经过壳程序加密的可执行文件解密出来,如下图所示:
硬脱壳.png
-
动态脱壳就是把内存中已经解密的可执行文件,直接从内存中导出来,如下图所示:
动态脱壳.png
-
动态脱壳就是把内存中已经解密的可执行文件,直接从内存中导出来,如下图所示:
-
- 如何判断可执行文件是否已经脱壳了呢?这里介绍两种办法:
-
使用MachOView工具查看可执行文件,查看Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID的值,0代表未加密,1代表已加密,如下所示:
MachOView工具判断是否脱壳 -
在终端中,通过otool命令判断,otool的语法是:
otool -l 可执行文件路径 | grep crypt
,如下所示:
三、脱壳工具介绍
- 最早的砸壳工具是stefanesser写的dumpdecrypted,通过手动注入然后启动应用程序在内存进行dump解密后的内存实现砸壳,这种砸壳只能砸主App可执行文件。
- 对于应用程序里面存在framework的情况可以使用conradev的dumpdecrypted,通过
_dyld_register_func_for_add_image
注册回调对每个模块进行dump解密。但是这种还是需要拷贝dumpdecrypted.dylib,然后找路径什么的,还是挺麻烦的。
- 对于应用程序里面存在framework的情况可以使用conradev的dumpdecrypted,通过
- 然后有了KJCracks的Clutch,通过posix_spawnp创建进程然后dump直接生成ipa包在设备,可以说是很方便了。这个是工具在使用的时候大部分应用会出报错,此外生成的包还需要自己拷贝。
- 以上两种工具,都有各自的缺陷,于是便有了本文将要介绍的frida-ios-dump,该工具基于frida提供的强大功能,通过注入js实现内存dump,然后通过python自动拷贝到电脑生成ipa文件,通过以下方式配置完成之后真的就是一条命令砸壳。
四 、配置frida-ios-dump,实现一键脱壳
-
frida-ios-dump是基于frida的,所以先要在手机和电脑上安装
frida
,命令如下:(注意,手机和电脑上的frida的版本需要保持一致)
-
frida-ios-dump是基于frida的,所以先要在手机和电脑上安装
Mac上安装frida的命令:
sudo pip install frida
或者
sudo pip install frida –upgrade –ignore-installed six
iPhone上安装frida的方法:
打开Cydia->软件源->编辑->添加,输入build.frida.re,添加软件源后,搜索安装Frida即可
- 然后将越狱设备通过USB连上电脑,进行端口映射,默认是将Mac的2222端口映射到手机的22端口,命令如下:(注意,这里的映射的端口必须与frida-ios-dump中的dump.py文件指定的端口一致,只要是未被占用的端口就可以,也可以用以前说过的10010端口,这样用sh usb.sh命令就可以代替iproxy 2222 22了)
iproxy 2222 22
映射端口保持一致即可.png
- 下载frida-ios-dump,在手机上运行需要脱壳的App,然后回到Mac新开一个终端 ,
cd
进入下载好的frida-ios-dump
目录后,运行./dump.py Display name或Bundle identifier
,就可脱壳成功,如下所示:
- 下载frida-ios-dump,在手机上运行需要脱壳的App,然后回到Mac新开一个终端 ,
可以先用./dump.py -l命令,列出来所有的可脱壳的应用名称和BundleID
./dump.py -l
让然后选择其中一个,执行./dump.py Display name命令,以微信为例:
./dump.py com.tencent.xin
脱壳成功.png
-
- 到此就已经配置完成了,以后想要脱壳,只需要映射端口,并且运行
./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,否则可能会出现莫名其妙的卡住不动
- 到此就已经配置完成了,以后想要脱壳,只需要映射端口,并且运行
五 、脱壳之后
- 脱壳之后,我们就可以拿到未加密的可执行文件了,可以用
MacOView工具
观察,也可以用class-dump工具
导出头文件,也可以用Hopper Disassembler工具
分析汇编代码和伪代码
- 脱壳之后,我们就可以拿到未加密的可执行文件了,可以用
- 目前为止,我们已经学会了分析界面(用Reveal以3D的视角查看层级结构)、分析代码(用class-dump导出头文件),接下来,我们将要学习动态调试和代码注入,最终实现将注入的代码的App重新打包,安装到非越狱的设备上。