【轉】IDA Pro7.0使用技巧總結

俗話說,工欲善其事,必先利其器,在二進制安全的學習中,使用工具尤其重要,而IDA又是玩二進制的神器,之前在使用IDA的時候,只是用幾個比較經常使用的功能,對於IDA的其餘功能沒有去研究,因而本着學習的精神,參考着《IDA pro權威指南》(第二版),寫下這篇文章,記錄本身的學習心得,下面的記錄都是在Windows平臺下的IDA pro7.0進行的node

一些二進制工具

在《IDA pro權威指南》的開篇一兩章中,先是介紹了幾款經常使用於二進制研究的工具,我這裏簡單的記了幾個,介紹一波:python

C++filt:
能夠用於顯示出c++中複雜的重載後的函數名稱linux

PE tools:
是一組用於分析Windows系統中正在運行的進程和可執行文件的工具c++

string:
能夠用於直接搜索出elf文件中的全部字符串
參數-a 表示搜索整個文件,參數-t 能夠顯示出每個字符串的偏移,參數-e 能夠用於搜索更多的字符編碼的字符串,如Unicode編碼git

strip:github

可用於elf去符號,去符號後仍然保持正常功能但增長了逆向的難度,出題惡人必備數據庫

開發了IDA的天才是Ilfak,他的我的博客有不少IDA的教程
https://www.hexblog.com/windows

連接:https://pan.baidu.com/s/1raeaYU4 密碼:iz4capi

IDA目錄結構

在IDA的安裝根目錄下有許多文件夾,各個文件夾存儲不一樣的內容數組

cfg:包含各類配置文件,基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg,文本模式用戶界面配置文件idatui.cfg,
idc:包含IDA內置腳本語言IDC所須要的核心文件
ids:包含一些符號文件
loaders:包含用於識別和解析PE或者ELF
plugins:附加的插件模塊
procs:包含處理器模塊

經常使用快捷鍵

IDA中的快捷鍵都是和菜單欄的各個功能選項一一對應的,基本上你只要能在菜單欄上找到某個功能,也就能看到相應的快捷鍵,這裏記錄幾個經常使用的:

a:將數據轉換爲字符串

f5:一鍵反彙編

esc:回退鍵,可以倒回上一部操做的視圖(只有在反彙編窗口才是這個做用,若是是在其餘窗口按下esc,會關閉該窗口)

shift+f12:能夠打開string窗口,一鍵找出全部的字符串,右擊setup,還能對窗口的屬性進行設置

ctrl+w:保存ida數據庫

ctrl+s:選擇某個數據段,直接進行跳轉

ctrl+鼠標滾輪:可以調節流程視圖的大小

x:對着某個函數、變量按該快捷鍵,能夠查看它的交叉引用

g:直接跳轉到某個地址

n:更改變量的名稱

y:更改變量的類型

/ :在反編譯後僞代碼的界面中寫下注釋

\:在反編譯後僞代碼的界面中隱藏/顯示變量和函數的類型描述,有時候變量特別多的時候隱藏掉類型描述看起來會輕鬆不少

;:在反彙編後的界面中寫下注釋

ctrl+shift+w:拍攝IDA快照

u:undefine,取消定義函數、代碼、數據的定義

經常使用設置

拍攝快照

因爲IDA不提供撤銷的功能,若是你不當心按到某個鍵,致使ida數據庫發生了改變,就得從新來過,因此要記得在常常操做的時候,加上快照:file-->take database snapshot
加完快照後,會生成一個新的ida數據庫文件,本質上是有點像另存的操做

快捷鍵:ctrl+shift+w

菜單欄經常使用設置

view-->open subviews: 能夠恢復你無心中關閉的數據顯示窗口

windows-->reset desktop: 能夠恢復初始ida佈局

option-->font: 能夠改變字體的相關屬性

在流程視圖中添加地址偏移

IDA中的流程視圖能夠說是很是的好用,簡單明瞭地能看出程序的執行流程,尤爲是在看if分支代碼和循環代碼的時候,可以很是直觀

可是,咱們還能夠改得更加好用,在這個視圖中添加地址偏移的話,咱們取地址就很是方便,再也不須要按空格切換視圖去找,在菜單欄中設置:option-->general

將該選項打鉤後就能夠看到效果了:

自動添加反彙編註釋

這個功能對於萌新來講很是友好,在剛剛初學彙編的時候, 不免遇到幾個不經常使用的蛇皮彙編指令,就得本身一個個去查,很麻煩,開啓了自動註釋的功能後,IDA就能夠直接告訴你彙編指令的意思

一樣是在菜單欄中設置:option-->general

效果以下:

經常使用操做

建立數組

在操做IDA的時候,常常會遇到須要建立數組的狀況,尤爲是爲了能方便咱們看字符串的時候,建立數組顯得很是必要,如下我隨便找了個數據來建立數組

首先點擊選中你想要轉換成數組的一塊區域:

接着在菜單欄中選擇:edit-->array,就會彈出以下的選項框

下面來解釋一下各個參數的意思:

Array element size 這個值表示各數組元素的大小(這裏是1個字節),是根據你選中的數據值的大小所決定的

Maximum possible size 這個值是由自動計算得出的,他表示數組中的元素的可能的最大值

Array size 表示數組元素的數量,通常都根據你選定的自動產生默認值

Items on a line 這個表示指定每一個反彙編行顯示的元素數量,它能夠減小顯示數組所需的空間

Element print width 這個值用於格式化,當一行顯示多個項目時,他控制列寬

Use 「dup」 construct :使用重複結構,這個選項可使得相同的數據值合併起來,用一個重複說明符組合成一項

Signed elements 表示將數據顯示爲有符號數仍是無符號數

Display indexes 顯示索引,使得數組索引以常規的形式顯示,若是選了這個選項,還會啓動右邊的Indexes選項欄,用於選擇索引的顯示格式

Create as array 建立爲數組,這個通常默認選上的

建立好了之後,就變成了這樣:


)

能夠看到這些數據已經被當成一個數組摺疊到了一塊兒,其中2 dup(0FFh)這樣的,表示有兩個重複的數據0xff

流程圖

摺疊流程圖中的分支

在流程視圖中,分支過多的時候,能夠在窗口標題處右擊選擇group nodes,就能把當前塊摺疊起來

效果以下:

分支塊是能夠本身命名的,方便本身逆向理解

函數調用圖

菜單欄中:view-->graphs-->Function calls(快捷鍵Ctrl+F12)

這個圖能很清楚地看到函數之間是如何相互調用的

函數流程圖

菜單欄中:view-->graphs-->flowt chart(快捷鍵F12)

這個其實跟IDA自帶的反彙編流程視圖差很少,他能夠導出來做爲單獨的一張圖

建立結構體:

手工建立結構體

建立結構體是在IDA的structures窗口中進行的,這個操做在堆漏洞的pwn題中常用

能夠看到,這裏已經存在了四個結構體,程序自己存在的,能夠右擊選擇hide/unhide,來看具體的結構體的內容

建立結構體的快捷鍵是:insert

在彈出的窗口中,能夠編輯結構體的名字

這底下有三個複選框,第一個表示顯示在當前結構體以前(就會排列在第一位,不然排列在你鼠標選定的位置),第二個表示是否在窗口中顯示新的結構體,第三個表示是否建立聯合體。

須要注意的是,結構體的大小是它所包含的字段大小的總和,而聯合體的大小則等於其中最大字段的大小

在單擊ok之後,就定好了一個空的結構體:

將鼠標放在 ends這一行,單擊快捷鍵D便可添加結構體成員,成員的命名默認是以field_x表示的,x表明了該成員在結構體中的偏移

同時,能夠把鼠標放在結構體成員所在的行,按D,就能夠切換不一樣的字節大小

默認狀況下可供選擇的就只有db,dw,dd(1,2,4字節大小)

若是想添加型的類型,能夠在option-->setup data types(快捷鍵Alt+D),進行設置

如圖,勾選了第五個和第九個的話,就會出現dq和xmmword了(表明了8字節和16字節)

若是要添加數組成員則能夠對着成員所在的那一行,右擊選擇array

如圖,要建立的是16個元素的4字節數組

若是要刪除結構體,那麼對着結構體按下delete鍵便可刪除

若是要刪除成員,則對着成員按下u(undefine)可是須要注意的是,這裏只是刪除了成員的名字,而沒有刪除它所分配的空間

如圖,咱們刪除了中間的field_10的數組成員:

會變成這樣:

數組所分配的20個字節的空間並無被刪除,這時若是要刪除掉這些空間,就須要在原來數組成員所在的第一行中按下Ctrl+S,刪除空間(Edit-->shrink struct types)

就能夠真正的刪除掉成員

給結構體的成員重命名能夠用快捷鍵N

咱們在IDA中建立好告終構體之後,就是去應用它了

如圖,這是一個典型的堆的題目

能夠看到v1是一個新建的chunk的地址指針,然後的操做都是往chunk不一樣的偏移位置寫入內容,爲了方便咱們逆向觀察,能夠將其變成一個結構體,經過v1 v1+4 v1+0x48 這樣的偏移,建立好結構體後,將char *v1的類型改爲mail *v1,(快捷鍵Y能夠更改函數、變量的類型和參數)這個mail是咱們建立的結構體的名稱,效果以下:

導入C語言聲明的結構體

實際上,IDA有提供一個更方便的建立結構體的方法,就是直接寫代碼導入

在View-->Open Subviews-->Local Types中能夠看到本地已有的結構體,在該窗口中右擊insert

能夠添加新的結構體:

這樣就導入了新的結構體:

但同時咱們發現structure視圖裏面,並無這個結構體,咱們須要對着my_structure右擊,選擇 synchronize to idb

這樣structure視圖就有了,如圖

這裏你會發現,多出來兩個db的undefined的成員,這是由於ida默認是會把結構體統一4字節對齊的,知足結構體的大小爲0x28

IDA動態調試elf:

這裏我以一個在Ubuntu虛擬機中的elf爲例子,進行調試

首先把ida目錄中的dbgsrv文件夾中的linux_server64拷貝到Ubuntu的elf的文件夾下,這個elf是64位的全部用的是linux_server64,若是你調試的是32位的程序,你就須要拷貝linux_server

記得給他們權限,而後在終端運行,這個程序的做用就像是鏈接ida和虛擬機中elf的橋樑

而後再到ida中進行配置:

在菜單欄中選擇:debugger-->process options

注意,application和input file 都是填寫在虛擬機中的elf的路徑,記得要加文件名

而directory 填寫elf所在目錄,不用加文件名

hostname是虛擬機的ip地址,port是默認的鏈接端口

parameter和password通常都不用填

設置好了之後點擊ok

接着能夠直接在反彙編視圖中下斷點,只要點擊左邊的小藍點便可

這時按下快捷鍵F9,能夠直接開始調試

按下快捷鍵F4,則直接運行到斷點處停下

這個就是基本的各個功能區的介紹,上面是我比較喜歡的經常使用佈局,和ida默認的不太同樣,想要自定義添加一些視圖的話,能夠在debugger-->quick debug view中添加

另外能夠在Windows-->save desktop來保持當前的視圖佈局,之後就能夠直接加載使用

下面介紹一些經常使用的快捷鍵

F7 單步步入,遇到函數,將進入函數代碼內部
F8 單步步過,執行下一條指令,不進入函數代碼內部
F4 運行到光標處(斷點處)
F9 繼續運行
CTRL+F2 終止一個正在運行的調試進程
CTRL+F7 運行至返回,直到遇到RETN(或斷點)時才中止.

知道了這些快捷鍵後,調試起來就比較容易了,ida調試有個比較方便的地方在於能直接看到函數的真實地址,下斷點也很是直觀易操做

IDA-python

在IDA的最下面有個不起眼的Output Window的界面,實際上是一個終端界面,這裏有python終端和IDC終端

這裏的python是2.7的版本,雖然老了點,但已經足夠咱們用了,在IDA的運用中,咱們常常須要計算地址,計算偏移,就能夠直接在這個終端界面進行操做,很是方便


固然上面說的只是很簡單的python用法,真正的IDA-python的用法是這樣的:

這裏以簡單的一道逆向題來作個例子

這個程序很簡單,一開始來個for循環,把judge函數的內容所有異或0xc,這樣就致使了程序一運行就會直接破壞掉judge函數

從而使得無法進行後面的flag判斷

這裏咱們就須要寫一個腳原本先把被破壞的內容還原,這裏IDA提供了兩種寫腳本操做的方法,一種就是IDC腳本,一種就是python腳本

這裏只簡單的介紹IDA-python

而IDA-python經過三個python模塊將python代碼注入IDA中:

idaapi模塊負責訪問核心IDA API

idc模塊負責提供IDA中的全部函數功能

idautils模塊負責提供大量實用函數,其中許多函數能夠生成各類數據庫相關對象的python列表

全部的IDApython腳本會自動導入idc和idautils模塊,而idaapi模塊得本身去導入

這裏貼上IDApython的官方函數文檔,這裏包含了全部函數,值得一看

針對以上的題目,咱們只須要作一個腳本,指定judg函數的0-181範圍的字節異或0xc,便可恢復

judge=0x600B00 for i in range(182): addr=0x600B00+i byte=get_bytes(addr,1)#獲取指定地址的指定字節數 byte=ord(byte)^0xC patch_byte(addr,byte)#打patch修改字節 

在菜單欄中file-->script file,加載python腳本

接着在judge函數中undefined掉原來的函數,在從新生成函數(快捷鍵p),就能夠從新f5了
腳本中出現的函數都是已經封裝在idc模塊中的,具體可查官方文檔

這只是一個簡單的IDApython的使用例子,實際上這個功能很是強大,能弄出很是騷的操做

打PATCH

打patch,其實就是給程序打補丁,本質上是修改程序的數據,指令等,這在CTF中的AWD賽制中常常用到,發現程序漏洞後立刻就要用這個功能給程序打好patch,防止其餘隊伍攻擊咱們的gamebox

這裏,我是用一個叫keypatch的插件進行操做的,IDA自帶的patch功能不太好用

安裝keypatch

這個很簡單,教程在github就有

下載Keypatch.py複製到插件目錄

IDA 7.0\plugins\Keypatch.py

下載安裝keystone python模塊,64位系統只須要安裝這一個就行

https://github.com/keystone-engine/keystone/releases/download/0.9.1/keystone-0.9.1-python-win64.msi

安裝好後,你就會發現這裏有個keypatch的選項

修改程序指令

若是咱們要修改程序自己的指令,怎麼作呢

如圖,咱們要修改63h這個值

將鼠標指向改行,按快捷鍵Ctrl+Alt+K

直接輸入彙編語句便可修改,打好patch後效果如圖:

這裏會生成註釋告訴你,這裏打過patch,很是人性化

接着還要在菜單欄進行設置才能真正使得patch生效

這樣一來,原來的程序就已經被修改了

撤銷patch

若是不當心打錯了patch,就能夠在這裏進行撤銷上一次patch的操做了

可是若是打了不少次patch,很差分清該撤銷哪一次的patch,那麼能夠在菜單欄中打開patched bytes界面

看到全部的patch,要撤銷哪個就右擊選擇 revert

IDA導出數據文件

在菜單欄中,這裏有個選項能夠生成各類不一樣的輸出文件

這裏簡單的介紹前兩個文件,後面的你們能夠本身去生成測試一下用途,我這裏就不詳細介紹了

.map文件描述二進制文件的整體結構,包括與構成改二進制文件的節有關的信息,以及每一個節中符號的位置。

.asm文件,也就是彙編了,直接能導出ida中反彙編的結果,這個很是實用,有的時候在逆向中常常遇到大量數據加解密的狀況,若是在從IDA中一個個慢慢複製可就太沒效率了,直接導出生成asm,在裏面複製數據快不少

IDA常見命名意義

IDA常常會自動生成假名字。他們用於表示子函數,程序地址和數據。根據不一樣的類型和值假名字有不一樣前綴

sub 指令和子函數起點
locret
 返回指令
loc 指令
off
 數據,包含偏移量
seg 數據,包含段地址值
asc
 數據,ASCII字符串
byte 數據,字節(或字節數組)
word
 數據,16位數據(或字數組)
dword 數據,32位數據(或雙字數組)
qword
 數據,64位數據(或4字數組)
flt 浮點數據,32位(或浮點數組)
dbl
 浮點數,64位(或雙精度數組)
tbyte 浮點數,80位(或擴展精度浮點數)
stru
 結構體(或結構體數組)
algn 對齊指示
unk
 未處理字節

IDA中有常見的說明符號,如db、dw、dd分別表明了1個字節、2個字節、4個字節

IDA反編譯報錯

目前來講, 我遇到的反編譯報錯的狀況,通常是兩種

  • 一是因爲程序存在動態加密,致使程序的某些代碼段被修改,從而反編譯出錯,這種狀況,就須要去使用IDA-python解密一波,再進行F5反彙編

  • 二是因爲某些玄學問題,直接提示了某個地方出錯,通常來講,就按照IDA的提示,去進行修改

    好比,出現以下報錯:

那咱們就去找413238這個地址的地方,提示是說sp指針的值沒有被找到,說明是這裏出錯了,那麼就去修改sp的值,修改方法以下:

也可使用快捷鍵 Alt+K

有的時候,遇到的這種報錯

就嘗試着把報錯的地址的彙編語句改一哈,改爲nop,就能夠解決問題

目前來講,我遇到報錯的狀況很少,通常均可以經過以上方法解決

配置IDA

在ida的根目錄的cfg文件夾是專門用來存儲配置文件的

ida的主配置文件爲ida.cfg,另外的還有idagui.cfg,idatui.cfg這兩個配置文件對應IDA的GUI配置和文本模式的版本

1、ida.cfg

該文件包含了option-->general中的全部選項的配置,能夠經過選項中的描述在配置文件總找到相應的選項

這裏舉幾個例子:

SHOW_AUTOCOMMENTS 表示是否自動生成彙編指令的註釋

GRAPH_SHOW_LINEPREFIXES 表示是否在流程控制視圖中顯示地址

VPAGESIZE 表示內存調整參數,當處理很是大的輸入文件時,IDA可能報告內存不足而沒法建立新數據庫,在這種狀況下增大該參數,從新打開輸入文件便可解決問題

OPCODE_BYTES 表示要顯示的操做碼字節數的默認值

INDENTATION 表示指令縮進的距離

NameChars 表示IDA支持的變量命令使用的字符集,默認是數字+字母還有幾個特殊符號,若是須要添加就改變該參數

2、idagui.cfg

這個文件主要配置默認的GUI行爲,鍵盤的快捷鍵等,這個不多須要修改,不作過多介紹。感興趣的能夠本身打開該文件觀察,並不難懂,改改快捷鍵仍是很容易的

3、idatui.cfg

這個彷佛更加不經常使用。。。很少說了

須要注意的是,以上三個文件是默認配置,也就是說,每次打開建立新的ida數據庫的時候,都會以這三個配置文件的設置進行建立,以前臨時在菜單欄的設置就會消失,要永久設置ida的配置,就改這三個文件

但,凡是都有例外,在option-->font和option-->colors這兩個選項是全局選項,修改一次就永久生效的,不用在以上三個配置文件中改

最後

經過這一次系統地去學IDA,發現這個軟件真的是很是厲害,我上面也只是簡單地記錄了平時比較經常使用的功能和操做,IDA還有不少高級的開發技巧,甚至你還能自定義模塊和加載器等,也能本身製做ida的插件,在這個過程當中,發現看書真的很重要,本身看書和看網上別人總結的,徹底不同,搞二進制仍是得踏踏實實打好基礎,所謂萬丈高樓平地起。之前以爲每天對着電腦搞這些很累,進步又慢感受很難,而經歷這個黑暗寒假,我才知道這些東西再難也難不過生活,有個安安靜靜平平穩穩的生活去搞技術又未嘗不是一種幸運。

若是其餘大佬還有別的IDA小技巧騷操做,能夠留言交流一哈

from:https://xz.aliyun.com/t/4205

相關文章
相關標籤/搜索