iOS逆向工程需要用到越獄手機(jī), 需要注意的是9.2以下(不含9.2)的系統(tǒng)均可通過(guò)pp越獄助手進(jìn)行越獄, 而9.2-9.3.3的系統(tǒng)需要設(shè)備是64位才可以進(jìn)行越獄, 32位的系統(tǒng)暫不支持越獄,安裝9.3.3以上系統(tǒng)的設(shè)備暫不支持完美越獄.10以上的系統(tǒng)可以通過(guò)yalu進(jìn)行不完美越獄, 所以建議10以下的完美越獄
第一步: 越獄
使用pp越獄助手進(jìn)行越獄,官方地址,一鍵式越獄,方便快捷,按步驟提示就可以完成越獄.需要提醒的兩點(diǎn)是, 從安全的角度考慮不推薦普通用戶越獄, 還有一點(diǎn)是, 越獄記得備份重要數(shù)據(jù), 越獄不成功有可能丟失數(shù)據(jù), 當(dāng)然如果您用的是測(cè)試機(jī)就無(wú)所謂啦, 任意折騰, 盡情發(fā)揮~!
第二步: 安裝OpenSSH及配置
越獄成功后, 就會(huì)多出個(gè)Cydia, 這個(gè)可是越獄后的神器. Cydia可以安裝各種越獄插件, 當(dāng)然也可以安裝各種越獄軟件, 當(dāng)然最主要的就是用來(lái)逆向開發(fā).
接著, 打開Cydia, 系統(tǒng)會(huì)自動(dòng)進(jìn)行一些更新升級(jí), 需要等待一段時(shí)間, 加載完畢之后, 點(diǎn)擊搜索, 輸入openssh, 選擇安裝. 安裝完這個(gè)工具后可以讓你從mac登錄進(jìn)越獄設(shè)備, 然后進(jìn)行一些基本操作. 想一下是不是很激動(dòng), 可以通過(guò)電腦來(lái)控制手機(jī)啦~! 既然可以實(shí)現(xiàn)自己電腦控制手機(jī), 那么從其他電腦也可以登入您的手機(jī)(默認(rèn)密碼都是alpine), 也就導(dǎo)致了手機(jī)的不安全, 所以強(qiáng)烈建議您更改ssh的密碼.
Ikee, iOS上的一種蠕蟲病毒, 通過(guò)使用默認(rèn)密碼alpine入侵安裝了openssh的越獄設(shè)備, 然后所有數(shù)據(jù), 包括電話本, 短信, 甚至Apple ID都有可能被竊取.所以強(qiáng)烈建議您修改ssh密碼
(1)修改ssh密碼
首先打開ssh通道, 終端輸入一下命令,
ssh root@您的手機(jī)IP地址
進(jìn)入ssh后, iOS上的用戶有2個(gè), 分別是root和mobile, 修改密碼的命令:
passwd root
修改root的密碼, 按提示輸入新的密碼然后回車即可
passwd mobile
修改mobile的密碼,按提示輸入新的密碼然后回車即可
(2)保存ssh密碼到本機(jī), 不用每次都輸入ssh密碼
每次通過(guò)ssh連接手機(jī), 都要輸入密碼, 那應(yīng)該有方法保存密碼到本地里, 就不用每次輸密碼了吧? 思路很好, 方法馬上呈現(xiàn):
1.打開Finder, 快捷鍵執(zhí)行
cmd+shift+g
即快速前往文件夾, 輸入 ~, 然后回車
找到.ssh文件夾里面的known_hosts文件, 打開. 如果看不到.ssh文件可能是你系統(tǒng)隱藏了系統(tǒng)文件, Terminal執(zhí)行下面命令, 后面是注釋不用加, 顯示系統(tǒng)隱藏文件:
$:defaults write com.apple.finder AppleShowAllFiles -bool true //Finder顯示系統(tǒng)文件
$:defaults write com.apple.finder AppleShowAllFiles -bool false //Finder隱藏系統(tǒng)文件
1 ) 打開known_hosts, 找到iOS設(shè)備所在的那一行. 如下所示:
192.168.0.117 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDdeksdfXpX9uvzGU25bQ2Rbyx571Hv40K3tar3QFNLa2cOgFTkAriUn2Nx6+j9PV8OtvxbagY4/+syR41TMUFuSTgbZX64zfDBRgStmPVaVbG2y0PoGT+e/scpJ8Ep0sKIqTctZbsdfFyUk8qva+5zvtJDRlYBS+vaC3MsSO6UeGaonTEx6SAY7FOkVe3/KkEWlM1Env/mFSEOzIa6eefluJB+OIK8WmcxLQJY66QCqp5HYUMneXTcuBK/3obWcsdfQKlLZ87k8KuYT21sv88wh+uf9oUTao206rhMBrJEKtG7i26W8EMdh4O4H8Cu2oligQ+pRxupi22OlT6f/BJ
完整刪除上面這些, 關(guān)閉.
2 )生成authorized_keys
在Terminal中執(zhí)行如下命令:
willys-MBP% ssh-keygen -t rsa //這是第一條命令
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/mac/.ssh/id_rsa): /Users/mac/.ssh/id_rsa //換成自己的目錄
/Users/mac/.ssh/id_rsa already exists.
Overwrite (y/n)? y //選y
Enter passphrase (empty for no passphrase): //直接回車
Enter same passphrase again: //回車
Your identification has been saved in /Users/mac/.ssh/id_rsa.
Your public key has been saved in /Users/mac/.ssh/id_rsa.pub.
/Users/mac/.ssh/id_rsa換成自己的.ssh文件下的id_rsa目錄, 提示密碼時(shí), 直接回車不設(shè)置密碼即可.
然后生成authosrized_keys
willys-MBP% cp /Users/mac/.ssh/id_rsa.pub ~/authorized_keys //這是第二條命令
3 )配置iOS
willys-MBP% ssh root@192.168.1.114 //先ssh連接iPhone
root@192.168.1.114's password: //這里需要ssh密碼
lizhifengdemacde-iPhone:~ root# ssh-keygen //第一條命令
Generating public/private rsa key pair.
Enter file in which to save the key (/var/root/.ssh/id_rsa): /var/root/.ssh/id_rsa
/var/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y //選y
Enter passphrase (empty for no passphrase): //直接回車
Enter same passphrase again: //再回車
Your identification has been saved in /var/root/.ssh/id_rsa.
Your public key has been saved in /var/root/.ssh/id_rsa.pub.
macde-iPhone:~ root# logout //退出ssh
Connection to 192.168.1.114 closed.
willys-MBP% scp ~/authorized_keys root@192.168.1.114:/var/root/.ssh //把mac上的authorized_keys拷貝到手機(jī)的.ssh下
root@192.168.1.114's password: //再次需要ssh密碼
authorized_keys 100% 402 0.4KB/s 00:00
willys-MBP% ssh root@192.168.1.114 //配置完成, 以后ssh都不需要手動(dòng)輸入密碼了
lizhifengdemacde-iPhone:~ root# //直接進(jìn)入ssh
至此, 完成ssh的配置.
(2)ssh常用命令
1 )連接ios設(shè)備:
ssh root@192.168.1.102
后面換成iOS設(shè)備的IP地址
2 )把文件從本地拷貝到iOS上, 中間為mac文件地址, 后面為iOS地址
scp ~/1.png root@192.168.1.102:/var/tmp/
3 )把文件從iOS拷貝到電腦, 原理類似
scp root@192.168.1.102:/var/log/syslog ~/ioslog
第三步: usbmuxd配置及使用
先來(lái)看看usbmuxd的官方介紹:
A socket daemon to multiplex connections from and to iOS devices.
即用來(lái)連接iOS設(shè)備的傳輸, 在逆向工程里面我們主要拿來(lái)連接iOS設(shè)備, 上面我們用到的ssh是通過(guò)wifi進(jìn)行傳輸, 而usbmuxd就是可以讓我們通過(guò)USB連接設(shè)備, ssh調(diào)試我們的設(shè)備. 加快設(shè)備的連接速度, 在后面說(shuō)到的lldb以及debugserver就會(huì)用到usbmuxd用來(lái)加快連接速度.
下載usbmuxd, 下載地址下載完成之后, 解壓后得到幾個(gè)文件, 我們需要用到的是tcprelay.py這個(gè)文件, usbmuxd的用法也比較簡(jiǎn)單, 先介紹加快ssh的速度:
1 ) 新建第一個(gè)Terminal窗口, 把tcprelay.py拖入Terminal, 在Terminal中輸入
/Users/mac/Downloads/USBSSH/tcprelay.py -t 遠(yuǎn)程iOS上的端口:本地OSX/Windows上的端口
即可把本地OSX/Windows上的端口轉(zhuǎn)發(fā)到遠(yuǎn)程iOS上的端口灵莲,如
/Users/mac/Downloads/USBSSH/tcprelay.py -t 22:2222
出現(xiàn)如下,就說(shuō)明是在等待轉(zhuǎn)發(fā)狀態(tài)了
willys-MBP% /Users/mac/Downloads/USBSSH/tcprelay.py -t 22:2222
Forwarding local port 2222 to remote port 22
...
2 )再新建一個(gè)Terminal窗口, Terminal輸入如下命令:
ssh root@localhost -p 2222
就可以通過(guò)USB連接設(shè)備了,如下
willys-MBP% ssh root@localhost -p 2222
macde-iPhone:~ root#
當(dāng)然了, 也可以直接通過(guò)pp助手一鍵傻瓜式打開, 然后Terminal按提示輸入即可如圖:
后續(xù)再補(bǔ)充在LLDB與debugserver下, usbmuxd的使用.
第四步: 安裝Cycript
Cydia搜索Cycript, 下載安裝既可.
具體使用, 可參考這篇教程
第五步: 配置LLDB與debugserver
只要做過(guò)iOS開發(fā)的, xcode默認(rèn)安裝了LLDB, iOS設(shè)備被調(diào)試過(guò)后也會(huì)默認(rèn)安裝了debugserver, 無(wú)需安裝. 在此說(shuō)了一下LLDB(電腦端)及debugserver(手機(jī)端)以及兩者結(jié)合usbmuxd的使用.
一. debugserver的用法
1 ) 用debugserver啟動(dòng)或附加進(jìn)程
ssh連接設(shè)備, 然后輸入以下命令:
lizhifengdemacde-iPhone:~ root# debugserver *:1234 -a "SpringBoard"
*代表接收任何IP地址的連接, 1234代表端口, -a表示附加的意思, 后面雙引號(hào)內(nèi)代表要附加的進(jìn)程名字.
二. LLDB的用法
1 )啟動(dòng)LLDB, Terminal輸入以下命令, 回車就可以啟動(dòng)LLDB調(diào)試器了.
/Applications/Xcode.app/Contents/Developer/usr/bin/lldb
具體LLDB目錄根據(jù)xcode所在目錄決定.本人為了方便, 給lldb制作了"替身"(相當(dāng)于windows的快捷方式), 然把"替身"放在桌面, 用到lldb的時(shí)候, 右鍵顯示原身, 然后拖入Terminal即可. 當(dāng)然也可以直接把上面這行代碼保存到文檔, 直接復(fù)制粘貼也可以. 各位大神各顯神通.
2 ) 連接iOS設(shè)備, Terminal輸入以下命令:
(lldb) process connect connect://192.168.1.114:1234
至此, 就完成了lldb跟debugserver的連接. 接下來(lái)介紹lldb的常用命令:
3 )lldb常用的命令
A. 顯示當(dāng)前所有進(jìn)程信息
(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
...
上面的信息中, 左邊方括號(hào)的數(shù)字代表模塊的序號(hào), 第二列如0x00035000代表ASLR偏移, 簡(jiǎn)單理解為位移即可, 第三列代表模塊的全路徑, 括號(hào)后代表位移之后的起始地址. 我們關(guān)注的主要是第二列的位移.
B. 斷點(diǎn)設(shè)置
(lldb) br s -a address
如在某個(gè)地址前面打一個(gè)斷點(diǎn), address代表十六進(jìn)制的地址, 如下:
(lldb) br s -a 0x00234a
我們可以通過(guò)IDA反編譯二進(jìn)制文件, 然后定位目標(biāo)函數(shù)的位置, 找到偏移前的基地址, 然后通過(guò)LLDB查看ASLR偏移, 兩者相加, 即可找到目標(biāo)函數(shù)的在運(yùn)行時(shí)的真實(shí)地址, 通過(guò)上面的斷點(diǎn)設(shè)置, 直接在該目標(biāo)函數(shù)下斷點(diǎn). 來(lái)驗(yàn)證我們的一些推理, 用以進(jìn)一步的查找以及逆向.
C.斷點(diǎn)相關(guān)設(shè)置
當(dāng)進(jìn)程停止, 可輸入"c"讓進(jìn)程繼續(xù):
(lldb) c
"c"即continue.
禁用所有斷點(diǎn):
(lldb) br dis
"dis"即disable, "br"即breakpoint.
禁用某個(gè)斷點(diǎn):
(lldb) br dis 6
6代表第幾個(gè)斷點(diǎn).
啟動(dòng)所有斷點(diǎn):
(lldb) br en
啟動(dòng)某個(gè)斷點(diǎn):
(lldb) br en 5
刪除所有斷點(diǎn):
(lldb) br del
刪除某個(gè)斷點(diǎn):
(lldb) br del 5
在執(zhí)行某個(gè)指令之前, 預(yù)先設(shè)置一些指令:
(lldb) br del 8
打印寄存器的值:
(lldb) p $r6
執(zhí)行下一條指令, 并且進(jìn)入函數(shù)體:
(lldb) ni
執(zhí)行下一條指令, 并且不進(jìn)入函數(shù)體:
(lldb) si
給指定的寄存器賦值, 用以驗(yàn)證分支:
(lldb) register write r5 0
上述命令作用為修改r5寄存器的值為0.
三. 首先使用usbmuxd通過(guò)USB數(shù)據(jù)線連接調(diào)試設(shè)備:
1 )新建Terminal,把本地2222端口轉(zhuǎn)發(fā)到iOS的22端口
/Users/mac/Downloads/USBSSH/tcprelay.py -t 22:2222
2 )再新建一個(gè)Terminal, ssh過(guò)去并用debugserver 連接到SpringBoard
ssh root@localhost -p 2222
debugserver *:1234 -a "SpringBoard"
3 )再新建一個(gè)Terminal, 把本地1234端口轉(zhuǎn)發(fā)到iOS的1234端口
/Users/mac/Downloads/USBSSH/tcprelay.py -t 1234:1234
4 )再新建一個(gè)Terminal, 用lldb開始調(diào)試
/Applications/Xcode.app/Contents/Developer/usr/bin/lldb
lldb連接1234端口
process connect connect://localhost:1234
整體效果圖, 如下:
第六步: 安裝dumpdecrypted,進(jìn)行砸殼
從AppStore下載的APP被蘋果加密過(guò)的, 可執(zhí)行文件被套上了一層保護(hù)殼, 而class-dump無(wú)法作用于加密過(guò)的APP. 所以要解密APP的可執(zhí)行文件, 想要進(jìn)行"砸殼". dumpdecrypted是由越獄社區(qū)的知名人士Stefen Esser出品的一款砸殼工具, 被越獄社區(qū)廣泛應(yīng)用在iOS逆向工程研究中. 接下來(lái)介紹dumpdecrypted的使用:
1 )下載dumpdecrypted的源碼, 如下:
willys-MBP% cd /Users/mac/Desktop/fry
willys-MBP% git clone git://github.com/stefenesser/dumpdecrypted/
Cloning into 'dumpdecrypted'...
remote: Counting objects: 31, done.
remote: Total 31 (delta 0), reused 0 (delta 0), pack-reused 31
Receiving objects: 100% (31/31), 7.10 KiB | 0 bytes/s, done.
Resolving deltas: 100% (15/15), done.
Checking connectivity... done.
willys-MBP% ls
dumpdecrypted
如果下載不了, 到GitHub上, 鏈接
接著編譯dumpdecrypted.dylib, 如下:
willys-MBP% cd dumpdecrypted
willys-MBP% make
編譯完成后, 會(huì)在當(dāng)前目錄生成一個(gè)dumpdecrypted.dylib文件. 這個(gè)是接下來(lái)砸殼用到的工具(編譯一次即可, 后續(xù)砸殼都用同這個(gè)dylib).
2 )ssh進(jìn)iOS設(shè)備.
willys-MBP% ssh root@localhost -p 2222
lizhifengdemacde-iPhone:~ root# ps -e
上面用到usbmuxd, 可以加快ssh速度.ps -e回車后可看到下面這些信息, 在此需要保證我們?cè)覛さ腁PP在運(yùn)行的狀態(tài),
PID TTY TIME CMD
1 ?? 0:02.27 /sbin/launchd
16 ?? 0:01.09 /usr/sbin/notifyd
20 ?? 0:04.91 /usr/libexec/UserEventAgent (System)
22 ?? 0:01.39 /usr/libexec/pphelper/PPHelperLaunchd
...
400 ?? 0:08.11 /var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/WeChat.app/WeChat
401 ?? 0:00.11 /System/Library/Frameworks/UIKit.framework/Support/pasteboardd
這里看到的WeChat的pid為400, 并且可執(zhí)行文件的全路徑為:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/WeChat.app/WeChat. 接下來(lái)我們要找到WeChat的ducuments路徑.
3 )通過(guò)cycript查找documents路徑, 同時(shí)保證WeChat處于運(yùn)行狀態(tài).
lizhifengdemacde-iPhone:~ root# cycript -p 400 //這里的400就是上面我們找到WeChat的pid值
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/"
cy#
于是, 我們得到了WeChat的documents目錄, 即:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/
4 )將步驟1得到的dumpdecrypted.dylib拷貝到documents目錄下.Terminal執(zhí)行:
willys-MBP% scp /Users/mac/Desktop/fry/dumpdecrypted/dumpdecrypted.dylib root@192.168.1.114:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/
dumpdecrypted.dylib 100% 193KB 192.9KB/s 00:00
willys-MBP%
iFunBox直接復(fù)制進(jìn)入也可以.
- 開始砸殼
dumpdecrypted.dylib的用法是:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可執(zhí)行文件路徑
具體操作是這樣的, 先切到documents的路徑下, 然后用dumpdecrypted進(jìn)行砸殼:
root# cd /var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/ //切到步驟3的document路徑下
lizhifengdemacde-iPhone:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents root# ls //ls可以看到我們的dumpdecrypted.dylib在當(dāng)前的目錄下, 這個(gè)可是砸殼關(guān)鍵
00000000000000000000000000000000/ CrashReport/ LocalInfo.lst MMappedKV/ WeChat.decrypted bfc6237ab526bc81dd2bd2b7cf050210/ mmupdateinfo.archive
108ebb8e2ff6e023e75d5a518e7ac49d/ Ksid MMResourceMgr/ SafeMode.dat b06f23ff87ff45d5df8d9029111a8ed4/ dumpdecrypted.dylib
lizhifengdemacde-iPhone:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/WeChat.app/WeChat //后面的路徑是步驟1獲得的可執(zhí)行文件路徑, 復(fù)制粘貼在這里即可
砸殼如無(wú)意外, 就可以在當(dāng)前目錄下生成WeChat.decrypted, 切回到電腦端的Terminal, 復(fù)制這個(gè)WeChat.decrypted文件到電腦上. 執(zhí)行下面的命令:
willys-MBP% scp root@192.168.1.114:/var/mobile/Applications/54502D76-89A2-4828-A6F5-4323C7C4A80C/Documents/WeChat.decrypted /Users/mac/Desktop/fry //把WeChat.decrypted放在了電腦目錄上
WeChat.decrypted 100% 105MB 2.6MB/s 00:41
willys-MBP%
砸出來(lái)的文件有點(diǎn)大, 不過(guò)沒(méi)關(guān)系, 我們關(guān)心的只是他的頭文件, 接下來(lái)通過(guò)這個(gè)WeChat.decrypted 文件class-dump出頭文件.
6 )class-dump生成頭文件
先切到放置WeChat.decrypted文件的目錄下,
willys-MBP% cd /Users/mac/Desktop/fry
然后用class-dump生成頭文件, 如下:
willys-MBP% class-dump --arch armv7 -H WeChat.decrypted -o /Users/mac/Desktop/fry
willys-MBP%
class-dump --arch 這里是固定寫法, armv7是iOS設(shè)備的對(duì)應(yīng)arm型號(hào), -H 固定寫法, WeChat.decrypted代表可執(zhí)行文件的名稱 -o表示輸出到文件中, /Users/mac/Desktop/fry代表輸出的文件目錄, 砸殼出來(lái)的頭文件都將放置在這個(gè)目錄下. 至此, 砸殼完成.
第七步: 安裝iFile
Cydia搜索安裝即可, 相當(dāng)于手機(jī)端的Finder.
第八步: 安裝Terminal
Cydia搜索Terminal, 選擇可用的進(jìn)行安裝, 具體使用方法跟電腦端的Terminal一樣.
第九步,安裝socat, 查看手機(jī)Log輸出
1.iOS設(shè)備安裝socat
cydia搜索socat, 安裝.
2.Terminal連接到手機(jī)root, 查看手機(jī)系統(tǒng)日志
Weide-iPad:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
========================
ASL is here to serve you
> watch
進(jìn)入到命令行交互界面炫七,這時(shí)可以輸入help查看幫助
輸入watch開始監(jiān)聽手機(jī)log.
監(jiān)聽后的效果: