需要注意的是Hopper與LLDB所選擇的AMR架構(gòu)的位數(shù)得一致丧枪,要么是32位之斯,要么都是64位日杈,如果位數(shù)不匹配的話,那么計算出來的內(nèi)存地址肯定是不對的佑刷。為了省去砸殼的麻煩莉擒,直接從PP助手下載了微信iPad版。
計算地址
地址計算公式:
偏移后模塊基地址 = 偏移前模塊基地址 + ALSR
偏移前地址從Hopper里看
ASLR偏移從LLDB里看
由上圖知ASLR偏移:30000
偏移后基地址為:34000
測試微信中的使用手機號登錄
在Hopper中l(wèi)ogin 關(guān)鍵字進行搜索瘫絮,找到方法[WCAccountPhoneLoginControlLogic initWithData:]
在Hopper中查看偏移前基地址
則initWithData偏移后地址:14B6A66 + 30000 = 14E6A66
設(shè)置斷點動態(tài)調(diào)試
使用
br s -a 0x14E6A66
設(shè)置斷點并觸發(fā)后(點擊使用手機登錄)
與上圖Hopper的initWihtData反匯編指令一致
這里以add r7涨冀,sp,0xc為例麦萤,ADD指令說明如下:
ADD R0鹿鳖,R1,R2壮莹; R0 <= R1+R2
在執(zhí)行這條語句之前r7的值是55961272翅帜,sp當前值為66961232,通過在LLDB執(zhí)行ni指令垛孔,執(zhí)行當前匯編語句藕甩,得到r7的值是55961244施敢,驗證了結(jié)果的正確性周荐。
可以使用po命令打印Objective-C對象,用p(char *)通過強制轉(zhuǎn)換的方式打印C語言基本數(shù)據(jù)類型對象
通過register write修改寄存器的值
語法
CBZ Rn, label 比較僵娃,為零則跳轉(zhuǎn)概作;
CBNZ Rn, label 比較,為非零則跳轉(zhuǎn)默怨。
其中:Rn是存放操作數(shù)的寄存器讯榕。label是跳轉(zhuǎn)目標。
(ASLR由上面30000變化為F0000是因為重連接過debug server)
下面測試下下個圖第一行紅色描邊的匯編代碼
計算偏移后的地址:0x14B6A9A + 0xF0000 = 0x15A6A9A
在語句cbz r5, 0x14b6b00設(shè)置斷點,即在0x15A6A9A處設(shè)置斷點
由于r5不為0,因此程序順序執(zhí)行到下一句
執(zhí)行c(continue)后重來,點擊使用手機號登錄重新觸發(fā)斷點披坏,然后令
register write r5 0
執(zhí)行ni指令娩嚼,發(fā)現(xiàn)修改了程序邏輯,程序跳轉(zhuǎn)到了下面的分支发钝。
總結(jié)
iOS逆向工程最常用的五種LLDB命令:
- image list
- breakpoint
- nexti與stepi
- register write