【IDA】使用技巧及大雜燴

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功能。


跳轉指令分三類:

  • 無條件跳轉: 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內置有差錯控制的技術,所以一般能確保掃描結果的準確性。前兩種掃描模式幾乎在瞬間就可得到結果,最後一種有點慢,原因顯而易見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章