如果你目前還做不了巨人,那么就去思考如何優(yōu)雅的站在巨人肩膀上。
此筆記只是把自己常用的一些操作命令記錄特碳,當做為個人逆向手冊吧。
一晕换、LLDB常用命令
1. 模塊操作:
? image list -o -f | grep MiaoPai //顯示 MiaoPai Image模塊的信息
? image lookup -r -n NUWebViewController //查詢NUWebViewController類或者方法在哪個模塊里面
2. 斷點操作:
2.1 基本斷點:
? br s -a 0xA5446 //在固定地址0xA5446下斷,此地址是絕對地址午乓。
? br s -a '0x0009a000 + 0xb446' //用ALSR+IDA偏移下斷,ALSR的獲取需要使用image list
? br s -n "[UIAlertView initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:]" //符號斷點這樣也行
? br s -n "initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:" //對所有含有initWithTitle方法的地方下斷點。
? br s -n alertControllerWithTitle:message:preferredStyle: //對所有含有alertControllerWithTitle方法的地方下斷點闸准。
? po (void*)class_getMethodImplementation(NSClassFromString(@"UIAlertView"),NSSelectorFromString(@"initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:")) //這個可以先打出[UIAlertView initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:]的內存地址益愈,然后使用br s -a addr下斷點。
2.2 條件斷點:
? br s -a 0x03193730 -c '(BOOL)[(NSString *)$x0 isEqualToString:@"winsong"]'
2.2 斷點命中行為:
? br command add index // 給序號為index的斷點增加命中后的行為
2.3 內存讀寫斷點:
? watchpoint set expression -w write -- addr //給addr地址處設置內存寫入斷點
? watchpoint set expression -w read -- addr //給addr地址處設置內存讀斷點
2.4 禁用斷點:
? br dis index
2.5 刪除斷點:
? br del index
2.6 查看斷點:
? br list //查看斷點列表 原型:breakpoint list
3.寄存器操作:
? re w r0 0 //把r0寄存器修改為0
? re read //查看所有寄存器的值
4.內存操作(可以用x 命令代替):
4.1 內存讀:
? mem r -s4 -fx -c16 addr // 查看addr處的內存情況夷家,這里主要解釋一下上面這條命令每個-的作用蒸其,-s主要是控制顯示的是以多少個字節(jié)顯示,如-s1就是Byte的顯示库快,如-s2就是以Word顯示摸袁,如-s4就是以Dword顯示。-f主要是控制顯示的格式其后面有效數(shù)值:
? mem r -s1 -fY -c0x20 0x38b0fe70
? mem r -o/Users/winsong/Desktop/temp.bin -c0x8CA000 -b 0xbffff3c0 //dump指定地址 指定大小的內存以Hex格式dump到文件中
? x -ff -c0xAC718 -o/Users/winsong/Desktop/temp.bin $x0--force //dump指定地址 指定大小的內存以浮點數(shù)格式dump到文件中
? x -b -c0xAC718 -o/Users/winsong/Desktop/temp.bin $x0--force //dump指定地址 指定大小的內存以Hex格式dump到文件中
4.2 內存寫:
? memory write -s1 -fx 0x144dade11 0x38 //對0x144dade11內存地址寫入一個字節(jié)為0x38
4.3 關于x命令的拓展
常規(guī)格式:
1).打印32位地址:
? (lldb) x -fx -c8 -l4 $r0 //-f(格式控制)义屏、-c(總個數(shù)控制)靠汁、-l(每一行的個數(shù)控制)
? 0x10004005: 0x7400001f 0x74000006 0x0f000006 0x74000067
? 0x10004015: 0x74000007 0x21000007 0x7400006b 0x74000009
2).打印字符串:
? (lldb) x -fY -c0x30 -l0x10 $r0 //-f(格式控制)、-c(總個數(shù)控制)闽铐、-l(每一行的個數(shù)控制)
? 0x10004005: 1f 00 00 74 06 00 00 74 06 00 00 0f 67 00 00 74 ...t...t....g..t
反斜杠格式“x/<n/f/u><addr>“說明 這里x代表用16進制來顯示結果添谊,w代表Word(16位)大小。所以x/3xw就是用16進制來顯示bytes所指空間的3個16位的元素內容。對于x命令的詳細格式可以參考這篇文章,或者這篇。常見的大小格式為:b – byte 1字節(jié),h – half word 2字節(jié)青团,w – word 4字節(jié)和最后的g – giant word 8字節(jié)诱贿。格式字符串則類似printf锨阿,x是16進制,f是浮點,d是十進制等等。
5. 線程操作:
? th l //查看線程列表 原型:thread list
6. 通用操作:
? continue // 原型:process continue
? dis -s 908FF0 -c 50 -b //在指定地址處開始顯示匯編代碼 顯示50行數(shù) 和顯示Opcode
? expr ((long long (*)())0x10258f910) //直接調用內存地址CALL:
? po [[[UIWindow keyWindow] rootViewController] _printHierarchy] //針對8.0以上的系統(tǒng)
? po [[UIWindow keyWindow] recursiveDescription]
? expr (void)[CATransaction flush] //刷新UI
二、iOS調試技巧
1. LLDB+DebugServer遠程調試
請參考:http://bbs.iosre.com/t/debugserver-lldb-gdb/65
1). debugserver localhost:1234 -a "SpringBoard" // attach方式調試(iOS端運行)
2). debugserver -x backboard *:1234 /var/mobile/Applications/BFC441A6-3F4B-4F18-BA15-3C5DF7148F40/testapp/test //啟動方式調試(iOS端運行)
3).process connect connect://localhost:1234 //lldb連接 (MacOS端運行l(wèi)ldb連接debugserver)
4).process launch --stop-at-entry //
2. 使用USB來SSH:
請參考:http://bbs.iosre.com/t/usb-ssh-ios/193
? 小技巧<AutoSsh>:復制下面深綠文字到新建的AutoSSh.sh文件里面雙擊運行即可,$path是路徑
? #! /bin/bash
? $path/tcprelay.py -t 22:2222 &
? $path/tcprelay.py -t 1234:1234 &
3. iOS越獄免登陸SSH
? ssh-copy-id -i ~/.ssh/id_rsa.pub root@IP
三、關于chisel的使用記錄:
? 1.pviews //參數(shù):無 功能:在程序斷下來的情直接輸出當前UI的層次結構
? 2.presponder //參數(shù):控件地址 功能:遞歸顯示出這個控件之前的Responder
? 3.fa11y //參數(shù):字符串 功能:通過給定字符串找出對應控件的地址
? 4.caflush //參數(shù):無 功能:改變了UI的情況下刷新UI緩存
? 5.flicker //參數(shù):控件地址 功能:快速閃速一下控件方便定位
? 6.paltrace //參數(shù):View
? 7.pinternals //參數(shù):控件地址 功能:查看控件詳細內部結構
? 8.pvc //參數(shù):viewController 功能:找出viewController和View的對應關系和地址
? 9.taplog //參數(shù):無 功能:可以找對應的控件點擊事件
? 10.show/hide逛钻、mask/unmask僚焦、border/unborder、
? 11.visualize //參數(shù):控件地址或者圖片的內存地址 功能:用mac上的preview顯示出
? 12.binside //參數(shù):地址 功能:下斷曙痘,針對那種有ASLR的方便使用
四芳悲、其他技巧:
5.1 將NSData寫到Docments目錄:
? expr (id)[$x0 writeToFile:(id)[NSString stringWithFormat:@"%@/123.bin",(NSString*)[NSSearchPathForDirectoriesInDomains( 9,1, YES) lastObject]] atomically:YES] //將寄存器X0指針里面buff寫到沙盒Document目錄下
5.2 對于iOS有彈窗(UIAlertView或者UIAlertController)的代碼的快速定位
? 1).可以直接下個斷br s -n initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles: 然后在App操作斷下來之后通過棧回溯定位關鍵代碼
? 2).或者可以: po (void*)class_getMethodImplementation(NSClassFromString(@"UIAlertView"),NSSelectorFromString(@"initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:")); //這就能準確的找出對應類的函數(shù)边坤。
5.3 查找按鈕的Target點擊事件
? po [myButton 為按鈕的內存地址
? {(
? <MagicEventListener: 0x7fb58bd2e240>
? )}
? (lldb) po [$myButton actionsForTarget:(id)0x7fb58bd2e240 forControlEvent:0]
? <__NSArrayM 0x7fb58bd2aa40> _handleTap:)
? 現(xiàn)在你或許想在它發(fā)生的時候加一個斷點名扛。在 -[MagicEventListener _handleTap:] 設置一個符號斷點就可以了,在 Xcode 和 LLDB 中都可以茧痒,然后你就可以點擊按鈕并停在你所希望的地方了肮韧。
5.4 App瘦身和簽名
? 利用lipo命令留下支持armv7s的header
? 1.lipo -thin armv7s <SrcFile> -output <DesFile>
? 2.ldid -Sent.xml SrcFile(如果此方法不行就換下面第二種)//注意此處“-S”選項與“ent.xml”之間是沒有空格的。
? 3.codesign -s - --entitlements ent.plist -f <SrcFile> //注意這里的SrcFile是進過處理的,最后復制到IOS機器上并給其權限chmod +x <SrcFile>//注意這里的SrcFile是進過處理的
5.5.文件的拷貝:(可以用PP助手代替)
? scp -P 2222 root@localhost:/Developer/usr/bin/debugserver ~/debugserver //將手機上的debugserver 拷貝至MAC當前目錄(已經端口轉換了)
? scp SrcFile zj-dt0094@192.168.43.141:/Users/zj-dt0094/desktop //將手機上的SrcFile 拷貝至Mac的desktop上(前提是已經ssh上手機了)
? scp SrcFile root@172.17.6.97:/var/mobile/Downloads //將電腦上的SrcFile 拷貝至手機上
? scp -rp /var/mobile/Applications/431430A4-6F89-45ED-BA3E-B257DFD0B99C/MiaoPai.app zj-dt0094@192.168.43.141:/Users/zj-dt0094/desktop //拷貝整個目錄
5.6.砸殼
? 進入APP的Document目錄后 執(zhí)行以下命令:DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/BFED82A3-3238-4F41-B797-C1CB584CBE05/qqlive.app/qqlive
? 具體見: http://www.reibang.com/p/a4373b5feca0
5.7.對于swift+OC混編的程序如何快速定位關鍵代碼
? 1. 第一步還是和之前分析OC程序一樣的通過View找到對應的ViewController旺订,
? 2. 第二步就和之前OC(拿到ViewController之后就去對應的頭文件找對應的事件)不一樣弄企,這里是到IDA的String Windows里面去找,假設找到的 是:<Trigraphy.EditorEffectsMenuViewController: 0x1276c65b0>区拳,那就復制EditorEffectsMenuViewController在String Windows里面搜索拘领,雙擊紅色框里面的就可以找到對應的metaData了。
5.8 lldb 自動帶入庫
? 打開終端:(依次輸入,什么都沒提示樱调,打開xcode項目约素,有Hook 1(expr --@import UIKit等提示,意味著成功))
? touch ~/.lldbinit
? echo display @import UIKit >> ~/.lldbinit
? echo target stop-hook add -o \"target stop-hook disable\" >> ~/.lldbinit
5.9 App打包成IPA
? mkdir Payload
? mv test.app Payload
? zip -ry test.ipa Payload
6.0 在iDA去除SVC
? IDA 二進制byte搜索 “01 10 00 D4” 將其替換為 nop 1F 20 03 D5
六笆凌、砸殼技巧:
? 1圣猎、Clutch砸殼
? 2、dumpdecrypted.dylib
? 使用dumpdecrypted砸殼乞而,出現(xiàn)killed:9 請參考此處 // https://iosre.com/t/ios-9-3-3-dumpdecrypted-killed-9/4489
? 3送悔、CrackerXI (cyida插件方便)