IDA Pro基本簡介
IDA載入完程式後,3個立即可見的視窗分別為IDA-View,Named,和訊息輸出視窗(output Window)。
IDA圖形檢視會有執行流,Yes箭頭預設為綠色,No箭頭預設為紅色,藍色表示預設下一個執行塊。
在暫存器視窗中顯示著每個暫存器當前的值和對應在反彙編視窗中的記憶體地址。函式在進入時都會儲存堆疊地址EBP和ESP,退出函式時恢復。
選擇選單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: 字串顯示視窗,會列出程式中的所有字串
IDA很智慧,滑鼠移到某些識別符號上會自動有適當的提示,雙擊還能自動跳到相應的位置。把一個函式逆向的方法很簡單,只要按F5鍵就會出來逆向出的C語言程式了。
退出IDA時,會進行檔案儲存確認,如果需要繼續進行分析,將IDA中間資料庫打包,下次繼續開啟就可以進行分析;如果不需要繼續分析,選擇不要打包,不要儲存資料庫。
IDA開啟應用程式時,會為其建立一個資料庫,字尾為IDB。IDB由4個檔案組成:
- 字尾為id0的二叉樹形式的資料庫,
- 字尾為id1的程式位元組標識,
- 字尾為nam的Named視窗的索引資訊,
- 字尾為til的給定資料庫的本地型別定義的相關資訊。
一旦IDA為某個可執行程式建立資料庫,它本身就不再需要訪問這個可執行檔案,除非使用IDA的Debug功能。
OD和IDA快捷鍵
跳轉指令分三類:
- 無條件跳轉: 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)
雙擊這裡或按Enter鍵可以跳到呼叫該處的地方
參考重新命名:
找到一段程式碼(一般為函式入口名),右鍵點選選擇”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