《IDA Pro權威指南》讀書筆記

hursing發表於2013-04-03

IDA 6.1 預破解版 種子下載地址 http://thepiratebay.se/torrent/7686769/。 如果不能下了,谷歌搜尋 “Hex-Rays Ida Pro Advanced Edition v6.1.1 PreCracked”。


Names視窗:

F,常規函式

L, 庫函式

I,匯入的名稱。與庫函式的區別:沒有程式碼

G,命名程式碼

D,資料

A,字串資料。

用於自動生成名稱的一些常用字首包括以下一些:

sub_xxxxxx:地址xxxxxxx處的子例程

loc_xxxxxx:地址xxxxxx處的一個指令

byte_xxxxxx:位置xxxxxx處的8位資料

word:16位

dword:32位

unk_xxxxxx:位置xxxxxx處的大小未知的資料


x86 fastcall約定:是stdcall約定的一個變體,它向CPU暫存器(而非程式棧)最多傳遞兩個引數。 傳遞給函式的前兩個引數將分別位於ECX和EDX暫存器中。剩餘的其他引數則以類似stdcall約定的方式從右到左放入棧上。


push和pop會修改esp,要記住


在x86程式中,EBP暫存器通常專門用作棧幀指標。

bp-based frame:

push  ebp   ; save the caller's ebp value
mov  ebp, esp   ; make ebp point to the saved register value
sub  esp, 76   ; allocate space for local variables
……
mov esp, ebp   ; clears local variables by reseting esp
pop   ebp    ; restore the caller's value of ebp
ret      ; pop return address to return to the caller
使用一個專用的幀指標,所有變數相對於幀指標暫存器的偏移量得以計算出來。正偏移量用於訪問函式引數,負偏移量用於訪問區域性變數。


反彙編清單可能會有錯誤,你可能需要對反彙編分析和顯示過程進行更多的控制。

IDA提供的程式碼轉換包括以下幾類:

將資料轉換為程式碼

將程式碼轉換為資料

指定一個指令序列為函式

更改現有函式的起始或結束地址

更改指令運算元的顯示格式


Edit->Array選單中,可以指定連續的資料空間為陣列。指定後,反彙編清單會更好看


為了位元組對齊,編譯器會插入幾個位元組

結構體在反彙編中看到的就是資料塊,並不知道是結構體。可以自己建立。

可以反彙編自己編寫一些程式來認識自己使用的編譯器得到的結果


編譯器會為每一個包含虛擬函式的類(或通過繼承得到的子類)生成一個表,其中包含指向類中每一個虛擬函式的指標。這樣的表就叫做虛表(vtable)。此外,每個包含虛擬函式的類都獲得另外一個資料成員,用於在執行時指向適當的虛表。這個成員通常叫做虛表指標(vtable pointer),並且是類中的第一個資料成員。

通過虛表的分析,可以看出兩個類間的關係。

如果兩個虛表包含相同數量的條目,則與這兩個虛表對應的類之間可能存在著某種繼承關係

如果類x的虛表包含的條目比類y多,則x可能是y的子類

如果x包含的條目也可以在y的虛表中找到,則必定存在下面一種關係:x是y的子類,y是x的子類,或者x和y全都是同一個超類z的子類。

如果x包含的條目也可以在類y的虛表中找到,並且x的虛表中至少包含一個純呼叫條目,而y的虛表中並沒有這個條目,那麼y是x的子類


程式碼交叉引用用於表示一條指令將控制權轉交給另一條指令。在IDA中,指令轉交控制權的方式叫做流(flow)。IDA中有3種基本流:普通流、跳轉流和呼叫流。j表示跳轉流jump,p表示呼叫,procedure。

資料交叉引用最常用的3種資料交叉引用分別用於表示某個位置何時被讀取、何時被寫入以及何時被引用。r字尾表示read cross-reference,w表示write,o表示偏移量交叉引用offset cross-reference。


常用快捷鍵:

g:jump to address

alt+t:搜尋

ctrl+t:搜尋下一個

ctrl+x:交叉引用列表

F5:反編譯成C偽碼


Mac OS X版的IDA沒有破解,目前只發現6.0的試用版。 Mac版的IDA能更好地識別objective-c函式,並且反彙編結果是AT&T語法,可以和windows版互補一起用。

相關文章