一、幾個概念
1. 反匯編與反編譯
源代碼程序-->可執行程序,需要經過編譯器-->匯編器-->鏈接器;用來撤銷編譯和匯編的過程,稱之為反編譯和反匯編
反匯編:從機器碼到匯編代碼
反編譯:以匯編代碼或機器碼到高級語言
2. 常見的指令架構
指令架構:x86、ARM、MIPS
x86主要應用於pc機上,主要有兩種語法表示匯編代碼:Intel和AT&T
ARM主要應用於移動端,它的分類也很多,這里不展開
MIPS主要應用於路由器等設備上
3. 反匯編的主要方法
反匯編的主要方法:線性掃描、遞歸下降
4. ida
ida是一種遞歸下降的反匯編器,它支持靜態分析和動態調試程序,尤其是在靜態分析領域,ida是一款神器
下面介紹了ida靜態分析程序的相關約定
ida的命名方式與虛擬地址和棧幀變量有關,常見的有以下幾個
sub_xxxx 地址xxxx處的子例程(過程/方法)
loc_xxxx 地址xxxx處的一個指令
byte_xxxx 位置xxxx處的8位數據
unk_xxxx 位置xxxx處的大小未知的數據
棧是程序運行是的一種數據傳輸方式,ida在靜態分析中提供了棧視圖來方便用戶的使用
.text:00401020 ; Attributes: bp-based frame .text:00401020 .text:00401020 ; int __cdecl sub_401020(char *) .text:00401020 sub_401020 proc near ; CODE XREF: sub_401005↑j .text:00401020 .text:00401020 var_4C = byte ptr -4Ch //IDA提供的一個摘要棧視圖,列出棧幀內被直接引用的每一個變量,以及大小與幀指針的偏移量 .text:00401020 var_C = byte ptr -0Ch // var_為局部變量名稱的前綴,后面表示變量與被保存的幀指針之間距離 .text:00401020 var_4 = dword ptr -4 .text:00401020 arg_0 = dword ptr 8 // 函數參數名以arg_為前綴,后面表示與最頂端參數之間的相對距離(十六進制) .text:00401020 .text:00401020 push ebp ; .text:00401021 mov ebp, esp .text:00401023 sub esp, 4Ch .text:00401026 push ebx
下圖為ida通過兩種寄存器ESP和EBP來表示棧
二、ida中具體的操作
1、靜態分析中常用快捷鍵
F5/tab:功能都是查看偽c代碼,但tab可以在偽c代碼和匯編之間相互切換,且切換時光標位置相同
shift+F12 : strings
shift+F7 :segments
alt+t :text search
ctrl+t: next text
g :快速查找到對應地址
shift+e :提取數據
Enter:跟進函數實現,查看標號對應的地址
Esc 返回跟進處
A 解釋光標處的地址為一個字符串的首地址
B 十六進制數與二進制數轉換
C 解釋光標處的地址為一條指令
D 解釋光標處的地址為數據
H 十六進制數與十進制數轉換
K 將數據解釋為棧變量
X 轉換視圖到交叉參考模式
2、ida 對於結構體的定義及標識
結構體:IDA會根據文件的類型自動加載相應的類型庫,如vc6win(VisualC++6.0),用戶做底層分析時,可以添加mssdk(windows.h)、ntddk(ntddk.h)等。這些庫中有相應的結構體,用戶分析代碼時,可以直接引用。可以通過快捷鍵”Shitft+F11“,打開加載類型庫窗口,然后用鼠標右鍵選擇”Load Type Library(或快捷鍵Insert)“,在彈出的窗口中選擇相應類型庫。
選擇好類型庫后就可以查看內置數據結構了。選擇菜單”View/Open subviews/Structure就可以打開結構體管理窗口。按Insert鍵,在彈出的窗口中選擇”Add Standard Structure“,打開標准結構庫窗口查找需要的結構名,然后就可以正常使用這些庫了。• 在默認情況下,IDA會加載常用的結構,程序類常用的結構體會顯示出來,在WNDCLASSA結構一行單擊右鍵,在彈出的菜單中選擇Unhide,快捷鍵是Ctrl++可展開結構,程序相應代碼處直接以結構體顯示。收起結構的快捷鍵是Ctrl+-。
定義新的結構體
打開結構體窗口,按下Insert鍵增加一個新的結構體類型,命名為student。把光標停留在student結構的ends一行,按D鍵可以鍵入數據(如id、age)等,重復D鍵可以在db、dw、dd間切換,直到變成dd,表示是dword類型。而按A鍵則是鍵入ASCII字符(如name)為結構體成員。通過N鍵可以修改相應名稱。
創建好結構體后,可以將鼠標放在要被定義的這個位置處,然后執行菜單”Edit/Structs/Sturcuvar“命令,或者快捷鍵alt+Q,然后選擇student結構體。這時對應的數據會被標識為相應的結構體。然后在對應的代碼位置x00401006處,選擇需要重新定義的數據,如[esi+18h] 通過”Edit/Operand types/Offset/Offset(Struct)“或者快捷鍵T可將相應位置的代碼修改為有意義的結構體名稱。
三、在linux中安裝ida
wine安裝(官網)-->安裝ida(不安裝python27 x64)-->下載 Python 2.7 的 MSI 文件,命令行下執行:wine64 msiexec /i python-2.7.15.amd64.msi
wine安裝的文件在/home/.wine/drive_c/中,這個相當與windows的c盤