Reveal
- 簡介
- Xcode6開始蘋果已經(jīng)將Reveal查看自己開發(fā)程序界面信息的功能集成到了Xcode中, 程序運行起來之后點擊Debug View hierarch按鈕即可檬贰,但是會有部分信息不顯示吼畏,布局顯示不精確伺糠。
- 相比xcode自帶的視圖調(diào)試(只能看),reveal強大的不是一丁點叁幢,可以修改視圖的屬性饵沧,并實時在模擬器(真機)上顯示變化巧娱。(當然只是臨時修改的屬性,不會修改工程的實際代碼逾滥,如果真實修改峰档,還是需要修改的工程源代碼的)。
- reveal最強大的一點是可以通過它查看和分析其他App視圖元素構(gòu)成和布局寨昙。
- 下載地址: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設備置于同一個局域網(wǎng)內(nèi))
(1). cydia搜索Reveal Loader安裝
(2). ssh連接iphone
ssh root@192.168.0.101
(3). 安裝后去到 /Library路徑下是看是否有RHRevealLoader目錄
cd /Library/
(4). 如果沒有自己新建一個,然后將Reveal中的iOS動態(tài)庫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軟件的動態(tài)庫所在目錄
Mac上的Reveal自帶了兩個庫,一個是libReveal.dylib缆巧,一個是Reveal.framework布持。在未越獄的設備上使用庫是后者。
<1> 在mac上安裝好Reveal后打開陕悬,Help->Show Reveal Library In Finder->iOS Library题暖,就可以看到libReveal.dylib,這是越獄環(huán)境下要用的。
<2> 重新打開一個Terminal芙委,使用如下命令:
//找到目錄
cd /Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries
//打開文件夾
open .
<3>安裝iExplorer逞敷。iExplorer可以查看你的Mac上所有iOS設備的備份文件,當然也包括非越獄設備的備份文件
如何在項目中集成Reveal
1.reveal官方有中文集成的教程灌侣。介紹了靜態(tài)庫推捐、動態(tài)庫、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可以幫助我們調(diào)試應用痊乾。debug server在我們的設備連接Xcode調(diào)試時已經(jīng)被安裝在設備的/Developer/usr/bin中皮壁,但由于權(quán)限問題只能調(diào)試我們自己的App,還需要做一下配置哪审。
(1) ssh連接iPhone,從設備中拷貝debugserver到本地
cd /Developer/usr/bin
scp debugserver zl@192.168.0.102:/Users/zl/Desktop
(2) 給debugserver瘦身和重新簽名蛾魄,并放入/usr/bin/目錄下方便隨時調(diào)用(mac終端)
lipo -thin arm64 ./debugserver -output ./debugserver-arm64
(3) 配置task_for_id權(quán)限(mac終端)
下載http://iosre.com/ent.xml到debugserver所在目錄(確保已經(jīng)安裝了ldid)
ldid -Sent.xml debugserver-arm64
(4) 將處理過的debugserver放回iPhone,并配置x權(quán)限
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"
表示依附在微信上監(jiān)聽來自任意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湿滓,出現(xiàn)上面結(jié)果就是連接成功了滴须。
- 方式二: 使用usbmuxd工具通過USB口轉(zhuǎn)發(fā)ssh和調(diào)式信息
下載地址:
http://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz
使用配置:下載完成后保存在桌面
cd /Users/zl/Desktop/usbmuxd-1.0.8/python-client
//添加執(zhí)行權(quán)限
chmod +x tcprelay.py
./tcprelay.py -t 22:2222
使用方式:
完全脫離WiFi,使用USB連接到iOS叽奥,用lldb調(diào)試WeChat扔水。
i) 把本地2222(這個端口監(jiān)聽ssh)端口轉(zhuǎn)發(fā)到iOS的22端口(終端處于監(jiān)聽狀態(tài))
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端口轉(zhuǎn)發(fā)到iOS的6789端口(再開一個終端)
cd /Users/zl/Desktop/usbmuxd-1.0.8/python-client
./tcprelay.py -t 6789:6789
iv) 用lldb開始調(diào)試(再開一個終端)
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
...
上面的信息中, 左邊方括號的數(shù)字代表模塊的序號, 第二列如0x00035000代表ASLR偏移, 簡單理解為位移即可, 第三列代表模塊的全路徑, 括號后代表位移之后的起始地址. 我們關(guān)注的主要是第二列的位移.
B. 斷點設置
(lldb) br s -a address
如在某個地址前面打一個斷點, address代表十六進制的地址, 如下:
(lldb) br s -a 0x00234a
我們可以通過IDA反編譯二進制文件, 然后定位目標函數(shù)的位置, 找到偏移前的基地址, 然后通過LLDB查看ASLR偏移, 兩者相加, 即可找到目標函數(shù)的在運行時的真實地址, 通過上面的斷點設置, 直接在該目標函數(shù)下斷點. 來驗證我們的一些推理, 用以進一步的查找以及逆向.
C.斷點相關(guān)設置
當進程停止, 可輸入"c"讓進程繼續(xù):
(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
在執(zhí)行某個指令之前, 預先設置一些指令:
(lldb) br del 8
打印寄存器的值:
(lldb) p $r6
執(zhí)行下一條指令, 并且進入函數(shù)體:
(lldb) ni
執(zhí)行下一條指令, 并且不進入函數(shù)體:
(lldb) si
給指定的寄存器賦值, 用以驗證分支:
(lldb) register write r5 0
上述命令作用為修改r5寄存器的值為0.
參考博客 http://www.cnblogs.com/ludashi/p/5730338.html
Hopper Disassembler
- 簡介
是一款是32位和64位的二進制反匯編工具,反編譯和調(diào)試朝氓∧校基本上滿足了工作上的反匯編的需要,包括偽代碼以及控制流圖(Control Flow Graph)赵哲,支持ARM指令集并針對Objective-C的做了優(yōu)化待德。 - 下載鏈接
www.sdifen.com/hopperdisassembler408.html
鏈接里面安裝破解版非常詳細 - 官網(wǎng)
https://www.hopperapp.com/
與 IDA 相同,官網(wǎng)也提供了 Demo 的試用版枫夺。試用版也可以進行反匯編磅网,但是不能保存 *.hop 文件。所以筷屡,用于學習的話 Hopper 的 Demo 版就足夠了涧偷。 -
使用Hopper
與 IDA 不同, Hopper 不能直接將 Mach-O 文件導入工作區(qū)毙死,需要下載應用的 *.ipa 文件燎潮,并將文件后綴改為 *.zip,解壓該 zip 文件后就可看到 Payload 文件目錄扼倘,在該目錄下就存有對應應用的 package 包文件(. app 文件)确封,將.app文件拖入Hopper分析除呵。
01.png
當 Hopper 分析完全部二進制后,按住 Option + Enter 鍵爪喘,就可看到 Hopper 反編譯后的偽代碼.
與 IDA 相比颜曾, Hopper 反編譯后的偽代碼的邏輯與 IDA 反編譯得到的偽代碼邏輯類似,但多了 r0~r8 等寄存器秉剑,閱讀性相較而言差一些泛豪,但是,仍然可以根據(jù)偽代碼還原出源代碼.
Hopper 除了可以查看匯編代碼以外侦鹏,還可以直接對 Mach-O 文件進行修改诡曙,然后重新生成二進制文件(Demo 版沒有這個功能)。