iOS逆向工程概念篇

最近在看一本关于逆向工程的书籍, 因此把本身学的东西记录起来方便之后复习,在这里分享出来带给须要的人.app


类UNIX操做系统常见目录结构:
  1. /: 根目录 斜杠表示, 全部文件和目录在根目录下展开.
  2. /bin: binary缩写, 存放用户级基础功能的二进制文件.如ls ps等.
  3. /boot: 存放使系统成功启动的全部文件.iOS中是空.
  4. /dev: device缩写, 存放BSD设备文件.每一个文件表明系统的一块设备或者字符设备,块设备以块为单位传输数据, 如硬盘. 字符设备以字符为单位传输数据, 如调制解调器.
  5. /sbin: system binaries简写.存放提供系统级基础功能的二进制文件.如netstat. reboot等.
  6. /etc: Et Cetera简写, 存放系统脚本及配置文件, 如passwd. hosts等. iOS中/etc是一个符号连接, 实际指向/private/etc.
  7. /lib: 存放系统库文件, 内核模块及设备驱动等. iOS中为空.
  8. /mnt: mount简写, 存放临时的文件系统挂载点. iOS中为空.
  9. /private/var: 存放两个目录, 分别是/private/etc和/private/var.
  10. /tmp: 临时目录. 在iOS 中, 它是一个符号连接, 实际指向/private/var/tmp.
  11. /usr: 包含大多数用户工具和程序. 如nm. killall等. /usr/include包含全部的标准C头文件. /usr/lib存放库文件.
  12. /var: variable简写, 存放一些常常更改的文件, 如日志 用户数据 临时文件等. 其中/var/mobile和/var/root分别存放了mobile用户和root用户的文件, 是重点关注的目录

iOS 文件权限简介
  • iOS 是一个多用户操做系统. 用户是一个抽象的概念, 它表明对操做系统的全部权和使用权.如mobile用户没法调用reboot命令重启iOS . 而root用户能够. 组 是用户的一种组织方式, 一个组能够包含多个用户, 一个用户能够属于多个组.
  • iOS 中的每一个文件都有一个属主用户和一个属主组, 或者说这个用户和这个组拥有这个文件.每一个文件都有一系列权限, 简单的说就是权限的做用决定文件的属主用户能作什么.属主组能作什么.
  • iOS 用3位(bit)表示文件的权限, 从高到低是 r(read) w(write) x(execute).
  • 文件和用户存在关系有三种:
    1. 此用户是属主用户.
    2. 此用户不是属主用户, 但在属主组里.
    3. 此用户不是属主用户, 但也不在属主组里.

iOS 独有目录
  1. /Applications: 存放全部的系统App和来自于Cydia的App, 不包括StoreApp.
  2. /Developer: 若是一个设备链接Xcode后被指定为调试机, Xcode就会在iOS 中生成这个目录, 其中会含有一些调试须要的工具和数据.
  3. /Library: 存放一些提供系统支持的数据, 其中/Libraty/MobileSubstrate下存放了全部基于CydiaSubstrate的插件.
  4. /System/Library: iOS 文件系统中最重要的目录之一, 存放大量系统组件.
  5. /System/Library/PrivateFrameworks: 存放iOS 中的各类framework.
  6. /System/Library/CoreServices里的SpringBoard.app: iOS 桌面管理器, 是用户与系统交流的最重要中介.
  7. /User: 用户目录, 实际指向/var/mobile. 这个目录存放大量用户数据如: /var/mobile/Media/DCIM下存放照片. /var/mobile/Media/Recordings下存放录音文件./var/mobile/Library/SMS下存放短信数据.
  8. /var/mobile/Containers: 存放storeApp.
  9. /var/mobile/Containers/Bundle: App的可执行文件的bundle目录.
  10. /var/mobile/Containers/Data: App中的数据目录.

目录结构和文件权限
  1. Application: 就是咱们的App.ide

  2. bundle: 不是一个文件, 而是一个按某种标准结构来组织的牡蛎, 其中包含了二进制文件及运行所需的资源. 正向开发中的App和framework都是以bundle形式存在的. 越狱中常见的PreferenceBundle能够当作是一种依附于Settings的App.本质也是bundle.工具

  3. info.plist: 记录了App的基本信息.如identifier 可执行文件名 图标文件名等.能够经过Xcode自带工具plutil查看.如图: 操作系统

  4. Iproj目录存放的是各类本地化字符串.(.strings)插件

  5. /Applications/ 目录存放的是系统App和Cydia下载的App, 而/var/mobile/Containers/目录存放的是StoreApp.调试

  • 区别以下
  1. 数据目录不一样, StoreApp的数据目录在/var/mobile/Containers/Data/下.以mobile权限运行的系统App的数据目录在/var/mobile/下. 而root权限运行的系统App的数据目录在/var/root/下.
  2. CydiaApp的安装包格式是deb, StoreApp安装包格式是ipa. deb是来自Debian的安装包格式, 是Cydia做者saurik移植到iOS 中, 它的属主用户和属主组通常是root和admin, 可以经过root权限运行. 而ipa是苹果为iOS 推出的专属App安装包格式, 属主用户和属主组都是mobile.只能以mobile权限运行.
  3. 沙盒(sandbox) iOS 中的一种访问限制机制. 有时候也会由于沙盒的存在而出现一些奇怪的问题.

Dynamic Library

在Xcode工程里导入的各类framework连接的各类lib本质都是dylib. 能够用file命令验证:日志

Cydia中的tweak都是以dylib形式工做的.

  • iOS 中lib分为static和dynamic两种. 其中static lib在编译阶段成为App可执行文件的一部分, 会增长可执行文件的大小. 由于App的大小变大, 启动时须要加载的内容变多, 因此致使App变慢. 反之, dylib不会改变可执行文件大小, 当App须要用到这个dylib时, iOS 才会把它加载进内存, 成为App进程的一部分.
  • dylib自己不是可执行文件, 不能独立运行, 他们只能寄生在别的进程里. 所以dylib的权限是由它寄生的那个App决定的. 同一个dylib寄生在系统App和StoreApp里权限是不一样的.

后台运行(daemon)

  • daemon为后台运行而生, 给用户提供了各类守护.
  • daemon主要由一个可执行文件和plist文件构成. iOS 根进程launchd, 他会在开机时检查/System/Library/LaunchDaemons和/Library/LaunchDaemons下全部格式符合规定的plist文件. 而后启动对应的daemon. 这里的plist文件和info.plist文件相似.

相关文章
相关标签/搜索