Reveal
- 简介
- Xcode6开始苹果已经将Reveal查看自己开发程序界面信息的功能集成到了Xcode中, 程序运行起来之后点击Debug View hierarch按钮即可,但是会有部分信息不显示,布局显示不精确。
- 相比xcode自带的视图调试(只能看),reveal强大的不是一丁点,可以修改视图的属性,并实时在模拟器(真机)上显示变化。(当然只是临时修改的属性,不会修改工程的实际代码,如果真实修改,还是需要修改的工程源代码的)。
- reveal最强大的一点是可以通过它查看和分析其他App视图元素构成和布局。
- 下载地址:http://revealapp.com/。
是一个收费软件,可以免费试用30天。 - 准备工作
以下都是在cydia下载
1. OpenSSH
一个允许其他终端远程访问当前设备的插件
2. Apple File Conduit 2
一个确保越狱插件正常运行的补丁
3. Cycript
Cycript是一款由saurik推出的脚本语言,可以帮助我们测试App
4. Reveal Loader
RevealLoader帮助我们通过Reveal来偷窥别人的应用
- 越狱使用方式(Reveal软件所在的mac设备与越狱后的iOS设备置于同一个局域网内)
(1). cydia搜索Reveal Loader安装
(2). ssh连接iphone
ssh root@192.168.0.101
(3). 安装后去到 /Library路径下是看是否有RHRevealLoader目录
cd /Library/
(4). 如果没有自己新建一个,然后将Reveal中的iOS动态库libReveal.dylib复制到此目录下
cd /Library
mkdir RHRevealLoader
cd RHRevealLoader
scp zl@192.168.0.102:/Users/zl/Desktop/iOSRE/libReveal.dylib .
(5).上面的都做好以后,ihpone里找到 设置->Reveal->Enable Applications,然后打开你需要看的app,再在mac上打开Reveal,连接到你的iphone,就可以使用了。(注意要让app处于前台)
注:如何找到Reveal软件的动态库所在目录
Mac上的Reveal自带了两个库,一个是libReveal.dylib,一个是Reveal.framework。在未越狱的设备上使用库是后者。
<1> 在mac上安装好Reveal后打开,Help->Show Reveal Library In Finder->iOS Library,就可以看到libReveal.dylib,这是越狱环境下要用的。
<2> 重新打开一个Terminal,使用如下命令:
//找到目录
cd /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries
//打开文件夹
open .
<3>安装iExplorer。iExplorer可以查看你的Mac上所有iOS设备的备份文件,当然也包括非越狱设备的备份文件
如何在项目中集成Reveal
1.reveal官方有中文集成的教程。介绍了静态库、动态库、cocoapod的安装方法(这三种建议选这种):
http://support.revealapp.com/kb/getting-started/reveal
上面的集成方式多少需要在我们的工程项目中加入一些代码,可能有些同事并不想使用这玩意,所以应该在团队中慎用。
2.下面这个方法不需要在工程中加入任何代码就可以使用:
http://support.revealapp.com/kb/getting-started/revealxcodereveal
3.一劳永逸的最佳集成:
http://blog.ittybittyapps.com/blog/2013/11/07/integrating-reveal-without-modifying-your-xcode-project/
LLDB & debug server
LLDB & debug server可以帮助我们调试应用。debug server在我们的设备连接Xcode调试时已经被安装在设备的/Developer/usr/bin中,但由于权限问题只能调试我们自己的App,还需要做一下配置。
(1) ssh连接iPhone,从设备中拷贝debugserver到本地
cd /Developer/usr/bin
scp debugserver zl@192.168.0.102:/Users/zl/Desktop
(2) 给debugserver瘦身和重新签名,并放入/usr/bin/目录下方便随时调用(mac终端)
lipo -thin arm64 ./debugserver -output ./debugserver-arm64
(3) 配置task_for_id权限(mac终端)
下载http://iosre.com/ent.xml到debugserver所在目录(确保已经安装了ldid)
ldid -Sent.xml debugserver-arm64
(4) 将处理过的debugserver放回iPhone,并配置x权限
scp debugserver-arm64 root@192.168.0.101:/usr/bin/debugserver
ssh root@192.168.0.101
chmod +x /usr/bin/debugserver
(5) 使用方式
- 方式一: Wi-Fi连接(速度较慢)
ssh root@192.168.0.101
debugserver *:1234 -a "WeChat"
表示依附在微信上监听来自任意ip:1234的lldb请求
ssh root@192.168.0.101
iPhone:~ root# debugserver *:1234 -a "WeChat"
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-340.3.51.1
for arm64.
Attaching to process WeChat...
Listening to port 1234 for a connection from *...
process connect connect://192.168.0.101:1234
lldb
(lldb) process connect connect://192.168.0.101:1234
Process 826 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
frame #0: 0x0000000196da9be8 libobjc.A.dylib`objc_msgSend + 40
libobjc.A.dylib`objc_msgSend:
-> 0x196da9be8 <+40>: br x17
0x196da9bec <+44>: cbz x16, 0x196da9d80 ; _objc_msgSend_uncached_impcache
0x196da9bf0 <+48>: cmp x12, x10
0x196da9bf4 <+52>: b.eq 0x196da9c00 ; <+64>
(lldb)
连接到设备上的debugserver,出现上面结果就是连接成功了。
- 方式二: 使用usbmuxd工具通过USB口转发ssh和调式信息
下载地址:
http://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz
使用配置:下载完成后保存在桌面
cd /Users/zl/Desktop/usbmuxd-1.0.8/python-client
//添加执行权限
chmod +x tcprelay.py
./tcprelay.py -t 22:2222
使用方式:
完全脱离WiFi,使用USB连接到iOS,用lldb调试WeChat。
i) 把本地2222(这个端口监听ssh)端口转发到iOS的22端口(终端处于监听状态)
cd /Users/zl/Desktop/usbmuxd-1.0.8/python-client
./tcprelay.py -t 22:2222
ii) ssh过去并用debugserver attach到WeChat(新开一个终端)
ssh root@localhost -p 2222
debugserver *:6789 -a "WeChat"
iii) 把本地6789端口转发到iOS的6789端口(再开一个终端)
cd /Users/zl/Desktop/usbmuxd-1.0.8/python-client
./tcprelay.py -t 6789:6789
iv) 用lldb开始调试(再开一个终端)
lldb
process connect connect://localhost:1234
- LLDB常用的命令
A. 显示当前所有进程信息
(lldb) image list -o -f
回车后, 即可看到以下信息
[ 0] 0x00035000 /System/Library/CoreServices/SpringBoard.app/SpringBoard(0x0000000000036000)
[ 1] 0x00019000 /Users/mac/Library/Developer/Xcode/iOS DeviceSupport/7.1.2 (11D257)/Symbols/usr/lib/dyld
[ 2] 0x00453000 /Library/MobileSubstrate/MobileSubstrate.dylib(0x0000000000453000)
[ 3] 0x0182f000 /Users/mac/Library/Developer/Xcode/iOS DeviceSupport/7.1.2 (11D257)/Symbols/System/Library/PrivateFrameworks/StoreServices.framework/StoreServices
...
上面的信息中, 左边方括号的数字代表模块的序号, 第二列如0x00035000代表ASLR偏移, 简单理解为位移即可, 第三列代表模块的全路径, 括号后代表位移之后的起始地址. 我们关注的主要是第二列的位移.
B. 断点设置
(lldb) br s -a address
如在某个地址前面打一个断点, address代表十六进制的地址, 如下:
(lldb) br s -a 0x00234a
我们可以通过IDA反编译二进制文件, 然后定位目标函数的位置, 找到偏移前的基地址, 然后通过LLDB查看ASLR偏移, 两者相加, 即可找到目标函数的在运行时的真实地址, 通过上面的断点设置, 直接在该目标函数下断点. 来验证我们的一些推理, 用以进一步的查找以及逆向.
C.断点相关设置
当进程停止, 可输入"c"让进程继续:
(lldb) c
"c"即continue.
禁用所有断点:
(lldb) br dis
"dis"即disable, "br"即breakpoint.
禁用某个断点:
(lldb) br dis 6
6代表第几个断点.
启动所有断点:
(lldb) br en
启动某个断点:
(lldb) br en 5
删除所有断点:
(lldb) br del
删除某个断点:
(lldb) br del 5
在执行某个指令之前, 预先设置一些指令:
(lldb) br del 8
打印寄存器的值:
(lldb) p $r6
执行下一条指令, 并且进入函数体:
(lldb) ni
执行下一条指令, 并且不进入函数体:
(lldb) si
给指定的寄存器赋值, 用以验证分支:
(lldb) register write r5 0
上述命令作用为修改r5寄存器的值为0.
参考博客 http://www.cnblogs.com/ludashi/p/5730338.html
Hopper Disassembler
- 简介
是一款是32位和64位的二进制反汇编工具,反编译和调试。基本上满足了工作上的反汇编的需要,包括伪代码以及控制流图(Control Flow Graph),支持ARM指令集并针对Objective-C的做了优化。 - 下载链接
www.sdifen.com/hopperdisassembler408.html
链接里面安装破解版非常详细 - 官网
https://www.hopperapp.com/
与 IDA 相同,官网也提供了 Demo 的试用版。试用版也可以进行反汇编,但是不能保存 *.hop 文件。所以,用于学习的话 Hopper 的 Demo 版就足够了。 -
使用Hopper
与 IDA 不同, Hopper 不能直接将 Mach-O 文件导入工作区,需要下载应用的 *.ipa 文件,并将文件后缀改为 *.zip,解压该 zip 文件后就可看到 Payload 文件目录,在该目录下就存有对应应用的 package 包文件(. app 文件),将.app文件拖入Hopper分析。
当 Hopper 分析完全部二进制后,按住 Option + Enter 键,就可看到 Hopper 反编译后的伪代码.
与 IDA 相比, Hopper 反编译后的伪代码的逻辑与 IDA 反编译得到的伪代码逻辑类似,但多了 r0~r8 等寄存器,阅读性相较而言差一些,但是,仍然可以根据伪代码还原出源代码.
Hopper 除了可以查看汇编代码以外,还可以直接对 Mach-O 文件进行修改,然后重新生成二进制文件(Demo 版没有这个功能)。