IDA Pro使用技巧及大雜燴
IDA Pro基本簡介
IDA加載完程序後,3個當即可見的窗口分別爲IDA-View,Named,和消息輸出窗口(output Window)。html

IDA圖形視圖會有執行流,Yes箭頭默認爲綠色,No箭頭默認爲紅色,藍色表示默認下一個執行塊。數據庫
在寄存器窗口中顯示着每一個寄存器當前的值和對應在反彙編窗口中的內存地址。函數在進入時都會保存堆棧地址EBP和ESP,退出函數時恢復。windows
選擇菜單Debugger下的Start process(也能夠按F9鍵)來開始調試。調試會讓程序在電腦中執行,因此IDA會提示注意提防惡意程序、病毒和木馬。 數組

打開IDA Pro 6.5,爲進入IDA界面提供三種選項,分別是New(新建),Go(運行),Previous(上一個)。 網絡

選擇File菜單下的Open,打開想要逆向的可執行文件,會顯示一個Load a new file的界面。這裏能夠選擇:
1. 程序的類型;
2. 處理器的類型;
3. 加載的段地址和偏移量;
4. 是否容許分析;
5. 一些加載選項;
6. 內核和處理器的一些選項;
7. windows系統dll所在的目錄。框架

默認選擇PE文件就能夠,對於一些網絡數據包或者其餘格式的文件,可使用二進制加載,本身進行解析。函數
工做區有多個子窗口,工具
- IDA View-A是反彙編窗口,
- HexView-A是十六進制格式顯示的窗口,
- Imports是導入表(程序中調用到的外面的函數),
- Functions是函數表(這個程序中的函數),
- Structures是結構,
- Enums是枚舉。
IDA view: 定位要修改的代碼段在哪裏。
Hex view: 用來修改咱們的數據
exports window: 導出窗口
import window: 導入窗口
names window: 函數和參數的命名列表
functions window: 樣本的全部函數窗口
strings window: 字符串顯示窗口,會列出程序中的全部字符串post

IDA很智能,鼠標移到某些標識符上會自動有適當的提示,雙擊還能自動跳到相應的位置。把一個函數逆向的方法很簡單,只要按F5鍵就會出來逆向出的C語言程序了。spa
退出IDA時,會進行文件保存確認,若是須要繼續進行分析,將IDA中間數據庫打包,下次繼續打開就能夠進行分析;若是不須要繼續分析,選擇不要打包,不要存儲數據庫。
IDA打開應用程序時,會爲其建立一個數據庫,後綴爲IDB。IDB由4個文件組成:
- 後綴爲id0的二叉樹形式的數據庫,
- 後綴爲id1的程序字節標識,
- 後綴爲nam的Named窗口的索引信息,
- 後綴爲til的給定數據庫的本地類型定義的相關信息。
一旦IDA爲某個可執行程序建立數據庫,它自己就再也不須要訪問這個可執行文件,除非使用IDA的Debug功能。
跳轉指令分三類:
- 無條件跳轉: JMP;
- 根據 CX、ECX 寄存器的值跳轉: JCXZ(CX 爲 0 則跳轉)、JECXZ(ECX 爲 0 則跳轉);
- 根據 EFLAGS 寄存器的標誌位跳轉, 這個太多了.
學 Win32 彙編[28] - 跳轉指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
— MOVSX MOVZX
好比
MOVSX EAX, BYTE PTR [00401000]
或
MOVZX EAX, BYTE PTR [00401000]
在C語言中應該如何表達啊?
好比定義一個全局變量
BYTE bt = 101;
DWORD dw;
應該如何把bt賦值到dw中. 而且功能與MOVSX/MOVZX相同?
彙編語言與C語言的語言構件不一樣,並非必定能轉成徹底等價的C語言的代碼的。
對於以上代碼,能夠這樣理解:
movsx ====> dw = (DWORD) ( (signed char) (bt) )
movzx ====> dw = (DWORD) ( (unsigned char) (bt) )
movzx是把高位所有用0填充,而movsx是把原來數的最高位擴展成超出的位。
對於bt=101,也就是0x65,八位二進制是「01100101」,由於它的最高位是0,所以這兩種狀況,dw都等於0x00000065
換一個,好比bt=247,也就是0xF7,八位二進制是「11111110」它的最高位是1。
通過movsx變換後,dw等於0xfffffff7;
而通過movzx變換後,dw等於0x000000f7
交叉參考
經過交叉參考(XREF)能夠知道指令代碼互相調用的關係.以下:
.text:00401165 loc_401165: ;CODE XREF:sub_401120+B|j
這句CODE XREF:sub_401120+B|j 表示該調用地址是401120,
「j」表示跳轉(jump)
「o」表示偏移值(offset)
「p」表示子程序(procedure)
雙擊這裏或按回車鍵能夠跳到調用該處的地方
參考重命名:
找到一段代碼(通常爲函數入口名),右鍵點擊選擇」Rename」能夠將函數名稱變成易懂的名稱.
標籤的用法:
在菜單」Jump」中選擇」Mark Position」 將會打開 標記當前位置功能,輸入一個名稱, 在菜單」Jump/Jump to marked position」 中或按」Ctrl+M」鍵雙擊想要調轉的名稱,便會到達制定的代碼位置.
進制的轉換:
選擇快捷鍵的#能夠轉換進制,選擇」Toggle leading zeroes」功能是用0填補數據前的空位.
cqd,爲Convert Double to Quad的縮寫,意爲將雙字數據擴展爲四字。
該指令先把edx的每一位置成eax的最高位(若eax>=0x80000000, 則edx=0xFFFFFFFF;若eax<0x80000000,則edx=0x00000000) ,再把edx擴展爲eax的高位。
該指令經常使用於擴展被除數,好久前,指令集規定除數必須是被除數的一半長,這個規定一直被沿用。使用IDIV執行除法時,若是除數是32位,這就要求被除數是64位,即EDX:EAX,因此擴展一下EAX以知足除法指令的條件而且獲得正確的結果。
DIV 和IDIV
DIV和IDIV兩個都是算術除法操做指令。DIV是無符號數除法 DIV s ;完成兩個無符號數相除。
IDIV 是有符號數除法指令,完成兩個有符號數相除。被除數、商、除數、餘數存放位置及對s的規定與DIV指令相同。

修改程序的指令或者數據,並進行保存
如何修改數據
在Hex View窗口下,
[S1]雙擊要修改的地方
[S2]使用F2捷方式修改當前字節
[S3]再按下F2快捷方式應用修改。
如何改變執行流程
[1]修改跳轉指令。
[2]修改內存數據。
[3]IDA View中使用下面的命令Jump to IP,Set IP, Run to cursor。
保存修改
使用下面的主菜單命令,直接把修改保存到輸入文件中,便可。
[IDA Main Menu]->[Edit]->[PatchProgram]->[Apply patches to input file…]。
OD中右鍵-保存到文件-選擇
個人OD是這樣的,只能修改一條,經過選擇,保存一條從新載入再修改再保存.
如何對DLL文件進行動態跟蹤
- 用[F2]在IDA View中當前代碼行切換斷點。
- 啓動裝載DLL的EXE文件。
- 使用[Debugger]->[Attach toprocess]把當前二進制代碼attach到正在運行的進程中去。
- 如今應該進入斷點。[F7]Stepinto。[F8]Stepover。[F9]continue。
- Cursor移到內存位置後雙擊就能夠查看到具體內存中的值,右擊快捷菜單[Jumpto IP]項,能夠回到你剛纔指令的地方。
- IDA View中有不少行代碼,可使用[;]快捷鍵對當前行進行註釋。
- 爲了觀察具體指令的二進制表示你還須要[IDAView]->[右擊快捷菜單]->[Synchronize with]->[Hex View 1]這樣Hex View會和你的IDA View中光標位置同步。
- 在IDA View中爲函數更名,用[N]快捷鍵。
- 觀察內存(變量)[Tool bar]->[Open the watch list window],[Toolbar]->[Add a variable towatch]。
- 若是做者混淆了二進制代碼,你須要IDAView在頻繁使用[D]ata快捷鍵,[C]ode快捷鍵,強制IDA,解析指定數據塊爲數據(Data)或代碼(Code)。
這些32位寄存器有多種用途,但每個都有「專長」,有各自的特別之處。
EAX 是」累加器」(accumulator), 它是不少加法乘法指令的缺省寄存器。
EBX 是」基地址」(base)寄存器, 在內存尋址時存放基地址。
ECX 是計數器(counter), 是重複(REP)前綴指令和LOOP指令的內定計數器。
EDX 則老是被用來放整數除法產生的餘數。
ESI/EDI 分別叫作」源/目標索引寄存器」(source/destination index),由於在不少字符串操做指令中, DS:ESI指向源串,而ES:EDI指向目標串.
EBP 是」基址指針」(BASE POINTER), 它最常常被用做高級語言函數調用的」框架指針」(frame pointer). 在破解的時候,常常能夠看見一個標準的函數起始代碼:
push ebp ; 保存當前ebp
mov ebp,esp ; EBP設爲當前堆棧指針
sub esp, xxx ; 預留xxx字節給函數臨時變量.
…
這樣一來,EBP 構成了該函數的一個框架, 在EBP上方分別是原來的EBP, 返回地址和參數. EBP下方則是臨時變量. 函數返回時做 mov esp,ebp/pop ebp/ret 便可.
ESP 專門用做堆棧指針,被形象地稱爲棧頂指針,堆棧的頂部是地址小的區域,壓入堆棧的數據越多,ESP也就愈來愈小。在32位平臺上,ESP每次減小4字節。
彙編中的ASSUME
常常用來將寄存器看成結構體指針來用
ASSUME edx:ptr STRUCT ;
將edx 定義爲STRUCT指針變量把STRUCT結構體的起始地址給edx
lea edx, STRUCT
這個時候能夠用 [edx].調用STRUCT的字段
ASSUME edx:nothing ;
取消定義 這個時候edx 不是指針
[edx].不能調用字段了
若是是8086的那麼將段REG ASSUME DS:(某個數據段)
這樣程序在使用這個數據段會用DS作段
Code段是不能指定段REG的 必須是CS:IP(EA)
快捷鍵
1. 按空格鍵切換反彙編窗口(列表視圖《=====》圖形視圖)
反彙編窗口有兩種顯示格式:面向文本的列表視圖和圖形視圖。不一樣視圖在不一樣的場景下各有所長,按空格鍵能夠快速切換。
2. 翻頁 esc 和 Ctrl+Enter
當執行跳轉功能後,須要返回時,只要在工具欄中點擊 <- 或按Esc鍵,列表便會日後跳一頁;
若要往前一頁,點擊 -> 或按」Ctrl+Enter」鍵.
3. 註釋 「;」和」:」
按;號輸入的註釋,全部交叉參考處都會出現,
按:號鍵輸入的註釋只在該處出現
4. 使用小鍵盤「-」,「+」查看函數之間的關係
IDAView下使用小鍵盤「-」,「+」快捷方式能夠在代碼同關係圖之間切換。
5. 使用[X]查看符號引用
IDA View下使用[X]快捷方式,定位引用了當前符號的代碼。
6. 快捷鍵F5顯示C僞代碼
若是有[Main menu]->[View]->[Open SubViews]->[Pseudocode F5]菜單,說明你已經安裝了Hex Rays decompiler插件,能夠在查看彙編的時候,按[F5]打開僞代碼子窗口。
7. 使用快捷鍵」*」把變量重定義爲數組。
8. 快捷鍵Ctrl+S,打開搜索類型選擇對話框–>雙擊Strings,跳到字符串段–>菜單項「Search–>Text」;
9. 快捷鍵Alt+T,打開文本搜索對話框,在String文本框中輸入要搜索的字符串點擊OK便可;
Open Subviews
窗口名稱 | 快捷鍵 |
---|---|
Names Window | Shift+F4 |
Functions Window | Shift+F3 |
Strings Window | Shift+F12 |
Segments | Shift+F7 |
Segment registers | Shift+F8 |
Signatures | Shift+F5 |
Type libraries | Shift+F11 |
Structures | Shift+F9 |
Enumerations | Shift+F10 |
Data Format Options
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
ASCII strings style | Alt+A | |
Setup data types | Alt+D |
File Operations
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Parse C header file | Ctrl+F9 | |
Create ASM file | Alt+F10 | |
Save database | Ctrl+W |
Navigation
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Jump to operand | Enter | |
Jump in new window | Alt+Enter | |
Jump to previous position | Esc | |
Jump to next position | Ctrl+Enter | |
Jump to address | G | |
Jump by name | Ctrl+L | |
Jump to function | Ctrl+P | |
Jump to segment | Ctrl+S | |
Jump to segment register | Ctrl+G | |
Jump to problem | Ctrl+Q | |
Jump to cross reference | Ctrl+X | |
Jump to xref to operand | X | |
Jump to entry point | Ctrl+E | |
Mark Position | Alt+M | |
Jump to marked position | Ctrl+M |
Debugger
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Start process | F9 | |
Terminate process | Ctrl+F2 | |
Step into | F7 | |
Step over | F8 | |
Run until return | Ctrl+F7 | |
Run to cursor | F4 |
Breakpoints
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Breakpoint list | Ctrl+Alt+B |
Watches
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Delete watch | Del |
Tracing
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Stack trace | Ctrl+Alt+S |
Search
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Next code | Alt+C | |
Next data | Ctrl+D | |
Next explored | Ctrl+A | |
Next unexplored | Ctrl+U | |
Immediate value | Alt+I | |
Next immediate value | Ctrl+I | |
Text | Alt+T | |
Next text | Ctrl+T | |
Sequence of bytes | Alt+B | |
Next sequence of bytes | Ctrl+B | |
Not function | Alt+U | |
Next void | Ctrl+V | |
Error operand | Ctrl+F |
Graphing
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Flow chart | F12 | |
Function calls | Ctrl+F12 |
Miscellaneous
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Calculator | ? | |
Cycle through open views | Ctrl+Tab | |
Select tab | Alt + [1…N] | |
Close current view | Ctrl+F4 | |
Exit | Alt+X | |
IDC Command | Shift+F2 |
Edit (Data Types – etc)
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Copy | Ctrl+Ins | |
Begin selection | Alt+L | |
Manual instruction | Alt+F2 | |
Code | C | |
Data | D | |
Struct variable | Alt+Q | |
ASCII string | A | |
Array | Num * | |
Undefine | U | |
Rename | N |
Operand Type
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Offset (data segment) | O | |
Offset (current segment) | Ctrl+O | |
Offset by (any segment) | Alt+R | |
Offset (user-defined) | Ctrl+R | |
Offset (struct) | T | |
Number (default) | # | |
Hexadecimal | Q | |
Decimal | H | |
Binary | B | |
Character | R | |
Segment | S | |
Enum member | M | |
Stack variable | K | |
Change sign | Underscore (_) | |
Bitwise negate | ~ | |
Manual | _ Alt+F1 |
Comments
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Enter comment | : | |
Enter repeatable comment | ; | |
Enter anterior lines | Ins | |
Enter posterior lines | Shift+Ins | |
Insert predefined comment | Shift+F1 |
Segments
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Edit segment | Alt+S | |
Change segment register value | Alt+G |
Structs
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Struct var | Alt+Q | |
Force zero offset field | Ctrl+Z | |
Select union member | Alt+Y |
Functions
窗口名稱 | 快捷鍵 | 備註 |
---|---|---|
Create function | P | |
Edit function | Alt+P | |
Set function end | E | |
Stack variables | Ctrl+K | |
Change stack pointer | Alt+K | |
Rename register | V | |
Set function type | Y |
Note:
1. IDA不提供撤銷功能,若是不當心按下某鍵,致使IDB數據庫文件發生意外,是沒法進行回退操做的。
PEID
掃描模式編輯
●正常掃描模式:可在PE文檔的入口點掃描全部記錄的簽名;
●深度掃描模式:可深刻掃描全部記錄的簽名,這種模式要比上一種的掃描範圍更廣、更深刻;
●核心掃描模式:可完整地掃描整個PE文檔,建議將此模式做爲最後的選擇。PEiD內置有差錯控制的技術,因此通常能確保掃描結果的準確性。前兩種掃描模式幾乎在瞬間就可獲得結果,最後一種有點慢,緣由顯而易見。
REFERENCE