【iOS逆向】-- debugserver

Xcode 為什么可以調(diào)試APP?

平時開發(fā)中當我們給代碼打斷點,調(diào)試程序(lldb),這一切都離不開一個媒介debugserver剑刑,它負責將lldb指令給到app,然后app將結(jié)果通過debugserver傳給lldb

debugserver一開始是在Xcode中的双肤,一旦手機連接Xcode信任后施掏,debugserver便會安裝到手機上

  1. Xcode目錄: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.1/DeveloperDiskImage.dmg/usr/bin/debugserver

  2. iPhone目錄:/Developer/usr/bin/debugserver

但是缺少task_for_pid權(quán)限茅糜,通過Xcode安裝的debugserver七芭,只能調(diào)試自己的app,要想逆向別人的app,這種肯定是行不通的蔑赘。前面說到狸驳,不能調(diào)試別人app的原因是權(quán)限不夠预明,要想在沒有源碼的情況下調(diào)試別人的app,就需要修改debugserver權(quán)限耙箍。

更改debugserver 權(quán)限

認識debugserver

放在/Developer/usr/bin/debugserver是沒有調(diào)試其他app的權(quán)限的撰糠,現(xiàn)在的做法是先把iPhone上的debugserver放到電腦上修改好權(quán)限再放回手機上,已達到可以調(diào)試其他app的目的辩昆。

拖到MachOView中可以看到這是個胖二進制文件

15443398356634.jpg

給debugserver瘦身

由于debugserver是個胖二進制文件阅酪,我的越獄手機是iPhone6plusiOS9.0.1arm64架構(gòu)的卤材,我們只要流行arm64即可使用lipo命令


lipo -thin arm64 ./debugserver -o ./debugserver_arm64

15443403611713.jpg

為了方便將debugserver_arm64改為debugserver遮斥,下面的提到的debugserver指的都是debugserver_arm64

給debugserver增加 task_for_pid權(quán)限

查看debugserver原來的權(quán)限

通過ldid查看原來的命令

?  debugserver ldid -e ./debugserver
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.backboardd.debugapplications</key>
    <true/>
    <key>com.apple.backboardd.launchapplications</key>
    <true/>
    <key>com.apple.diagnosticd.diagnostic</key>
    <true/>
    <key>com.apple.frontboard.debugapplications</key>
    <true/>
    <key>com.apple.frontboard.launchapplications</key>
    <true/>
    <key>com.apple.security.network.client</key>
    <true/>
    <key>com.apple.security.network.server</key>
    <true/>
    <key>com.apple.springboard.debugapplications</key>
    <true/>
    <key>run-unsigned-code</key>
    <true/>
    <key>seatbelt-profiles</key>
    <array>
        <string>debugserver</string>
    </array>
</dict>
</plist>

將舊的權(quán)限輸出到entitlement.plist文件中

?  debugserver ldid -e ./debugserver > ./entitlement.plist

entitlement.plist增加一個task_for_pid-allow

15443412160922.jpg

重簽名debugserver

將改好的entitlement.plist重簽debugserver

?  debugserver ldid -Sentitlement.plist debugserver

再次查看debugserver權(quán)限確認是否添加成功

?  debugserver ldid -e ./debugserver | grep task_for_pid-allow
    <key>task_for_pid-allow</key>
?  debugserver

說明成功添加

debugserver 放回到手機

前面已經(jīng)賦予了debugserver可以調(diào)試其他app的權(quán)限了扇丛,接下來放回到手機上使用术吗。

此時我們把修改后的debugserver放到手機的/usr/bin/目錄下,原因有2個

  1. 手機上原來的debugserver存放的目錄/Developer/usr/bin/debugserver是只讀的帆精;
  2. 放到/usr/bin/下可以在手機上直接敲debugserver方便使用

順便增加執(zhí)行權(quán)限

iPhone:~ root# chmod +x /usr/bin/debugserver
iPhone:~ root# ls -l /usr/bin/debugserver
-rwxr-xr-x 1 root wheel 4646672 Dec  9 15:49 /usr/bin/debugserver
iPhone:~ root#

debugserver啟動或附加進程

啟動進程

debugserver -x backboard IP:port /path/to/executable

debugserver會啟動executable较屿,并開啟port端口, 等待來自IP的LLDB接入卓练。

先實現(xiàn)一個打開系統(tǒng)的app,iPhone系統(tǒng)應用都放在/Applications下面

15443469873180.jpg

已打開系統(tǒng)的計算器為例

iPhone:~ root# debugserver -x backboard *:1234 /Applications/Calculator.app/Calculator

上面的代碼會啟動Calculator.app隘蝎,并開啟1234端 口,等待任意IP地址的LLDB接入襟企。

附加進程

debugserver IP:port -a "ProcessName"

debugserver會附加ProcessName嘱么,并開啟port端 口,等待來自IP的LLDB接入顽悼。

已打開手機上的新浪微博為例子

用戶安裝的app放在/var/mobile/Containers/Bundle/Application

先點擊新浪微博

iPhone:~ root# debugserver *:1234 -a "Weibo"
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-340.3.51.1
 for arm64.
Attaching to process Weibo...
Listening to port 1234 for a connection from *...

-a是附加的意思

lldb連接debugserver

現(xiàn)在手機端的服務已經(jīng)開啟曼振。

先電腦端輸入lldb指令

?  ~ lldb
(lldb)

連接服務

process connect connect://192.168.1.102:1234

ip就是手機的ip地址
1234就是端口

稍微等一會(1到2分鐘吧)就會出現(xiàn)下面的東西

Process 4348 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x000000019b3c4c30 libsystem_kernel.dylib`mach_msg_trap + 8
libsystem_kernel.dylib`mach_msg_trap:
->  0x19b3c4c30 <+8>: ret

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x19b3c4c34 <+0>: mov    x16, #-0x20
    0x19b3c4c38 <+4>: svc    #0x80
    0x19b3c4c3c <+8>: ret
Target 0: (Weibo) stopped.
(lldb)

此時的app是無法交互的我們輸入c繼續(xù)程序

(lldb) c
Process 4348 resuming
(lldb)

會發(fā)現(xiàn)微博可以交互了。

一個簡單的demo

連接手機

ssh root@10.9.24.154 

你也可以使用usb連接

開啟手機服務

debugserver *:1234 -a 818

mac端輸入lldb指令連接手機

?  ~ lldb
(lldb) process connect connect://10.9.24.154:1234
Process 818 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x000000019811cc30 libsystem_kernel.dylib`mach_msg_trap + 8
libsystem_kernel.dylib`mach_msg_trap:
->  0x19811cc30 <+8>: ret

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x19811cc34 <+0>: mov    x16, #-0x20
    0x19811cc38 <+4>: svc    #0x80
    0x19811cc3c <+8>: ret
Target 0: (Debugserver) stopped.

計算-[ViewController btnClick]:的真實函數(shù)地址

查看ASLR

什么是ASLR

全稱ASLR (Address Space Layout Randomization)每次進程啟動時蔚龙,同一進程的所有模塊在虛擬內(nèi)存中的起始 地址都會產(chǎn)生隨機偏移冰评。就拿我們的例子來說,在虛擬內(nèi)存的起始地址是0x0

15446038665381.jpg

我們先不考慮隨機地址偏移木羹,也就是說明了這個macho加載內(nèi)存的時候_TEXT段的起始地址應該是0x100000000,但是如果有了偏移量甲雅,那么我們加上偏移量就能計算出內(nèi)存中的真實地址了。

(lldb) image list -o -f
[  0] 0x00000000000dc000 /Users/fangshufeng/Library/Developer/Xcode/iOS DeviceSupport/9.0.1 (13A404)/Symbols/usr/lib/dyld
[  1] 0x00000000000b0000 /var/mobile/Containers/Bundle/Application/FA2608EB-E892-4C24-9272-F40908101AA0/Debugserver.app/Debugserver(0x00000001000b0000)
[  2] 0x00000001000c4000 /Library/MobileSubstrate/MobileSubstrate.dylib(0x00000001000c4000)

[...]
  1. 第一列[X]是模塊的序
  2. 第二列是模塊在虛擬內(nèi)存中的起始地址因ASLR 而產(chǎn)生的隨機偏移(以下簡稱ASLR偏移)坑填;
  3. 第三列 是模塊的全路徑抛人,括號里是偏移之后的起始地址。

可以看到偏移量為0x40000

hopper查看再Macho中的值

15445997853528.jpg

所以真實的函數(shù)地址是 = 0x00000000000b0000 + 0x0000000100006738 == 0x1000B6738;

-[ViewController btnClick]:設置斷點

(lldb) breakpoint set -a 0x1000B6738
Breakpoint 3: where = Debugserver`-[ViewController btnClick], address = 0x00000001000b6738
(lldb)

輸入c繼續(xù)程序

點擊按鈕

(lldb) breakpoint set -a 0x1000B6738
Breakpoint 3: where = Debugserver`-[ViewController btnClick], address = 0x00000001000b6738
(lldb) c
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 3.1
    frame #0: 0x00000001000b6738 Debugserver`-[ViewController btnClick]
Debugserver`-[ViewController btnClick]:
->  0x1000b6738 <+0>:  sub    sp, sp, #0x20             ; =0x20
    0x1000b673c <+4>:  mov    w8, #0x14
    0x1000b6740 <+8>:  mov    w9, #0xa
    0x1000b6744 <+12>: str    x0, [sp, #0x18]
Target 0: (Debugserver) stopped.
(lldb)

可以看到已經(jīng)斷到了方法處脐瑰,可以和hopper的內(nèi)容對比一看是一樣的妖枚。

簡單使用lldb指令

(lldb) ni
Process 1083 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = instruction step over
    frame #0: 0x000000018818a3e4 UIKit`<redacted> + 100
UIKit`<redacted>:
->  0x18818a3e4 <+100>: cmp    x22, #0x0                 ; =0x0
    0x18818a3e8 <+104>: cset   w0, ne
    0x18818a3ec <+108>: ldp    x29, x30, [sp, #0x20]
    0x18818a3f0 <+112>: ldp    x20, x19, [sp, #0x10]
Target 0: (Debugserver) stopped.
(lldb) ni
Process 1083 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = instruction step over
    frame #0: 0x000000018818a3e8 UIKit`<redacted> + 104
UIKit`<redacted>:
->  0x18818a3e8 <+104>: cset   w0, ne
    0x18818a3ec <+108>: ldp    x29, x30, [sp, #0x20]
    0x18818a3f0 <+112>: ldp    x20, x19, [sp, #0x10]
    0x18818a3f4 <+116>: ldp    x22, x21, [sp], #0x30
Target 0: (Debugserver) stopped.
(lldb)

打印寄存器的值

(lldb) po $w8
20

(lldb) p $w9
(unsigned int) $1 = 10
(lldb)
打印層級
(lldb) po [[[UIApplication sharedApplication] keyWindow] recursiveDescription]
<UIWindow: 0x14c63e650; frame = (0 0; 414 736); autoresize = W+H; gestureRecognizers = <NSArray: 0x14c637830>; layer = <UIWindowLayer: 0x14c63d3c0>>
   | <UIView: 0x14c54fe20; frame = (0 0; 414 736); autoresize = W+H; layer = <CALayer: 0x14c54f000>>
   |    | <_UILayoutGuide: 0x14c550280; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x14c54e040>>
   |    | <_UILayoutGuide: 0x14c550c30; frame = (0 736; 0 0); hidden = YES; layer = <CALayer: 0x14c63c690>>
   |    | <UIButton: 0x14c641240; frame = (100 100; 100 100); opaque = NO; layer = <CALayer: 0x14c6411f0>>
   |    |    | <UIButtonLabel: 0x14c63a3c0; frame = (23 39.3333; 54 21.6667); text = '點我啊'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x14c633470>>
   |    |    |    | <_UILabelContentLayer: 0x14c651170> (layer)

(lldb)

給按鈕加一個黃色背景
(lldb) po  [0x14c641240 setBackgroundColor:[UIColor yellowColor] ]
0x0000000000000001

(lldb) c
Process 1083 resuming
(lldb)

15446009775607.jpg

demo地址

(完)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚪黑,隨后出現(xiàn)的幾起案子盅惜,更是在濱河造成了極大的恐慌中剩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抒寂,死亡現(xiàn)場離奇詭異结啼,居然都是意外死亡,警方通過查閱死者的電腦和手機屈芜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門郊愧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人井佑,你說我怎么就攤上這事属铁。” “怎么了躬翁?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵焦蘑,是天一觀的道長。 經(jīng)常有香客問我盒发,道長例嘱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任宁舰,我火速辦了婚禮拼卵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛮艰。我一直安慰自己腋腮,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布壤蚜。 她就那樣靜靜地躺著即寡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仍律。 梳的紋絲不亂的頭發(fā)上嘿悬,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天实柠,我揣著相機與錄音水泉,去河邊找鬼。 笑死窒盐,一個胖子當著我的面吹牛草则,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蟹漓,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炕横,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了葡粒?” 一聲冷哼從身側(cè)響起份殿,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤膜钓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卿嘲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颂斜,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年拾枣,在試婚紗的時候發(fā)現(xiàn)自己被綠了沃疮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡梅肤,死狀恐怖司蔬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姨蝴,我是刑警寧澤俊啼,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站左医,受9級特大地震影響吨些,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炒辉,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一豪墅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黔寇,春花似錦偶器、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至憋飞,卻和暖如春霎苗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榛做。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工唁盏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人检眯。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓厘擂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锰瘸。 傳聞我的和親對象是個殘疾皇子刽严,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容