- 上一篇文章地址:iOS逆向之文件系统结构
- 上一篇文章已经介绍iOS系统文件目录结构
- 这已经是第四篇文章,前期主要介绍基础知识点,后期进行实战点及工具的使用.
- 如果遇到越狱逆向问题,可以留言,加入逆向群一起解决.
1.文件权限
iOS中的每个文件都具有一系列权限.文件权限是iOS系统确保安全操作的一个重要部分.
iOS系统用3个比特表示文件的操作权限,从高位到低位分别是读(r),写(w)和执行(x).
-
每个文件具有以下属性
- 所有者权限:决定文件的所有者可以对文件进行的操作
- 组权限:决定属于该组的成员对他所拥有的文件能够进行的操作
- 其他人权限: 表示其他人能够对该文件进行的操作.
除r,w,x权限外,文件还可以拥有SUID,SGID和Sticky等权限,SUID,SGID和Sticky等介绍
- 文件权限字符介绍
第一个字符表示文件的类型,l是符号链接文件,d是文件夹,-是普通文件
第二到第四个字符表示读,写,执行权限
第五到第七个字符表示文件所属组的权限
第八到第十个字符表示其他人的权限
2.文件类型
我们的目标是Application,Dynamic Library(dylib)和Daemon这三类二级制文件,对它们的了解越深入,逆向工程就会越顺利.
我们会一一介绍这三类文件
Application
一般我们正向开发时间长了,对App关注有所不同.在正向开发的时候,我们不会考虑到逆向的本质.
1.bundle
- bundle,它不是一个文件,包含了二进制文件及运行所需的资源.
- 正向开发中App和framework都是以bundle的形式存在的.
- 在越狱iOS中常见PreferenceBundle,可以看成是一种依附于Settings的App.
2.App目录
- 正向开发者,对应用项目目录应该是非常的清楚.有正向开发的经验,对逆向帮助性是挺大的.
- 比如info.plist文件,它记录了App的基本信息,如Bundle identifier(标识符),
可执行文件名,图标文件名等信息;
- Iproj目录:存放的是各种本地化的字符串(.strings)
3.系统APP VS.AppStore
/Applications/目录存放系统App和Cydia下载的App,两者依然存在区别
-
目录结构:
都含有info.plist,可执行文件,Iproj目录
数据目录存放位置不同:AppStore下载的应用数据目录在/var/mobile/Containers/Data下
以mobile权限运行的系统App的数据目录在/var/mobile下
以root权限运行的系统App的数据目录在/var/root下
-
安装包格式与权限
Cydia App的安装包格式一般是deb
AppStore的安装包格式一般是ipa(正向开发者打包后,是一个ipa包)
deb 是来自Debian的安装包格式,它的属主用户和属主组一般是root和admin,能够以root权限运行.
ipa是苹果为iOS推出的专属App安装包格式,属主用户和属主组都是mobile,只能以mobile权限运行.
-
沙盒:
iOS中的沙盒就是一种访问限制机制
沙盒会将App的文件访问范围限制在这个App内部
沙盒还会限制App的功能
Dynamic Library
平常开发,大部分时间都是在写应用的功能,如果某个第三方库依赖了某个库,我们一般手动导入项目中或者pod 安装.这些库我们经常遇到,其实本质是dylib.
在iOS中,lib分为static和dynamic两种:
static lib在编译阶段成为App可执行文件的一部分,会增加可执行文件的
大小,启动时需要加载的内容变多,所以可能会导致App启动变慢.
dylib,它不会改变可执行文件的大小,只有当App需要用到这个dylib时,iOS
才会把它加载进内存,成为App进程的一部分.
dylib本身并不是可执行文件,不能独立运行,只能为别的进程服务,而且它们寄生在别的进程里.
Daemon
正向开发者,从开发到接触逆向,都会认为iOS中没有真正的后台多任务.
到底有没有守护进程呢?
比如我们用手机刷短视频的时候,突然来了电话,其他操作立即中断,立即弹出来电页面,如果没有后台任务,我们可能看不到来电页面.
Daemon为后台运行而生,给用户提供了各种守护.iOS的根进程是launchd,它会在开机时检查/System/Library/LaunchDaemons和/Library/LaunchDaemons下所有格式符合规定的plist文件,然后启动对应的daemon.
3.Cydia Substrate
Cydia Substrate,允许第三方开发者在越狱系统的方法里打一些运行时不定和扩展一些方法.
需要再Cydia中安装Cydia Substrate.
Cydia Substrate主要包括3个主要模块:MobileHooker,MobileLoader,Safe mode.
- MobileHooker
- 用于替换系统和应用的方法
- MobileLoader
- 用于将第三方动态库加载到运行的目标应用里面
MobileLoader加载过程
- 通过环境变量DYLD_INSERT_LIBRARIES,把它自己加载到目标应用里面
- 然后查找/Library/Mobile Substrate/DynamicLibraries/目录下面的所有plist文件
- 如果plist文件里面的配置信息符合当前运行的应用,就会通过dlopen函数打开对应的dylib文件
plist过滤条件
- 只有满足plist的过滤文件,第三方动态库才会被加载
- CoreFoundationVersion: 只有CoreFoundation.framework的版本高于某个值时才会加载
- Bundles : 只有应用的Bundle ID在该列表中时才会加载
- Classes: 只有应用实现了某些特定的OC类才会加载
- Executables: 只有应用的可执行文件的名字和该列表匹配时才会加载
- Safe mode
安全模式是非常有用的,为什么说安全模式有用呢.之前写的插件,因为有特殊原因,编写的插件会导致崩溃,而进入安全模式,把可以把最近安装的插件给卸载掉,从而保护到越狱环境
4.总结
本篇文章主要介绍了文件权限及类型,Cydia Substrate等内容,通过上一篇文章和本篇文章,你应该熟悉了iOS文件系统.
下一篇文章将要介绍iOS逆向工具.
欢迎持续关注iOS逆向文章及留言交流.