IDA Pro7.0 使用技巧 总结
?
From:IDA Pro7.0 使用 技巧 總結(jié):https://www.52pojie.cn/thread-886103-1-1.html
?
?
俗話說,工欲善其事,必先利其器,在二進制安全的學習中,使用工具尤為重要,而IDA又是玩二進制的神器,以前在使用IDA的時候,只是用幾個比較常用的功能,對于IDA的其他功能沒有去研究,于是本著學習的精神,參考著《IDA pro權(quán)威指南》(第二版),寫下這篇文章,記錄自己的學習心得,下面的記錄都是在Windows平臺下的 IDA pro7.0進行的
?
IDA Pro:交互式反匯編器,是典型的遞歸下降反匯編器。
?
打開 IDA 后,IDA 會提供 3 種不同的打開方式:New(新建),Go(運行),Previous(上一個)。
初次打開的時候選擇 GO 就可以了。進入之后,選擇左上角的 file 中的 open 打開文件。
打開文件以后。IDA主界面:
- IDA View 三種反匯編視圖:文本視圖、圖表視圖、路徑視圖
- IDA View-A:是反匯編窗口。(?空格鍵 切換?文本視圖?與?圖表視圖? )
- HexView-A:十六進制格式顯示的窗口,
- Imports:? 導入表(程序中調(diào)用到的外面的函數(shù))。導入函數(shù)窗口
- Exports:?導出函數(shù)窗口
- Functions
- Structures:結(jié)構(gòu)體窗口。
- Enums:枚舉窗口
- Strings:字符串窗口(字符串窗口:View --> open subviews --> Strings,或者快捷鍵?shift+F12)
按下?F5 鍵可以查看偽代碼。IDA 圖形視圖會有執(zhí)行流,Yes 箭頭默認為綠色,No 箭頭默認為紅色,藍色表示默認下一個執(zhí)行塊。可以在左側(cè)查看代碼的運行過程,按下 空格鍵 也可以直觀地看到程序的圖形視圖。
?
導航條:
- 藍色:? ? ? ?表示常規(guī)的指令函數(shù)
- 黑色:? ? ? ?節(jié)與節(jié)之間的間隙
- 銀白色:? ? 數(shù)據(jù)內(nèi)容
- 粉色:? ? ? ?表示外部導入符號
- 暗黃色:? ? 表示ida未識別的內(nèi)容
如圖所示,藍色方框?標注了 顏色和對應說明:
?
跳轉(zhuǎn)相關(guān)
?
常用功能 及 快捷鍵:
- 空格鍵:? 切換?文本視圖?與?圖表視圖
- ESC:? ? ? 返回上一個操作地址
- G:? ? ? ? ? 搜索地址和符號
- N:? ? ? ? ? 對符號進行重命名
- 冒號鍵:? 常規(guī)注釋
- 分號鍵:? 可重復注釋
- Alt+M:? ? 添加標簽
- Ctrl+M:? 查看標簽
- Ctrl+S:? ?查看段的信息
- 代碼 數(shù)據(jù) 切換:
? ? ? ? C? ? --->? ? 代碼
? ? ? ? D? ? --->? ? 數(shù)據(jù)?
? ? ? ? A? ? --->? ? ascii 字符串
? ? ? ? U? ? --->? ? 解析成未定義的內(nèi)容 - P:? ? ? ?識別成一個函數(shù)
- X:? ? ? ?查看交叉應用
- F5:? ? ?查看偽代碼
- Alt+T: 搜索文本
- Alt+B: 搜索十六進制
偽 C 代碼窗口:右鍵 ---> comment? --->?注釋偽?C?代碼。
copy to assembly :?把偽 C?代碼復制到反匯編窗口的匯編代碼。
IDA 可以修改 so 的 hex 來修改 so,edit,然后 edit-patchrogram,也可以使用 winhex 來實現(xiàn)。
?
導入 jni.h 分析 jni 庫函數(shù)( 快捷方式:Ctrl + F9 ---> 選擇 jni.h 頭文件?):
?
?
在反匯編窗口中大多是 eax, ebx, ecx, edx, esi, edi, ebp, esp 等。這些都是 X86 匯編語言中 CPU 上的通用寄存器的名稱,是32位的寄存器。這些寄存器相當于C語言中的變量。
- EAX 是”累加器”(accumulator), 它是很多加法乘法指令的缺省寄存器。
- EBX 是”基地址”(base)寄存器, 在內(nèi)存尋址時存放基地址。
- ECX 是計數(shù)器(counter), 是重復(REP)前綴指令和LOOP指令的內(nèi)定計數(shù)器。
- EDX 則總是被用來放整數(shù)除法產(chǎn)生的余數(shù)。
- ESI/EDI 分別叫做”源/目標索引寄存器”(source/destination index),因為在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI 指向目標串。
- EBP 是”基址指針”(BASE POINTER), 它最經(jīng)常被用作高級語言函數(shù)調(diào)用的”框架指針”(frame pointer)。
- ESP 專門用作堆棧指針,被形象地稱為棧頂指針,堆棧的頂部是地址小的區(qū)域,壓入堆棧的數(shù)據(jù)越多,ESP也就越來越小。在32位平臺上,ESP每次減少4字節(jié)。
- 還有一些指令,如:mov,jmp等。
數(shù)據(jù)轉(zhuǎn)移指令
- MOV 移動
- MOVC 程式記憶體移動
- MOVX 外部RAM和擴展I/O口與累加器A的數(shù)據(jù)傳送指令
- PUSH 放入堆疊
- POP 由堆疊取回
- XCH 8位元交換
- XCHD 低4位元交換
- SWAP 高低4位元交換
算術(shù)指令
- ADD 兩數(shù)相加
- ADDC 兩數(shù)相加再加C
- SUBB 兩數(shù)相減再減C
- INC 加一指令
- DEC 減一指令
- MUL (MUL AB乘法指令僅此一條)相乘指令,所得的16位二進制數(shù)低8位存累加器A高8位存B
- DIV (DIV AB 除法指令僅此一條)相除指令,所得商存A,余數(shù)存B
- DA (DA A 只此一條指令)調(diào)整為十進數(shù)
邏輯指令
- ANL做AND(邏輯與)運算
- ORL做OR(邏輯或)運算
- XRL 做(邏輯異或)運算
- CLR 清除為0
- CPL 取反指令
- RL 不帶進位左環(huán)移
- RLC 帶進位左環(huán)移
- RR 不帶進位右環(huán)移
- RRC 帶進位右環(huán)移
控制轉(zhuǎn)移類指令
- JC C=1時跳
- JNC C=0時跳
- JB 位元=1時跳
- JNB 位元=0時跳
- JBC 位元=1時跳且清除此位元
- LCALL 長調(diào)用子程序
- ACALL 絕對調(diào)用子程序
- RET 由副程式返回
- RETI 由中斷副程式返回
- AJMP 絕對轉(zhuǎn)移
- SJMP 相對轉(zhuǎn)移
- JMP @A+DPTR 散轉(zhuǎn),相對DPTR的間接轉(zhuǎn)移
- JZ A=0時跳
- JNZA 0時跳
- CJNE 二數(shù)比較,不相等時跳
- DJNZ 減一,不等於0時跳
- NOP 空操作
位變量指令
- SETB 設(shè)定為1
- ORG 程序開始,規(guī)定程序的起始地址
- END 程序結(jié)束
- EQU 等值指令(先賦值后使用)例:SUM EQU 30H
- DB 定義字節(jié)指令
- DW 定義字內(nèi)容
- DS 定義保留一定的存貯單元數(shù)目
- BIT 位地址符號指令 例:SAM BIT P1.0
- RET 子程序返回指令
- RETI 中斷子程序返回指令
- $ 本條指令地址
了解這一些,相信大家可以更快的上手 IDA 這個利器了!
?
?
?
一些 二進制 工具
?
在《IDA pro權(quán)威指南》的開篇一兩章中,先是介紹了幾款常用于二進制研究的工具,我這里簡單的記了幾個,介紹一波:
- C++filt:可以用于顯示出c++中復雜的重載后的函數(shù)名稱
- PE tools:是一組用于分析Windows系統(tǒng)中正在運行的進程和可執(zhí)行文件的工具
- string:可以用于直接搜索出elf文件中的所有字符串。參數(shù) -a 表示搜索整個文件,參數(shù)-t 可以顯示出每一個字符串的偏移,參數(shù)-e 可以用于搜索更多的字符編碼的字符串,如Unicode編碼
- strip:可用于 elf 去符號,去符號后仍然保持正常功能但增加了逆向的難度,出題惡人必備
開發(fā)?IDA 的天才是 Ilfak,他的個人博客有很多 IDA 的教程:https://www.hexblog.com/
?
?
IDA 目錄結(jié)構(gòu)
?
在 IDA 的安裝根目錄下有許多文件夾,各個文件夾存儲不同的內(nèi)容
- cfg:包含各種配置文件,基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg,文本模式用戶界面配置文件idatui.cfg,
- idc:包含IDA內(nèi)置腳本語言IDC所需要的核心文件
- ids:包含一些符號文件
- loaders:包含用于識別和解析PE或者ELF
- plugins:附加的插件模塊
- procs:包含處理器模塊
?
?
常用快捷鍵
?
IDA 中的快捷鍵都是和菜單欄的各個功能選項一一對應的,基本上你只要能在菜單欄上找到某個功能,也就能看到相應的快捷鍵,這里記錄幾個常用的:
- a:將數(shù)據(jù)轉(zhuǎn)換為字符串
- f5:一鍵反匯編
- esc:回退鍵,能夠倒回上一部操作的視圖(只有在反匯編窗口才是這個作用,如果是在其他窗口按下esc,會關(guān)閉該窗口)
- shift+f12:可以打開string窗口,一鍵找出所有的字符串,右擊setup,還能對窗口的屬性進行設(shè)置
- ctrl+w:保存ida數(shù)據(jù)庫
- ctrl+s:選擇某個數(shù)據(jù)段,直接進行跳轉(zhuǎn)
- ctrl+鼠標滾輪:能夠調(diào)節(jié)流程視圖的大小
- x:對著某個函數(shù)、變量按該快捷鍵,可以查看它的交叉引用
- g:直接跳轉(zhuǎn)到某個地址
- n:更改變量的名稱
- y:更改變量的類型
- / :在反編譯后偽代碼的界面中寫下注釋
- \:在反編譯后偽代碼的界面中隱藏/顯示變量和函數(shù)的類型描述,有時候變量特別多的時候隱藏掉類型描述看起來會輕松很多
- ;:在反匯編后的界面中寫下注釋
- ctrl+shift+w:拍攝IDA快照
- u:undefine,取消定義函數(shù)、代碼、數(shù)據(jù)的定義
?
?
常用設(shè)置
?
拍攝快照
由于 IDA 不提供撤銷的功能,如果你不小心按到某個鍵,導致ida數(shù)據(jù)庫發(fā)生了改變,就得重新來過,所以要記得在經(jīng)常操作的時候,加上快照:file --> take database snapshot
加完快照后,會生成一個新的 ida 數(shù)據(jù)庫文件,本質(zhì)上是有點像另存的操作
快捷鍵:ctrl+shift+w
?
菜單欄常用設(shè)置
view --> open subviews: 可以恢復你無意中關(guān)閉的數(shù)據(jù)顯示窗口
windows --> reset desktop: 可以恢復初始ida布局
option --> font: 可以改變字體的相關(guān)屬性
?
在流程視圖中添加地址偏移
IDA 中的流程視圖可以說是非常的好用,簡單明了地能看出程序的執(zhí)行流程,尤其是在看if分支代碼和循環(huán)代碼的時候,能夠非常直觀
但是,我們還可以改得更加好用,在這個視圖中添加地址偏移的話,我們?nèi)〉刂肪头浅7奖?#xff0c;不再需要按空格切換視圖去找,在菜單欄中設(shè)置:option --> general
將該選項打鉤后就可以看到效果了:
?
自動添加反匯編注釋
這個功能對于萌新來說非常友好,在剛剛初學匯編的時候, 難免遇到幾個不常用的蛇皮匯編指令,就得自己一個個去查,很麻煩,開啟了自動注釋的功能后,IDA就可以直接告訴你匯編指令的意思
同樣是在菜單欄中設(shè)置:option --> general
效果如下:
?
?
常用操作
?
創(chuàng)建數(shù)組
在操作IDA的時候,經(jīng)常會遇到需要創(chuàng)建數(shù)組的情況,尤其是為了能方便我們看字符串的時候,創(chuàng)建數(shù)組顯得非常必要,以下我隨便找了個數(shù)據(jù)來創(chuàng)建數(shù)組
首先點擊選中你想要轉(zhuǎn)換成數(shù)組的一塊區(qū)域:
接著在菜單欄中選擇:edit --> array,就會彈出如下的選項框
下面來解釋一下各個參數(shù)的意思:
- Array element size?這個值表示各數(shù)組元素的大小(這里是1個字節(jié)),是根據(jù)你選中的數(shù)據(jù)值的大小所決定的
- Maximum possible size?這個值是由自動計算得出的,他表示數(shù)組中的元素的可能的最大值
- Array size?表示數(shù)組元素的數(shù)量,一般都根據(jù)你選定的自動產(chǎn)生默認值
- Items on a line?這個表示指定每個反匯編行顯示的元素數(shù)量,它可以減少顯示數(shù)組所需的空間
- Element print width?這個值用于格式化,當一行顯示多個項目時,他控制列寬
- Use “dup” construct?:使用重復結(jié)構(gòu),這個選項可以使得相同的數(shù)據(jù)值合并起來,用一個重復說明符組合成一項
- Signed elements?表示將數(shù)據(jù)顯示為有符號數(shù)還是無符號數(shù)
- Display indexes?顯示索引,使得數(shù)組索引以常規(guī)的形式顯示,如果選了這個選項,還會啟動右邊的Indexes選項欄,用于選擇索引的顯示格式
- Create as array?創(chuàng)建為數(shù)組,這個一般默認選上的
創(chuàng)建好了以后,就變成了這樣:
可以看到這些數(shù)據(jù)已經(jīng)被當成一個數(shù)組折疊到了一起,其中2 dup(0FFh)這樣的,表示有兩個重復的數(shù)據(jù)0xff
?
?
流程圖
?
折疊流程圖中的分支
在流程視圖中,分支過多的時候,可以在窗口標題處右擊選擇group nodes,就能把當前塊折疊起來
效果如下:
分支塊是可以自己命名的,方便自己逆向理解
?
函數(shù)調(diào)用圖
菜單欄中:view --> graphs --> Function calls(快捷鍵Ctrl+F12)
這個圖能很清楚地看到函數(shù)之間是如何相互調(diào)用的
?
函數(shù)流程圖
菜單欄中:view --> graphs --> flowt chart(快捷鍵F12)
這個其實跟IDA自帶的反匯編流程視圖差不多,他可以導出來作為單獨的一張圖
?
?
創(chuàng)建結(jié)構(gòu)體:
?
手工創(chuàng)建結(jié)構(gòu)體
創(chuàng)建結(jié)構(gòu)體是在 IDA 的 structures 窗口中進行的,這個操作在堆漏洞的pwn題中經(jīng)常使用
可以看到,這里已經(jīng)存在了四個結(jié)構(gòu)體,程序本身存在的,可以右擊選擇hide/unhide,來看具體的結(jié)構(gòu)體的內(nèi)容
創(chuàng)建結(jié)構(gòu)體的快捷鍵是:insert
在彈出的窗口中,可以編輯結(jié)構(gòu)體的名字
這底下有三個復選框,第一個表示顯示在當前結(jié)構(gòu)體之前(就會排列在第一位,否則排列在你鼠標選定的位置),第二個表示是否在窗口中顯示新的結(jié)構(gòu)體,第三個表示是否創(chuàng)建聯(lián)合體。
需要注意的是,結(jié)構(gòu)體的大小是它所包含的字段大小的總和,而聯(lián)合體的大小則等于其中最大字段的大小
在單擊ok以后,就定好了一個空的結(jié)構(gòu)體:
將鼠標放在 ends這一行,單擊快捷鍵D即可添加結(jié)構(gòu)體成員,成員的命名默認是以field_x表示的,x代表了該成員在結(jié)構(gòu)體中的偏移
同時,可以把鼠標放在結(jié)構(gòu)體成員所在的行,按D,就可以切換不同的字節(jié)大小
默認情況下可供選擇的就只有db,dw,dd(1,2,4字節(jié)大小)
如果想添加型的類型,可以在option-->setup data types(快捷鍵Alt+D),進行設(shè)置
如圖,勾選了第五個和第九個的話,就會出現(xiàn)dq和xmmword了(代表了8字節(jié)和16字節(jié))
如果要添加數(shù)組成員則可以對著成員所在的那一行,右擊選擇array
如圖,要創(chuàng)建的是16個元素的4字節(jié)數(shù)組
如果要刪除結(jié)構(gòu)體,那么對著結(jié)構(gòu)體按下delete鍵即可刪除
如果要刪除成員,則對著成員按下u(undefine)但是需要注意的是,這里只是刪除了成員的名字,而沒有刪除它所分配的空間
如圖,我們刪除了中間的field_10的數(shù)組成員:
會變成這樣:
數(shù)組所分配的20個字節(jié)的空間并沒有被刪除,這時如果要刪除掉這些空間,就需要在原來數(shù)組成員所在的第一行中按下Ctrl+S,刪除空間(Edit-->shrink struct types)
就可以真正的刪除掉成員
給結(jié)構(gòu)體的成員重命名可以用快捷鍵N
我們在IDA中創(chuàng)建好了結(jié)構(gòu)體以后,就是去應用它了
如圖,這是一個典型的堆的題目
可以看到v1是一個新建的chunk的地址指針,而后的操作都是往chunk不同的偏移位置寫入內(nèi)容,為了方便我們逆向觀察,可以將其變成一個結(jié)構(gòu)體,通過v1?v1+4?v1+0x48?這樣的偏移,創(chuàng)建好結(jié)構(gòu)體后,將char *v1的類型改成mail *v1,(快捷鍵Y可以更改函數(shù)、變量的類型和參數(shù))這個mail是我們創(chuàng)建的結(jié)構(gòu)體的名稱,效果如下:
?
導入C語言聲明的結(jié)構(gòu)體
實際上,IDA有提供一個更方便的創(chuàng)建結(jié)構(gòu)體的方法,就是直接寫代碼導入
在View-->Open Subviews-->Local Types中可以看到本地已有的結(jié)構(gòu)體,在該窗口中右擊insert
可以添加新的結(jié)構(gòu)體:
這樣就導入了新的結(jié)構(gòu)體:
但同時我們發(fā)現(xiàn)structure視圖里面,并沒有這個結(jié)構(gòu)體,我們需要對著my_structure右擊,選擇 synchronize to idb
這樣structure視圖就有了,如圖
這里你會發(fā)現(xiàn),多出來兩個db的undefined的成員,這是因為ida默認是會把結(jié)構(gòu)體統(tǒng)一4字節(jié)對齊的,滿足結(jié)構(gòu)體的大小為0x28
?
?
IDA 動態(tài)調(diào)試 elf:
這里我以一個在Ubuntu虛擬機中的elf為例子,進行調(diào)試
首先把ida目錄中的dbgsrv文件夾中的linux_server64拷貝到Ubuntu的elf的文件夾下,這個elf是64位的所有用的是linux_server64,如果你調(diào)試的是32位的程序,你就需要拷貝linux_server
記得給他們權(quán)限,然后在終端運行,這個程序的作用就像是連接ida和虛擬機中elf的橋梁
然后再到ida中進行配置:
在菜單欄中選擇:debugger --> process options
注意,application和input file 都是填寫在虛擬機中的elf的路徑,記得要加文件名
而directory 填寫elf所在目錄,不用加文件名
hostname是虛擬機的ip地址,port是默認的連接端口
parameter和password一般都不用填
設(shè)置好了以后點擊ok
接著可以直接在反匯編視圖中下斷點,只要點擊左邊的小藍點即可
這時按下快捷鍵F9,可以直接開始調(diào)試
按下快捷鍵F4,則直接運行到斷點處停下
這個就是基本的各個功能區(qū)的介紹,上面是我比較喜歡的常用布局,和ida默認的不太一樣,想要自定義添加一些視圖的話,可以在debugger-->quick debug view中添加
另外可以在Windows-->save desktop來保持當前的視圖布局,以后就可以直接加載使用
下面介紹一些常用的快捷鍵
F7?單步步入,遇到函數(shù),將進入函數(shù)代碼內(nèi)部
F8?單步步過,執(zhí)行下一條指令,不進入函數(shù)代碼內(nèi)部
F4?運行到光標處(斷點處)
F9?繼續(xù)運行
CTRL+F2?終止一個正在運行的調(diào)試進程
CTRL+F7?運行至返回,直到遇到RETN(或斷點)時才停止.
知道了這些快捷鍵后,調(diào)試起來就比較容易了,ida調(diào)試有個比較方便的地方在于能直接看到函數(shù)的真實地址,下斷點也非常直觀易操作
?
?
IDA-python
在IDA的最下面有個不起眼的Output Window的界面,其實是一個終端界面,這里有python終端和IDC終端
這里的 python是2.7的版本,雖然老了點,但已經(jīng)足夠我們用了,在IDA的運用中,我們經(jīng)常需要計算地址,計算偏移,就可以直接在這個終端界面進行操作,非常方便
當然上面說的只是很簡單的 python 用法,真正的IDA-python的用法是這樣的:
這里以簡單的一道逆向題來做個例子
這個程序很簡單,一開始來個for循環(huán),把judge函數(shù)的內(nèi)容全部異或0xc,這樣就導致了程序一運行就會直接破壞掉judge函數(shù)
從而使得沒法進行后面的flag判斷
這里我們就需要寫一個腳本來先把被破壞的內(nèi)容還原,這里IDA提供了兩種寫腳本操作的方法,一種就是IDC腳本,一種就是python腳本
這里只簡單的介紹IDA-python
而IDA-python通過三個python模塊將python代碼注入IDA中:
idaapi模塊負責訪問核心IDA API
idc模塊負責提供IDA中的所有函數(shù)功能
idautils模塊負責提供大量實用函數(shù),其中許多函數(shù)可以生成各種數(shù)據(jù)庫相關(guān)對象的python列表
所有的IDApython腳本會自動導入idc和idautils模塊,而idaapi模塊得自己去導入
這里貼上IDApython的官方函數(shù)文檔,這里包含了所有函數(shù),值得一看
針對以上的題目,我們只需要做一個腳本,指定judg函數(shù)的0-181范圍的字節(jié)異或0xc,即可恢復
judge=0x600B00 for i in range(182):addr=0x600B00+ibyte=get_bytes(addr,1)#獲取指定地址的指定字節(jié)數(shù)byte=ord(byte)^0xCpatch_byte(addr,byte)#打patch修改字節(jié)在菜單欄中file-->script file,加載python腳本
接著在judge函數(shù)中undefined掉原來的函數(shù),在重新生成函數(shù)(快捷鍵p),就可以重新f5了
腳本中出現(xiàn)的函數(shù)都是已經(jīng)封裝在idc模塊中的,具體可查官方文檔
這只是一個簡單的IDApython的使用例子,實際上這個功能非常強大,能弄出非常騷的操作
?
?
打 PATCH
打patch,其實就是給程序打補丁,本質(zhì)上是修改程序的數(shù)據(jù),指令等,這在CTF中的AWD賽制中經(jīng)常用到,發(fā)現(xiàn)程序漏洞后馬上就要用這個功能給程序打好patch,防止其他隊伍攻擊我們的gamebox
這里,我是用一個叫 keypatch 的插件進行操作的,IDA 自帶的 patch 功能不太好用
?
安裝 keypatch
這個很簡單,教程在github就有
下載Keypatch.py復制到插件目錄
IDA 7.0\plugins\Keypatch.py
下載安裝keystone python模塊,64位系統(tǒng)只需要安裝這一個就行
https://github.com/keystone-engine/keystone/releases/download/0.9.1/keystone-0.9.1-python-win64.msi
安裝好后,你就會發(fā)現(xiàn)這里有個 keypatch 的選項
?
修改程序指令
如果我們要修改程序本身的指令,怎么做呢
如圖,我們要修改63h這個值
將鼠標指向改行,按快捷鍵 Ctrl+Alt+K
直接輸入?yún)R編語句即可修改,打好patch后效果如圖:
這里會生成注釋告訴你,這里打過patch,非常人性化
接著還要在菜單欄進行設(shè)置才能真正使得patch生效
這樣一來,原來的程序就已經(jīng)被修改了
?
撤銷 patch
如果不小心打錯了patch,就可以在這里進行撤銷上一次patch的操作了
但是如果打了很多次patch,不好分清該撤銷哪一次的patch,那么可以在菜單欄中打開patched bytes界面
看到所有的patch,要撤銷哪一個就右擊選擇 revert
?
?
IDA 導出數(shù)據(jù)文件
在菜單欄中,這里有個選項可以生成各種不同的輸出文件
這里簡單的介紹前兩個文件,后面的大家可以自己去生成測試一下用途,我這里就不詳細介紹了
- .map 文件 描述二進制文件的總體結(jié)構(gòu),包括與構(gòu)成改二進制文件的節(jié)有關(guān)的信息,以及每個節(jié)中符號的位置。
- .asm文件,也就是匯編了,直接能導出ida中反匯編的結(jié)果,這個非常實用,有的時候在逆向中經(jīng)常遇到大量數(shù)據(jù)加解密的情況,如果在從IDA中一個個慢慢復制可就太沒效率了,直接導出生成asm,在里面復制數(shù)據(jù)快很多
?
?
IDA常見命名意義
?
IDA經(jīng)常會自動生成假名字。他們用于表示子函數(shù),程序地址和數(shù)據(jù)。根據(jù)不同的類型和值假名字有不同前綴
sub?指令和子函數(shù)起點locret?返回指令
loc?指令off?數(shù)據(jù),包含偏移量
seg?數(shù)據(jù),包含段地址值asc?數(shù)據(jù),ASCII字符串
byte?數(shù)據(jù),字節(jié)(或字節(jié)數(shù)組)word?數(shù)據(jù),16位數(shù)據(jù)(或字數(shù)組)
dword?數(shù)據(jù),32位數(shù)據(jù)(或雙字數(shù)組)qword?數(shù)據(jù),64位數(shù)據(jù)(或4字數(shù)組)
flt?浮點數(shù)據(jù),32位(或浮點數(shù)組)dbl?浮點數(shù),64位(或雙精度數(shù)組)
tbyte?浮點數(shù),80位(或擴展精度浮點數(shù))stru?結(jié)構(gòu)體(或結(jié)構(gòu)體數(shù)組)
algn?對齊指示unk?未處理字節(jié)
IDA中有常見的說明符號,如db、dw、dd分別代表了1個字節(jié)、2個字節(jié)、4個字節(jié)
?
?
IDA反編譯報錯
?
目前來說, 我遇到的反編譯報錯的情況,一般是兩種
-
一是由于程序存在動態(tài)加密,導致程序的某些代碼段被修改,從而反編譯出錯,這種情況,就需要去使用IDA-python解密一波,再進行F5反匯編
-
二是由于某些玄學問題,直接提示了某個地方出錯,一般來說,就按照 IDA 的提示,去進行修改。
比如,出現(xiàn)如下報錯
那我們就去找413238這個地址的地方,提示是說sp指針的值沒有被找到,說明是這里出錯了,那么就去修改sp的值,修改方法如下:
也可以使用快捷鍵 Alt+K
有的時候,遇到的這種報錯
就嘗試著把報錯的地址的匯編語句改一哈,改成nop,就可以解決問題
目前來說,我遇到報錯的情況不多,一般都可以通過以上方法解決
?
?
配置IDA
?
在ida的根目錄的cfg文件夾是專門用來存儲配置文件的
ida的主配置文件為ida.cfg,另外的還有idagui.cfg,idatui.cfg這兩個配置文件對應IDA的GUI配置和文本模式的版本
?
一、ida.cfg
該文件包含了option-->general中的所有選項的配置,可以通過選項中的描述在配置文件總找到相應的選項
這里舉幾個例子:
SHOW_AUTOCOMMENTS?表示是否自動生成匯編指令的注釋
GRAPH_SHOW_LINEPREFIXES?表示是否在流程控制視圖中顯示地址
VPAGESIZE?表示內(nèi)存調(diào)整參數(shù),當處理非常大的輸入文件時,IDA可能報告內(nèi)存不足而無法創(chuàng)建新數(shù)據(jù)庫,在這種情況下增大該參數(shù),重新打開輸入文件即可解決問題
OPCODE_BYTES?表示要顯示的操作碼字節(jié)數(shù)的默認值
INDENTATION?表示指令縮進的距離
NameChars?表示IDA支持的變量命令使用的字符集,默認是數(shù)字+字母還有幾個特殊符號,如果需要添加就改變該參數(shù)
?
二、idagui.cfg
這個文件主要配置默認的GUI行為,鍵盤的快捷鍵等,這個很少需要修改,不做過多介紹。感興趣的可以自己打開該文件觀察,并不難懂,改改快捷鍵還是很容易的
?
三、idatui.cfg
這個似乎更加不常用。。。不多說了
需要注意的是,以上三個文件是默認配置,也就是說,每次打開創(chuàng)建新的ida數(shù)據(jù)庫的時候,都會以這三個配置文件的設(shè)置進行創(chuàng)建,之前臨時在菜單欄的設(shè)置就會消失,要永久設(shè)置ida的配置,就改這三個文件
但,凡是都有例外,在option-->font和option-->colors這兩個選項是全局選項,修改一次就永久生效的,不用在以上三個配置文件中改
?
?
最后
通過這一次系統(tǒng)地去學IDA,發(fā)現(xiàn)這個軟件真的是非常厲害,我上面也只是簡單地記錄了平時比較常用的功能和操作,IDA還有很多高級的開發(fā)技巧,甚至你還能自定義模塊和加載器等,也能自己制作ida的插件,在這個過程中,發(fā)現(xiàn)看書真的很重要,自己看書和看網(wǎng)上別人總結(jié)的,完全不一樣,搞二進制還是得踏踏實實打好基礎(chǔ),所謂萬丈高樓平地起。以前覺得天天對著電腦搞這些很累,進步又慢感覺很難,而經(jīng)歷這個黑暗寒假,我才知道這些東西再難也難不過生活,有個安安靜靜平平穩(wěn)穩(wěn)的生活去搞技術(shù)又何嘗不是一種幸運。
如果其他大佬還有別的IDA小技巧騷操作,可以留言交流一哈
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的IDA Pro7.0 使用技巧 总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创建型、结构型、行为型模式(1)
- 下一篇: 可以叫板Google的一个搜索引擎 ——