darny 发表于 2019-10-21 19:38:52

ios应用逆向工程


## 一、什么是逆向工程?

软件的逆向工程指的是通过分析一个程序或系统的功能、结构或行为,将它的技术实现或设计细节推导出来的过程。

## 二、iOS逆向工程的作用

### 1.与安全相关的iOS逆向工程

(1)评定安全等级
(2)逆向恶意软件(查毒和杀毒)
(3)检查软件后门
(4)去除软件的使用限制(破解和盗版)
(1)逆向系统调用(如调用系统的锁屏,关机等功能)
(2)借鉴别的软件(向优秀的软件学习)

## 三、iOS软件逆向工程的一般过程

软件逆向工程可以看做是系统分析和代码分析两个阶段的有机结合。

在系统分析阶段,要从整体上观察**目标程序的行为特征、文件的组织结构**,从而找到我们想要逆向的点。然后从该入口进入代码分析阶段,利用各种工具对程序本身的二进制文件进行分析,从而达到我们的目的。

## 四、iOS软件逆向工程用到的工具

分为四大类:

1.监测工具:用于嗅探、监测、记录目标程序行为的工具。常用的有Reveal, tcpdump, libNotifyWatch和PonyDebugger等。

2.开发工具:用于开发越狱代码的工具。最著名的就是Theos,能够编译生成Tweak插件。

3.反编译器:主要是IDA,该工具横跨Windows/Linux/Mac平台,它将目标程序的可执行文件作为输入,然后输出改程序的汇编代码,甚至是伪代码。

4.调试器:主要是基于命令行的GDB。事实上,Xcode中的调试器只是GDB(GNU Debgger)或LLDB的图形化包装而已。

## 五、iOS系统目录结构

首先下载个iFile,可以用来直观地查看iOS系统的目录结构。

下面记录一些关键的iOS目录结构:

**/var**:“variable”的简写,存放一些经常更改的文件,例如日志、用户数据、临时文件等。其中/var/mobile/Applications下存放了所有App Store App。

**/Applications**:存放所有的系统App和来自Cydia的App,不包括App Store App。越狱的过程把/Applications变成了一个符号链接,实际指向/var/stash/Applications。

**/Library**:用来存放系统App的数据。其中**/Library/MobileSubstrate**中存放了所有基于MobileSubstrate的插件。

注:**MobileSubstrate**(手机基础平台)是一个提供**hook**(注入)功能的基础平台,运行在该平台上的插件通常称为**tweak**(扭曲,改动)。

在/Library/MobileSubstrate下通常有3类文件:

(1)dylib:即Dynamic Library,也就是tweak插件。

(2)plist:用于配合dylib使用的filter文件,指定注入目标。其格式为:

Filter = {

Bundles = (com.apple.springboard);

};

(3)disabled:被SBSettings禁用的tweak文件,事实上就是将dylib文件改了个后缀,不让MobileSubstrate加载而已。

**/System**:包含了大量的系统组件。 其中**/System/Library/Frameworks**和**/System/Library/PrivateFrameworks**存放iOS中的各种framework,包括公开的和私有的等等。

**/System/Library/CoreServices**里的SpringBoard.app就是桌面管理器。

**/System/LIbrary/PreferenceBundles**:其中的各种bundle提供了“设置”中的绝大多数功能。

**/User**:实际指向/var/mobile。该目录存放了大量的用户数据,例如:

**/var/mobile/Media/DCIM**:照片目录。

**/var/mobile/Library/SMS**:短信目录。

**/var/mobile/Library/Mail**:邮件目录。

**/var/wireless/Library/CallHistory**:通话记录。貌似在iPod上没有这个目录。

## 六、iOS文件权限

一个组可以包含多个用户,一个用户可以属于多个组。

iOS中的每个文件都有一个属主用户和属主组。每个文件都具有一系列的权限。
在iOS中用3bit表示文件的使用权,从高位到低位分别是r(read), w(write), x(execute)权限。

文件和用户的关系存在三种可能性:

(1)此用户是属主用户;

(2)此用户不是属主用户,但在属主组里;

(3)此用户既不是属主用户,也不在属主组里。

例如:

111101101代表rwxr-xr-x,其8进制为755,它表示该文件的属主用户拥有r, w, x权限;而属主组只有r, x权限;其他任何人只有r, x权限。

## 七、iOS程序类型

越狱iOS中最常见的程序有Application, Dynamic Library和Daemon三类。

### 1.Application

除了传统意义上的App外,越狱iOS平台上还有两种App形式的存在:WeeApp(依附于NotificationCenter的App)和PreferenceBundle(依附于Settings的App),常见于Cydia平台。

普通App的bundle中存放的是可执行程序和所需资源,而framework的bundle中存放的是动态链接库。

主要关注App中的三个部分:

1.Info.plist:该文件记录了App的基本信息,如bundle identifier,可执行文件名,图标文件名等。

2.可执行程序:主要攻击目标之一。

3.Resouces(资源文件):其中各种本地化字符串(strings)是定位逆向目标的重要线索。

两者目录结构差别不大,但前者的属主用户和属主组一般是root和admin,而后者的属主用户和属主组一般是mobile,二者的权限不同。

另外,/Applications目录中App安装包的格式为deb,/var/mobile/Applications目录中App安装包的格式为ipa。

其中:

deb格式是Debian系统专属安装包格式,而这种格式的安装包经常会涉及系统底层的操作,可以获取较高的权限。从Cydia下载的App都是deb格式。

ipa格式是苹果公司在iOS中唯一的官方安装包格式。

### 2.Dynamic Library

动态库文件和静态库文件的区别在于,静态库文件是一次性加载的,且常驻内存。而动态库文件只有App要用到这个Library时,系统才会把这个Library加载到内存中。其中内核会启动Dynamic Loader(/usr/lib/dyld)把App需要的Dynamic Library加载进App的内存空间中。注意动态库的权限和可用的内存空间由加载它的那个App来决定。

iOS系统的daemon(后台守护进程)主要由一个可执行文件和一个plist文件构成。其中plist文件记录了daemon的基本信息。

iOS的根进程是/sbin/launchd,它会在开机或接到命令时检查/System/Library/LaunchDaemons和/Library/Daemons中所有符合格式规定的plist文件,然后按需启动对应的daemon。

## 八、初尝越狱插件OpenSSH

首先在越狱机子上装上OpenSSH插件,然后查看设备的IP地址,这里假设为192.168.xxx.xxx。

然后用Mac上的Terminal通过Open SSH连接到设备上(初次登录密码是alpine,必须立即修改,否则任何人都可以连接到你的机子上搞破坏)。

连接命令为:**ssh root@设备IP地址**

修改密码命令为:**passwd**

例如:

```vbnet
$ ssh root@192.168.xxx.xxx
The authenticity of host '192.168.xxx.xxx (192.168.xxx.xxx)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.xxx.xxx' (RSA) to the list of known hosts.
root@192.168.xxx.xxx's password:
root#
```

修改密码:

```php
root# passwd
Changing password for root.
New password:
Retype new password:
root#
```

以后就可以用Mac通过SSH连到iOS设备上去了,然后用终端使劲折腾吧。哈哈。




页: [1]
查看完整版本: ios应用逆向工程