iOS安全之防止调试与防止注入
学习逆向是不是目的,我们是想通过逆向的手段来达到加强我们App安全的目的,那么应该怎么做呢?
我们知道逆向的终极策略就是动态调试和动态库注入,那么我们能不能在这两个维度加强安全性呢。
一、防止调试
调试是通过ptrace
进行附加,读取内存中的值,所以我们要能检测调试状态,拒绝调试器附加,那么首先我们要了解Xcode调试的原理,知其然知其所以然,才能从根源上解决问题。
1.1 Xcode调试原理
Xcode
的lldb
之所以能调试App,是因为手机运行App,lldb
会把调试指令发给手机的debugServer
; debugServer
是由Xcode
第一次运行程序给安装到手机上。
Xcode
上查看debugserver
路径:Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/11.3/DeveloperDiskImage.dmg
找到DeveloperDiskImage.dmg
里的debugserver
手机的根目录下的 /usr/bin debugserver
里能找到,
那么debugserver
如何调试App的呢?
debugserver
是通过ptrace
来监听31
的Attach
附加进程进行的。
ptrace
是系统函数,此函数提供一个进程去监听和控制另一个进程,并且可以检测被控制进程的内存和寄存器里面的数据。ptrace
可以用来实现断点调试和系统调用跟踪。
1.2 如何使用ptrace
正常情况下的main.m
文件的内容是
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
我们改成:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <dlfcn.h>
#import <sys/types.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define PT_DENY_ATTACH 31
#endif // !defined(PT_DENY_ATTACH)
void disable_gdb() {
void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
dlclose(handle);
}
int main(int argc, char *argv[])
{
#ifndef DEBUG
disable_gdb();
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
除了使用ptrace
,我们还可以使用syscall
,及其他的方式
syscall(26, 31, 0,0,0);
使用syscall
的代码如下:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <dlfcn.h>
#import <sys/types.h>
int main(int argc, char * argv[]) {
#ifndef DEBUG
syscall(26, 31, 0,0,0);
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
添加后的现象就是通过release
模式连接手机后,会直接断开Xcode
,就是防止Xcode
进行调试
可以看到运行结束后,按钮直接变灰色:
都可以有效的预防其他人对我们App在release状态下进行动态调试。
二、防止动态库注入
其实越狱后能够注入代码就是通过CydiaSubstrate
动态库,动态链接到我们App上的Mach-O
文件上,这样程序执行的时候就会加载他们的目标动态库,进而实现对我们App的Hook
,而前文刷趣头条的阅读金币也是通过这种方式进行的,所以我们在项目工程里设置一下参数,就可以防止动态库注入,注入后没有效果。
通过 Xcode 里的 Other Linker Flags 设置如下参数:
-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null
三、总结
其实即便我们把上边的防止调试与防止注入做到了,还是可以通过Hook C 语言
及修改二进制的方式来破坏我们的防护策略,但是我们提高了逆向的成本。
攻防总是对立存在的,没有绝地的安全,所以我们要加强自身的安全性的策略,提高黑产逆向我们App的成本与难度,相对程度里就是安全的。
iOS 逆向<8>:Xcode动态调试配置8>
背景知识
GCC、LLVM、GDB、LLDB
- Xcode的编译器发展GCC -> LLVM
- Xcode的调试器的发展GCB -> LLDB
当Xcode真机调试iPhone设备时,会自动将DebugServe安装到手机上,目录是:/Developer/usr/bin/debugserver
,但是只能通过Xcode只能调试Xcode安装的APP
debugserver在mac上的目录:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/De viceSupport/9.1/DeveloperDiskImage.dmg/usr/bin/debugserver
当Xcode识别手机时,就会把debugserve安装到手机的/Developer/usr/bin/debugserver
但是Xcode智能调试,通过Xcode安装的App,如果想通过Xcode调试任意的App,就需要以下的步骤。
debugserver的权限问题
默认情况下,/Developer/usr/bin/debugserver
get-task-allow
task_for_pid-allow
iOS 逆向<7>:Theos的安装及Tweak项目介绍7>
名词介绍
1. Tweak
iOS越狱开发中,各种破解补丁的统称为Tweak,通常意义上我们说的越狱开发,都是指开发一个Tweak.
基本上,tweak都依赖于一个名叫cydia Substrate的动态库,作者是Jay Freeman (@saurik),它的主要功能是hook某个App,修改代码比如替换其中方法的实现,Cydia上的tweak都是基于cydia Substrate实现的。
Tweak的本质:
tweak的实质就是iOS平台的动态库。iOS平台上有两种形势的动态库,dylib与framework。Framework这种开发者用的比较多,而dylib这种就相对比较少一点,比如libsqlite.dylib,libz.dylib等。而tweak用的正是dylib这种形势的动态库。我们可以在设备的/Library/MobileSubstrate/DynamicLibrarie
s目录下查看手机上存在着的所有tweak。这个目录下除dylib外还存在着plist与bundle两种格式的文件,plist文件是用来标识该tweak的作用范围,而bundle是tweak所用到的资源文件。
1. Theos
Theos是一个越狱开发工具包,,它给我们准备好了一些代码模板、预置一些基本的Makefile脚本。Theos是越狱开发工具的首先,因为其最大的特点就是简单。大道至简,Theos的下载安装、编译发布都比较简单,让开发者把精力放到开发上去。
而Tweak是Theos的一个功能模块。
提到Theos还要提到iOSOpenDev
,这是另一个开发工具,整合到Xcode里了,使用起来没有Theos
方便,这里不做过多介绍。
一:安装ldid
使用brew签名工具:ldid
brew install ldid
ldid是用来签名iOS可执行文件的,可以在越狱iOS中取代Xcode自带的codesign
二、修改环境变量
编辑用户的配置文件
vim ~/.bash_profile
在.bash_profile
追加下面两行
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
让刚修改的.bash_profile
,生效
source ~/.bash_profile
三、下载theos
git clone --recursive https://github.com/theos/theos.git $THEOS
四、新建tweak项目
在工程目录执行nic.pl
nic.pl
选择13
, 这里的选择数字不一定,theos目前有人在维护,会增加一些新功能,数字不是唯一,我们看清楚是iphone/tweak
即可
下面说一些选项的填写:
Package Name [com.yourcompany.13]:
项目名称,和Bundle Identifier
类似,一般为到域名,但和不要和宿主APP一样就好,如我们Hook腾讯视频APP(com.tencent.live4iphone):com.live4iphone.tweak
Author/Maintainer Name [mac]:
随便写,可以不填,直接回车
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
这个是宿主APP的Bundle Identifier
,不要写错。可以通过Cycript查看(怎么通过Cycript查看,可以参考文章:iOS-逆向<3>-砸壳.md3>,里面有介绍)。com.tencent.live4iphone
[iphone/tweak] List of applications to terminate upon installation (space-separated, '-' for none) [SpringBoard]:
直接回车即可。
至此填写完毕,输出与打印如下图所示:
五、编写Tweak
一个分为两步,
5.1 填写Makefile
在上边填写通过哪个IP地址和端口连接手机
export THEOS_DEVICE_IP=10.105.12.136
export THEOS_DEVICE_PORT=22
填写完毕,如下所示
export THEOS_DEVICE_IP=10.105.12.136
export THEOS_DEVICE_PORT=22
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = souhutweak
souhutweak_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 SpringBoard"
其他信息可以先不用动,在我们编写复杂Tweak时会有介绍,这里我们用默认的。
5.2 用Reveal分析界面,找到目标class
打开Tweak.xm后,我们可以看到,有注释会告诉我们怎么填写
%hook 要hook的雷鸣
// Hooking a class method
- (instancetype)initWithFrame:(CGRect)frame {
return nil;
}
%end
此时我们要借助于Reveal。这里不介绍详细的步骤,具体可参考文章:iOS-逆向<2>-越狱机用 Reveal 调试任意 App 的界面2>
打开搜狐视频,用Reveal,我们可以看到广告的view是ASAdvertPlayerView
但是可以看到上面的viewcontroller里显示是ASAdvertPlayerViewController_iPhone
,也就是ASAdvertPlayerView
是显示view,其逻辑是在ASAdvertPlayerViewController_iPhone
里,所以我们最好对这两个类都进行hook
类找到了,hook哪个方法呢,这里就用到class-dump
,我们可以把都文件导出,分析找到要hook的哪个类。
分析ASAdvertPlayerView
就很方便的发现其头文件如下:
但是,分析ASAdvertPlayerViewController_iPhone
时发现这个是ASAdvertPlayerViewController
的之类,所以为了更为彻底的hook,我们最好是对ASAdvertPlayerViewController
的方法进行hook
我们查看ASAdvertPlayerViewController
的头文件,可以发现其吃石化方法
5.3 编写Tweak.xm进行Hook
根据上述分析我们编写的hook代码如下:
Tweak.xm的文件内容如下:
%hook ASAdvertPlayerView
// Hooking a class method
- (instancetype)initWithFrame:(CGRect)frame {
return nil;
}
%end
%hook ASAdvertPlayerViewController
// Hooking a class method
- (id)initWithAdvertFrame:(struct CGRect)arg1 delegate:(id)arg2 {
return nil;
}
%end
编写完成后,我们执行以此make
,make package
,make install
,如果没有错误会有两次提升输入手机root密码,然后重启SpringBoard,就可以安装成功。
安装后我们打开搜狐视频就看到已经没有广告了。
六、Tweak插件的卸载
刚才我们的操作是永久有效的,那么如果我们想删除安装插件该怎么操作呢。
打开Cydia
,找到tab:已安装
,切换最近
选项卡
点击右上角的卸载,即可卸载插件
iOS 逆向<3.1>:使用dumpdecrypted砸壳3.1>
在上篇iOS 逆向<3>:砸壳3>我们介绍了,使用Clutch
进行砸壳,这篇介绍另一个使用dumpdecrypted
一、编译 dumpdecrypted
我们要使用的是生成的动态库dumpdecrypted.dylib
,要想得到dumpdecrypted.dylib这个动态库,只需要从github上下载代码,然后进行编译,生成dumpdecrypted.dylib即可。下方就是使用make命令对dumpdecrypted的源码进行编译。
make编译完成后,文件夹中就会多一个dumpdecrypted.dylib动态库,该动态库就是稍后我们砸壳使用的工具。
二、dumpecrypted.dylib 签名
先找到已经在电脑上面安装的苹果开发者证书, 操作如下:
列出可签名证书, 找到 mac 上面已经安装的证书
security find-identity -v -p codesigning
为 dumpecrypted.dylib 签名, 命令如下:
codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib
其中, “iPhone Developer: xxx xxxx (xxxxxxxxxx)” 为你自己本机安装的开发者证书名称.
三 查找目标APP的Main Bundle路径,Sandbox路径
我们需要找到目标APP的Main Bundle路径,Sandbox路径。那么怎么在终端里查找呢。
首先要通过通过ssh连接手机,执行
ssh root@10.105.12.136
收入密码alpine
然后我们有两种方式查找目标APP的两个路径。
3.1: 借助第三方工具
可以安装https://github.com/CoderMJLee/MJAppTools
安装文档安装MJAppTools
后,在通过ssh链接手机后执行
MJAppTools -l
就会列出手机所安装的所有的App
可以看到
Main Bundle路径为:/private/var/containers/Bundle/Application/3E376AA9-1F0E-4939-8D2D-933757835643/SOHUVideo.app
Sandbox路径为:/private/var/mobile/Containers/Data/Application/06D1A964-71D0-4849-B1F6-81126FA187FB
3.2: 原始方式
这种方式,必须先要在手机上打开目标App,
终端执行,过滤出来搜狐APP
ps -e | grep -i so
我们找到了Main Bundle路径为:/var/containers/Bundle/Application/3E376AA9-1F0E-4939-8D2D-933757835643/SOHUVideo.app/SOHUVideo
下面查找 Documents 目录,需要通过cycript了。
终端执行:
cycript -p SOHUVideo
其中,cycript -p XX
后面跟的就是,上面看到的XX.app
的名字。
然后执行cycript脚本:
[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
找到Sandbox路径为:/var/mobile/Containers/Data/Application/06D1A964-71D0-4849-B1F6-81126FA187FB/Documents/
四、砸壳
4.1:拷贝 dumpdecrypted.dylib 到目标APP 沙盒的Documents路径
拷贝 dumpdecrypted.dylib 到目标APP 沙盒的Documents路径下:
可以用scp指令
scp ~/dumpdecrypted.dylib root@10.105.12.136:/private/var/mobile/Containers/Data/Application/A35753BD-A755-47B4-9166-EEAF50CC7F1B/Documents/
其中10.105.12.136
为手机的ip地址,需要和电脑在同一个局域网中。/private/var/mobile/Containers/Data/Application/A35753BD-A755-47B4-9166-EEAF50CC7F1B/Documents/
为搜狐视频APP的Sandbox
沙盒路径
也可以用iFunBox
,找到目标路径直接拖拽。
4.1:开始砸
cd到Document目录下
cd /private/var/mobile/Containers/Data/Application/A35753BD-A755-47B4-9166-EEAF50CC7F1B/Documents/
执行
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /private/var/containers/Bundle/Application/3E376AA9-1F0E-4939-8D2D-933757835643/SOHUVideo.app/SOHUVideo
这个指令有点长,总结一下这个指令是在目标App的Sandbox路径的Documents目标下,执行: DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib (Main Bundle路径)
然后在Document路径下,会生成SOHUVideo.decrypted
文件
使用 iFunBox
或者 scp
命令将 SOHUVideo.decrypted
文件导出,即可进行后续的分析。
iOS 逆向<6>:新工具链介绍6>
最新学习越狱发现大神MJ已经针对越狱开发一些小的使用的工具,
MJAppTools
MJAppTools - 可以列出手机安装的应用信息,包括Bundle Identifier,Main Bundle路径,Sandbox路径,等还是很便捷的。
MJAppTools -l
mjcript
mjcript - 基于Cycript封装了一些实用函数,提高我们调试的便捷性
iOS 逆向<4>:Cycript的介绍和使用4>
简介
Cycript是由saurik推出的一款运行在越狱iPhone上的脚本语言,是混合了objective-c与javascript语法的一个工具,让开发者在命令行下和应用交互,在运行时查看和修改应用。
Cycript安装
在Cydia
中搜索Cycript
直接安装
使用
需要先查找到相应的进行,才能进入,下面以Weibo.app为例
ps -e | grep -i weibo
我们可以看到Weibo.app
的进程id是3518,
输入 cycript -p 进程id
,下面一行变成cy#
,就表示可以输入脚本语言了
cycript -p 3518
退出cycript,没错带有?
?exit
详细使用
想要在Weibo.app界面弹出一个提示框,用cycript的话,只要两句代码就可以了,而且是实时注入的。
cy# alertView = [[UIAlertView alloc] initWithTitle:@"Cycript injection Weibo" message:@"Success" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]
cy# [alertView show]
可以在手机上立马看到效果了:
获取视图结构
UIApp.keyWindow.recursiveDescription().toString()
可以看到视图结构,知识比较复杂
结合Reveal我们知道微博的TabBar是自定义的结构WBTabBarButton
,下面我们把第一个TabBar的文字换成”TaoBao”
cy# #0x1105baca0
#"<WBTabBarButton: 0x1105baca0; baseClass = UIButton; frame = (64 0; 64 44); opaque = NO; layer = <CALayer: 0x1105b6590>>"
可以看到WBTabBarButton是UIButton的子类,所以我们通过
[#0x1105baca0 setTitle:@"TaoBao" forState:0]
可以看到已经有效果了,Cycript可以实现无侵入,修改代码了
iOS 逆向<3>:砸壳3>
砸壳, 指的是将从 App Store 上面下载的 App 进行破解的过程. 从 App Store 上下载的 ipa 包中的二进制文件是经过 Apple 加密(加壳)的,需要通过破解才能让我们对其 为所欲为, 这里的破解就是通常所说的砸壳.
准备工具
- iFunBox 或者 itools
- Clutch 或 dumpdecrypted
- 越狱手机一台
安装iFunBox
iFunBox 是一个可以浏览 iPhone 文件目录的文件管理工具, 支持 MacOS 和 Windows 两个平台.
点击 iFunBox 下载地址 可以去下载 MacOS 版本的 iFunBox,目前最新版本是 1.8,
安装 Apple File Conduit
要想使用 iFunBox 需要在 Cydia 中安装 Apple File Conduit”2”
在 Cydia 中搜索 Apple File Conduit
, 如下图所示.
如果你没有搜索到, 需要自己添加对应的软件源地址.
点击【软件源】–编辑/添加 –输入源地址 apt.25pp.com – 添加源, 然后再去搜索 Apple File Conduit 安装.
安装好之后, 使用 iFunBox, 才能正常查看越狱后 iPhone 的系统目录,否则是无法通过 iFunBox 查看系统路径的。
使用 iFunBox
手机插上 USB 连接上 Mac 电脑, iFunBox 就可以识别你的手机,点击 Raw File System 其实是看不到 iPhone 的系统目录的, 接下来在 iPhone 中安装另外一个软件就可以了.
phone上的准备工作
mac上一些准备工作介绍完毕,下面开始iphone上的准备工作了,
砸壳:安装 Clutch
Clutch 源码地址, 然后自己在 MacOS 上面编译得到二进制文件.
Clutch 二进制包, 可直接使用, 目前最新 Clutch 版本为 2.0.4.
下载完成后, 存放为 ~/Downloads/Clutch
准备好越狱设备, 保证可以正常连接 wifi, 使用 scp 命令将 Clutch 二进制文件复制到设备的系统目录中, 命令如下:
scp ~/Downloads/Clutch root@10.105.12.42:/usr/bin
其中, 10.105.12.42
是越狱设备和Mac在同一个局域网连接 wifi 后的 IP 地址.
也可使用 iFunBox 把Clutch传输到越狱手机的/usr/bin
路径下
Clutch 的使用
SSH 连接越狱设备,
ssh root@10.105.12.42
输入密码:alpine
给Clutch权限
chmod +x /usr/bin/Clutch
Clutch 命令选项如下:
-b --binary-dump Only dump binary files from specified bundleID
-d --dump Dump specified bundleID into .ipa file
-i --print-installed Print installed application
--clean Clean /var/tmp/clutch directory
--version Display version and exit
-? --help Display this help and exit
-b 选项表示产出一个二进制文件, -d 选项表示产出一个 ipa 文件, -i 表示列出手机上面已经安装的 APP.
首先,我们先看一下手机上已经安装的 App, 命令如下:
Clutch -i
就会列出手机上已安装的 APP 列表,这些 APP 前面的数字表示指定的 id. -d 和 -b 选项都需要指定这些 id.
砸
我们现在开始使用 Clutch 来对 APP 进行砸壳操作, 这里以已经安装的 App 序号为 6 的为例子.
使用下面的命令开始砸壳:
Clutch -d 6
效果如下图所示:
砸壳成功后会在 /private/var/mobile/Documents/Dumped 这个目录生成对应的 *.ipa 文件. 如下图所示
如下图砸快手就失败了,所以Clutch
也不是万能的,具体问题还要具体分析
砸壳后的 ipa 文件, 可以从 iFunBox 中复制到 MacOS 的目录中, 然后你就可以对该 ipa 进行下一步操作了,后续的越狱工作, 在新更新的博客中会有提及。
三: 使用dumpdecrypted
砸壳
我们要使用的是生成的动态库dumpdecrypted.dylib
,要想得到dumpdecrypted.dylib这个动态库,只需要从github上下载代码,然后进行编译,生成dumpdecrypted.dylib即可。下方就是使用make命令对dumpdecrypted的源码进行编译。
make编译完成后,文件夹中就会多一个dumpdecrypted.dylib动态库,该动态库就是稍后我们砸壳使用的工具。
3.1 查找目标APP所在进程
砸壳后的分析工作
使用Clutch
和dumpdecrypted
都是可以的,那个顺手用哪个,我们的关键认为是使用脱壳后的APP进行一些逆向工作,下面进行介绍。
把上一步生成的com.tencent.live4iphone-iOS9.0-(Clutch-2.0.4).ipa
导入电脑,后缀改为com.tencent.live4iphone-iOS9.0-(Clutch-2.0.4).zip
,然后解压,
然后右键显示包内容
,根据关键字live4iphone
,找到unix可执行文件:Mash-O文件
把live4iphone
可执行文件,拷贝到一个专门的文件夹,进行后续的导出头文件以及查看实现逻辑
五:class-dump导出脱壳App的头文件
class-dump 官方网址:http://stevenygard.com/projects/class-dump/
class-dump的作用就是把脱壳后Mach-O文件的class信息给dump出来(把类信息给导出来,包括私有方法),生成对应的.h头文件,没有脱壳是无法生生成头文件的
下载完工具包以后将class-dump
文件复制到Mac的/usr/local/bin
目录,这样在终端就能识别class-dump
命令了
执行赋权限的代码
chmod +x /usr/local/bin/class-dump
命令的格式:class-dump -H Mach-O文件路径 -o 头文件存放目录
ps: -H表示要生成头文件 -O用于制定头文件的存放目录
下图是利用腾讯视频APP进行的头文件分析:
六:使用Hopper生成伪码
class-dump可以把是把脱壳后APP的Mach-O,头文件导出来,如果我们想看一下实现逻辑就要使用Hopper了
根据class-dump
生成的头文件的方法,我们来看一下实现,如我们选择刚才Headers文件夹下的QLThirdPartyVideoTipView
这里看的比较模糊,
我们点击顶部菜单的if(b) f(x)
菜单,即可生成较为接近伪码的逻辑。
至此,基本结束完整个砸壳以及导出头文件和查看逻辑实现的基本流程。学艺不精,如有疏漏,还望见谅。
iOS 逆向<2>:越狱机用 Reveal 调试任意 App 的界面2>
没有越狱的时候,我们可以使用 Reveal
调试我们自己开发的APP的界面,比较好用,但是如果我们想查看别人APP的界面,想了解别人界面用什么实现的,用越狱机可以实现。
准备工具
- 一台越狱iPhone
- Mac下安装Reveal 4
- Mac, iPhone需在同一局域网下
如何越狱,这里不再累述,目前新版本的系统已经无法越狱了,可以使用就机器,如果为了学习可以使用万能的某宝,某鱼。
Cydia安装插件
Cydia Substrate
: 是大部分tweak工作的基础;
Reveal2Loader
:不再需要手动导入Reveal.lib, 以及配置plist
注意不是Reveal Loader
, Reveal Loader
已经过期,如果看过《iOS应用逆向工程-第二版》书的小伙伴就会发现书中作者用的就是Reveal Loader
,知识一直在更新,我们要随时补充啊。
Reveal2Loader设置
安装Reveal2Loader
后, 手机设置界面会出现Reveal
,如下图:
点进去Enable Applications
,选择想要查看界面的app,打开开关
调试界面
前提: 越狱手机直接USB链接Mac,或者 mac 与 iphone在同一局域网下
在iPhone启动待调试的App, 确保其在前台
在Mac下启动Reveal, 界面会出现待调试的App