arm ida 伪代码 安卓 符号表_使用IDA动态调试及ARM指令学习笔记
本文介紹如何用IDA進行動態調試及部分ARM指令的學習。
環境:已root的安卓手機一部,IDA pro 6.8,win7系統。
下載樣本app,并已確認可調試(debuggable = true),下文不表:
http://pan.baidu.com/s/1jG22HMY一 手機連接電腦,打開USB調試模式,并在電腦端打開IDA的這個目錄:
二 通過adb push android_server /data/local/tmp/ 命令將文件推送至手機:
三 開啟服務,注意這個窗口不能關閉:
四 端口轉發:
五 打開IDA pro,我這里選擇的是 32位的版本。
六? 開啟遠程調試,注意先打開手機上的樣本app,調試需要該進程
七 如圖設置好 Hostname和 port:
PS:端口是可以改的,有些app會檢測端口進行反調試,通過修改端口可以繞過端口檢測。
八 點擊 OK按鈕,并查找樣本包名:
九 加載完成后的界面:
十 在右邊的 Modules 面板搜索 so文件名:
十一 雙擊需要進行調試的JNI函數:
十二 設置斷點,如圖操作,其快捷鍵是 F2:
十三 打開手機上的樣例 app,按下F9,我們發現IDA停在了斷點處:
這樣,我們就能愉快的進行動態調試了。
下面我們來分析這里面的部分匯編代碼:
PUSH ?????????? {R3,LR} ;將寄存器R3和LR的值分別壓入棧中,
R0-R3:通用寄存器,用于函數參數及返回值的傳遞
LR: 連接返回寄存器,保留函數返回后,下一條應該執行的指令。
POP ??????????? {R3,PC} ;將棧頂的值分別傳遞給寄存器R3和PC
PC:?? 程序寄存器,保存下一條CPU即將執行指令的地址,這里原本LR里面的值傳遞給了PC寄存器,這樣就返回到了當初函數調用的地方。
SP:棧頂指針寄存器,用于存放棧頂地址
按F8進行單步調試,繼續分析下一條指令。
我們可以看看按下F8后,SP的值。
CMP ??????????? R2, #2 ;比較 R2寄存器里面的值與2的大小。比較結果通過標志寄存器來保存。目前R2的值是5,因此兩個值是不等的。
執行比較指令后,發現Z的值變為了0,也就是說比較的結果不為0.
繼續執行下一條指令:
BEQ ??????????? loc_D7FD0C60 ;Z標志值為1則跳轉,即上一調比較指令的結果為0;否則繼續向下執行。
繼續往下走,走到這里:
BNE ??????????? loc_D7FD0C5A ;Z標志值為0則跳轉,即上一調比較指令的結果不為0;否則繼續向下執行,與BEQ是相反的。
通過上條指令的跳轉后,來到了這里:
LDR ??????????? R1, =(aNormalUser - 0xD7FD0C60) ;把棧上內容載入一寄存器中,執行后,我們看到R1的值是:
ADD???????????? R1, PC????????????????? ; "Normal User"
我們看到IDA后面自己的注釋是 "Normal User",也就是說這兩條指令的目的是把 字符串 "Normal User" 所在的地址傳遞給R1,我們執行后看看R1的值:
我們在十六進制面板看看 R1值所對應的是什么:
鼠標在 十六進制面板 點擊一下,然后按下G鍵,輸入R1的值:點擊OK后,跳轉到了這里:
這里確實是存放 "Normal User"這個字符串的地址。
回到匯編窗口,繼續執行下面這條指令:
B?????????????? loc_D7FD0C64 ;無條件跳轉到 loc_D7FD0C64 處.
執行后來到了這里:
LDR ??????????? R2, [R0] ;將R0的值為地址,賦值給R2
此時R0的值 F39312A0,我們看看對應的值是什么:運行后,看看R2的值:可以看到,確實就是 R1地址的值:F362E54C。
下一條指令:MOVS ?????????? R3, #0x29C
即將 0x29C保存到R3寄存器:
下一條指令:LDR ??????????? R3, [R2,R3]
將 R2寄存器的值與R3寄存器的值相加,得到一個地址,然后再取改地址上的值給R3;R2 = 0xF362E54C,R3 = 0x0000029C,相加得到這個地址值:
0xF362E7E8,看看是什么:
按下F8,看看R3的值:下一條指令:BLX ??????????? R3;
BLX 指令從ARM 指令集跳轉到指令中所指定的目標地址,并將處理器的工作狀態有ARM 狀態切換到Thumb 狀態,該指令同時將PC 的當前內容保存到寄存器R14 中。因此,當子程序使用Thumb 指令集,而調用者使用ARM 指令集時,可以通過BLX 指令實現子程序的調用和處理器工作狀態的切換。
同時,子程序的返回可以通過將寄存器R14 值復制到PC 中來完成。
執行后,看到很多寄存器的值都變化了:下一條指令:
POP ??????????? {R3,PC} ;將棧頂的值分別傳遞給R3和PC。
執行后,看看R3和PC的值:
好了,今天就介紹都這里吧,以后遇到看不懂的指令可以直接百度,如果要加深印象,可以動態調試看寄存器的變化或者內存的變化。
總結
以上是生活随笔為你收集整理的arm ida 伪代码 安卓 符号表_使用IDA动态调试及ARM指令学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑提示0xc0000719设备未迁移如
- 下一篇: 猎豹浏览器怎么查看历史记录 猎豹浏览器历