在iOS开发中,能够随意更改app在真机上的文件可方便我们调试app,但自从iOS9以后app目录也越来越不好获取了。当然首先你得需要一个越狱手机,关于手机如何越狱,以下列出最近几个版本的越狱方法:
iOS9.0-iOS9.1盘古官网
iOS9.2-iOS9.3.3盘古官网会跳转到pp助手,使用win版pp助手点击一键越狱即可
iOS10.0.0-iOS10.2此为越狱源码,开发者可自行下载编译,安装到手机上,然后根据提示来进行越狱
app沙盒目录结构图
下面来展示几种获取app沙盒目录的方法:
1、源码方式获取
这种方式适合有源码调试的app。
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* cPath = [paths objectAtIndex:0];
cPath即为该app沙盒下的Document文件夹,更改NSSearchPathForDirectoriesInDomains的第一个参数,相应的可以打印出其他文件夹。但是这种方式虽然简单,但是必须要有源码,有很大的限制,接下来介绍的两种方法就没有这种限制了。
2、辅助手机管理软件
这里推荐iMazing或者iTools Pro,需要在越狱环境下的cydia中安装House Arrest Fix,即可找到app的沙盒目录。
House Arrest Fix
iMazing
iTools Pro
3、利用越狱插件来获取
上述的几种方案在高版本的iOS系统中都只能获取Documents、Library和Temp目录,而不能获取.app目录,而利用越狱插件则可以获取.app目录。
首先我们需要一些准备工作。
- 打开ssh通道:以iOS10.2安装yalu102 B7版本为例,B7版本自带ssh,其他系统版本越狱系统请参考其他教程安装ssh。在cydia安装filza,打开目录var/containers/Bundle/Application其中就可以看到用户安装的程序.app目录了。然后在yalu102.app目录中,往下滑找到dropbear.plist 用属性表编辑器打开。其中的ProgramArguments项展开,把ltem4中的内容修改成22。然后重启手机就可以使用wifi远程登录手机了。另外也可以通过usb去登录手机,参考使用ssh 访问越狱iPhone的两种方式
注:此时通过filza其实已经可以看到.app目录了,另外也可以打开 var/mobile/Containers/Data/Application,这个目录下就是各个app的Documents、Library和Temp目录。以下的方法利用终端打印出沙盒目录地址。
- 安装Cycript插件
- 开始查找沙盒目录,以StoreApp为例。:首先在iOS中关掉所有StoreApp,然后打开Target,保持电脑和手机在同一网段,接着ssh到 iOS上,打印出所有进程,如下:
snakeninnysiMac:~ snakeninny$ ssh root@iOSIP FunMaker-5:~ root# ps -e
PID TTY TIME CMD
1 ?? 3:28.32 /sbin/launchd ……
5717 ?? 0:00.21 /System/Library/PrivateFrameworks/MediaServices.framework/Support/m
5905 ?? 0:00.20 sshd: root@ttys000 5909 ?? 0:01.86 /var/mobile/Containers/Bundle/Application/03B61840-23494559-B28E-0E2C6541F879/TargetApp.app/TargetApp 5911 ?? 0:00.07 /System/Library/Frameworks/UIKit.framework/Support/pasteboardd
5907 ttys000 5913 ttys000
0:00.03 -sh 0:00.01 ps –e
因为iOS上只打开了一个StoreApp所以唯一的那个含“/var/mobile/Containers/Bundle/Application/”字样的 结果就是TargetApp可执行文件的全路径,也就是.app文件的路径。 用Cycript找出TargetApp的Documents目录路径。StoreApp的Documents目录位 于/var/mobile/Containers/Data/Application/YYYYYYYYYYYY-YYYY-YYYY–YYYYYYYYYYYY/下,Y与 之前的X值不同,而且这次PS也帮不上忙了。因此, 需要借助强大的Cycript,让App告诉我们Documents的路径。命令如下:
FunMaker-5:~ root# cycript -p TargetApp cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C434363AA-4BFF-904B-2146128611EE/Documents/"
这样就找出了Documents路径,而Library和Temp和Documents在同一目录下,这样所有的沙盒路径全部找到。
参考书籍:iOS应用逆向工程