OlllyDbg調試器和IDA調試器


OllyDbg調試器

OllyDbg稱為Ring3級的首選工具。可以識別數千個被和Windows頻繁使用的函數,並能將其注釋出來。它會自動分析函數過程、循環語句等

OllyDbg主界面

快捷鍵

  • Address列:顯示被雙擊行地址的相對地址,再次雙擊返回標准地址模式。

  • Hex dump列:設置或取消無條件斷點,對應的快捷鍵是"F2鍵"

  • Disassembly列:調用匯編器,可直接修改匯編代碼,對應的快捷鍵是空格鍵

  • Comment列:允許增加或編輯注釋,對應的快捷鍵是 ";" 鍵
    從鍵盤上選擇多行,可按Shifit鍵和上下光標鍵來實現。

信息面板窗口

在進行動態跟蹤時,信息面板窗口(Information window)將顯示與指令相關的各個寄存器的值、API函數調用提示和跳轉調試等信息。

數據面板窗口

數據面板窗口(Dump window)以十六進制和字符方式顯示文件在內存中的數據。要顯示指定內存地址的數據,可的那幾右鍵快捷菜單中的"Go to expression"命令或按"Ctrl+G"快捷鍵,打開地址窗口,輸入地址。

寄存器面板窗口

寄存器面板窗口(Registers Window)顯示CPU各寄存器的值,支持浮點、MMX和3DNow!寄存器可以單擊右鍵或窗口標題切換顯示寄存器的方式。

棧面板窗口

棧面板窗口(Stack window)顯示棧的內容,即ESP指向地址的內容。將數據放入棧的操作為入棧(push) 從棧中取出數據的操作稱為出棧(pop)。棧窗口非常重要,各API函數和子程序都利用它傳遞參數和變量等

基本操作

單步功能的快捷鍵是 F7鍵(路過) 和 F8鍵(跟進)
1.
在編譯時,優化時有兩種選擇一個是 Maximize Speed (最大速度) 和Minimize Size(最大)優化選項進行編譯

因為優化選項不同,所以生成的匯編代碼也會不同。

這就涉及到編譯原理的知識了。

IDA編譯器

IDA安裝成功后,會在桌面上生成兩個圖標,分別為IDA Pro(32-bit)和IDA Pro(64-bit),它們分別對於32位和64位程序的分析。IDA支持的文件類型非常豐富,除了常見的PE格式,還支持DOS、UNIX、Mac、Java、.NET等平台的文件格式。單擊"File"->"Open"菜單項,打開要目標文件.exe文件,IDA一般能自動識別其格式

IDA是按區塊裝載PE文件的,例如.text(代碼塊)、.data(數據塊)、.rsrc(資源塊)、.data(輸入表)和.edata(輸入表)等。IDA反匯編所消耗的時間與程序大小及復雜程度有關,通常需要等待一段時間才能完成。

第一階段

將程序的代碼和數據分開,分別標記函數並分析其參數調用,分析跳轉,調用等指令關系並給標簽賦值等。

第二階段

如果IDA能夠識別文件的編譯類型,就裝載對應的編譯器特征文件,然后給各函數賦名。隨后,IDA會創建一個數據庫,其組件分別保存在擴展名為  .id0、id1、.nam 和 .til的4個文件里,這些文件的格式為IDA專用,在關閉當前項目時,這四個文件將被存檔為一個IDB文件。一旦IDA創建了數據庫,就不需要再訪問這個可執行文件,除非使用IDA的集成調試器調試這個可執行文件本身。再次分析該目標文件時,IDA只需要打開現有數據庫,就會將界面恢復為上次關閉時的狀態。

"Kernel option1" "Kernel option2" "Processor option" 這3個選項可以控制反匯編引擎的工作狀態,一般使用默認設置。IDA會自動識別程序類別與處理器類型,在大多數情況下,分析選項的默認值會在准確與方便性之間提供一個折中的參數。

導航欄

注釋

使用IDA可以方便地在代碼后面輸入注釋。在窗口右鍵空白處單擊右鍵,將顯示輸入注釋的快捷菜單項,一個是"Enter comment"(快捷鍵時冒號),另一個是"Enter repeatable comment"(快捷鍵是分號)按";"
按";"鍵輸入的注釋在所有交叉參考處都會出現,按":"鍵輸入的注釋只在該處出現。如果一個地址處有兩種注釋,將只顯示非重復注釋。

跳轉到地址窗口

可以在反匯編窗口上下滾動,直至看到想要訪問的地址。若直到目標地址,可以用IDA提供的快捷鍵"G"打開"Jump to address"(跳轉到地址)

交叉參考

通過交叉參考(XREF)可以直到指令代碼相互調用的關系。如下圖:"CODE XREF":sub_401120+ j表示該調用地址是401120h,"j"表示跳轉(jump)。此外,"o" 表示偏移量(offset) "p"表示子程序(procedure)雙擊此處或按"Enter"鍵可以跳轉到調用該處的地方。

參考重命名

參考重命名(Renaming of reference)是IDA的一個極好的功能,它可以將反匯編清單中的一些默認名稱更改為有意義的名稱,增加了代碼的可讀性。要修改一個名稱,只需單擊希望修改的名稱(使其突出顯示),並使用快捷鍵"N"打開更名對話框。

  • Local name: 局部符號名的作用域僅限於當前函數。

  • Include in names list:勾選這個選型,將有一個名稱被添加到名稱窗口中。

  • Pulic name: 由二進制文件(例如 DLL)輸出的名稱。

  • Autogenerated name:自動創建符號名。

標簽的用法

單擊菜單項"Jump"-->"Mark position",打開"標記當前位置"功能,會出現如圖3.12所示的對話框。
為這個標記(當前光標位置)加上標簽,"WndProc" 標簽就是需要返回的位置。當離開這個標記並返回時,選擇菜單項"Jump"->"Jump to marked position",或者按"Ctrl+M"快捷鍵,執行"跳轉到標記位置"功能

格式化指令操作數

IDA可以格式化指令使用的常量,因此應盡可能使用符號名稱而非數字,從而使反匯編編碼更具有可讀性。IDA根據被反匯編指令的 上下文、所使用的數據作出格式化決定。對其他情況,IDA一般會將相關常量格式化成一個十六進制常量。
IDA可以提供多種進制顯示。將光標移到需要轉換進制的常量上,單擊右鍵,所示的上下文菜單。該菜單提供的選項可將常量格式化十進制、八進制或二進制的值。

代碼和數據轉換

很多工具在進行反匯編的時候可能無法正確區分數據和代碼,IDA也不例外,數據字節坑能被錯誤地識別為代碼字節,而代碼字節可能被錯誤地識別為數據字節。有些程序就是利用這一點來對抗靜態反匯編的。IDA的交互性使用戶可以將某段十六進制數據指定為代碼或數據,即利用用腦來區別代碼和數據
如果確信某段十六進制數據是一段指令,只要將光標移到其第一個字節的編譯位置,執行菜單命令"Edit"->"Code"或按"C"鍵即可。按"P"鍵可以將某段代碼定義為子程序,並列處參數調用。若要取消定

字符串

數組

IDA有着強大的聚合能力。它可以將一串數據聲明變成一個反匯編行,按數據的 形式顯示,從而簡化反匯編代碼清單。
用IDA打開實例Arrays.exe,數組用C語言的描述,代碼如下。

static int a[3] = {0x11,0x22,0x33};

匯編代碼如下。

.text:00401009         mov edi,dword_4070330[eax]

其中,407030h指向一個數組,如圖

將光標移到需要處理的數據處,選擇菜單項"Edit"——>"Array"或按 "*" 鍵,打開數組排列調整窗口

設置完成,數據按1x3的形式排列,如圖

.data:00407030 dword_407030 dd 11hh ,22h,33h ; DATA XREF:_main:loc_401009

結構體

在C語言中,結構體(struct)是一種數據結構,可以將不同類型的數據結構組合到一個復合的數據類型中,結構體可以被聲明為變量、指針或數組等,從而實現比較復雜的數據結構。

創建結構體

對一些常見的文件類型,IDA會自動加載相應的類型庫,例如vc6.0在進行底層分析時,可以增強mssdk(windows.h) ntddk(ntddk.h)等這些類型庫中有相應的結構體,用戶分析代碼時可以直接引用。按Shift+F11快捷鍵,打開加載類型庫窗口(Loaded Tyepe Libraries),在彈出的"Available Type Livbraries" 窗口中選擇類型庫

此時就可以查看內置的結構體數據結構了。選擇"View" -> "Open subviews" ->"Structures"菜單選項,打開結構體管理窗口

枚舉類型

可以在反匯編時用IDA動態定義和操作枚舉類型(Enumerated Types)。看看下面這段簡單的C語言程序,在用IDA進行反匯編后,得到了一些沒有意義的數字

//Enumerated.cpp
int main(void)
{
  enum weekday {
MONDAY,
TUESDAY,
WEDNESDAY,
THUSDAY,
FRIDAY,
SATURDAY,
SUNDAY};
printf("%d,%d,%d,%d,%d,%d,%d",MONDAY,TUESDAY,WEDNESDAY,THUSDAY,FRIDAY,SATURDAY,SUNDAY);
return 0;
}


可以用枚舉類型來表示這些數字。執行"View"-->"Open subviews" -->"Enumerations"選項,打開枚舉窗口,按"Insert"鍵插入一個新的枚舉類型"weekday".在新建的weekday枚舉類型中按"N"鍵添加枚舉成員 "0"對應於"MONDAY","1"對應於"TUESDAY"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM