iOS逆向

iOS逆向之文件系统

2020-09-04  本文已影响0人  VV木公子

前言

作为一名iOS开发者,长期以来和MacOS、iOS系统打交道,对iOS和MacOS系统并不陌生。在开发中,我们也经常访问甚至修改MacOS的某些目录,每个系统目录都有其特殊的功能定位。而iOS系统源自MacOS,在很多方面iOS都和MacOS很相似,笔者借助最近逆向的机会,系统的学习&梳理了下iOS的系统目录及其结构,顺便总结了常见的文件目录的特殊定位。希望本篇文章能够让读者有所收获。

iOS系统目录

iOS源自macOS,而macOS又基于Unix系统内核,因此其目录结构与UNIX系统相同。
iOS系统包含两类目录,一类是保留的UNIX传统目录,另一类是iOS/macOS特有的目录。

iOS设备越狱后可以用工具对iOS文件系统目录一探究竟。下图是笔者使用iFunbox查看的越狱后iPhone设备的目录结构。

iOS文件系统目录

UNIX传统目录

iOS特有目录

部分系统目录

部分系统应用资料存放目录

iOS App沙盒目录结构

出于安全考虑,iOS系统把每个应用以及数据都放到一个沙盒(sandbox)里面,应用只能访问自己沙盒目录里面的文件、网络资源等(也有例外,比如系统通讯录、照相机、照片等能在用户授权的情况下被第三方应用访问)[1]

请注意,使用沙盒的目的是为了防止被攻击的应用危害到系统或者其他应用,它并不能阻止应用本身被攻击,因此,开发者需要防御式的编程来避免应用被攻击。苹果官方是这样说的:

Important: The purpose of a sandbox is to limit the damage that a compromised app can cause to the system. Sandboxes do not prevent attacks from happening to a particular app and it is still your responsibility to code defensively to prevent attacks. For example, if your app does not validate user input and there is an exploitable buffer overflow in your input-handling code, an attacker could still hijack your app or cause it to crash. The sandbox only prevents the hijacked app from affecting other apps and other parts of the system.

为了便于应用组织数据,每个沙盒内都有几个名字固定的子目录用来保存文件,下图是沙盒的目录结构:

iOS沙河目录结构

主要有4个目录官方文档

  • MyApp.app
    该目录包含了应用程序本身的数据,程序打包的时候的资源文件和一些本地文件就是存放在这个目录下的。程序的可执行程序、plist文件也在这个目录下。
这个目录不会被iTunes同步
  • Documents使用这个目录来保存关键数据。关键数据指那些应用不可再生的数据。
这个目录会被iTunes同步
  • Library用来保存一些配置文件和其他一些文件。其中使用NSUserDefaults写的设置数据都会保存到Library/Preferences目录下的一个plist文件中。Library/Caches可以用来保存可再生的数据,比如网络请求,用户需要负责删除对应文件。
这个目录(除了Library/Caches外)会被iTunes同步
  • tmp
使用这个目录来保存各种应用下次启动不再需要的临时文件。当应用不再需要这些文件的时候,需要主动将其删除。(当应用不再运行的时候,系统可能会将此目录清空。)



这个目录不会被iTunes同步

获取主要目录路径的方式

沙盒目录

NSLog(@"%@",NSHomeDirectory());

MyApp.app

NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);

tmp

NSLog(@"%@",NSTemporaryDirectory());

Documents

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
NSLog(@"%@",docPath);

Library

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libPath = [paths objectAtIndex:0];
NSLog(@"%@",libPath);

iOS应用结构

iOS文件权限

iOS是一个多用户操作系统,每个用户扮演着不同的角色,对系统的控制权也各不相同。root用户具有系统最高控制权,可以执行所有命令,而mobile用户只能执行一些权限比较低的命令。“组”是用户的一种组织方式,一个组可以包含多个用户,一个用户也可以归属于多个组。

我们使用ls -l命令可以查看文件的各种权限。类似“-rwxr-xr--”这样的就是文件的权限信息。权限信息由10个bit来划分,最前面一个bit表示文件类型。如“d”表示目录、“l”表示符号链接、“-”表示普通文件。接下来的9个bit平分为3组,分别如下:

r:read 代表读权限
w: write 代表写权限
x: execute代表执行权限
-: 该位置无对应权限

权限设置

权限设置使用二进制表示:如果某一位为1则代表权限生效,为0无效。例如:要使某个文件的所有者具有r、w、x权限,所属组具有r、w权限,其他人只有r权限。则可用二进制表示为:111-110-100。同时二进制111-110-100转成八进制为764。所以可以使用chmod命令设置权限:

chmod 764 xxx.txt

参考文章

File System Programming Guide
iOS之系统文件目录
《iOS应用逆向与安全之道》

上一篇 下一篇

猜你喜欢

热点阅读