目錄
一、IDA
1.1、簡介:
1.2、使用方法:
(1)IDA打開文件
(2)IDA主窗口介紹
(3)IDA的基本使用
二、調(diào)試器
2.1、簡介:
2.2、Ollydbg
(1)主界面
(2)斷點操作
(3)代碼跟蹤操作
2.3、gdb
(1)簡介:
(2)安裝
(3)基本的調(diào)試操作
三、Trace類工具
3.1、簡介:
3.2、Qira
一、IDA
1.1、簡介:
反匯編工具有很多,但功能最強大、應(yīng)用最廣泛的當屬IDA Pro(簡稱IDA)。在反編譯方面,最好的反編譯工具為IDA自帶的Hex-Ray插件(快捷鍵為F5),所以這里主要介紹IDA。
IDA支持的文件類型非常豐富,除了包括PE格式、ELF格式之外,還包括DOS、Mach-O、.NET等文件格式。同時IDA還支持幾十種不同的處理器架構(gòu)。
1.2、使用方法:
(1)IDA打開文件
通過菜單欄中的File→Open,選擇要分析的目標程序,IDA自動識別出了程序為x86_64的ELF程
序,直接點擊OK即可。
(2)IDA主窗口介紹
(1)工具欄區(qū)域:常用工具
(2)導(dǎo)航帶:加載文件的地址空間的線性視圖,其會呈現(xiàn)二進制文件的整個地址范圍。不同的顏色表示不同類型的文件
(3)函數(shù)窗口:顯示了所有的函數(shù)
(4)數(shù)據(jù)顯示窗口:數(shù)據(jù)顯示窗口包括:反匯編窗口、反編譯窗口、導(dǎo)入表窗口、導(dǎo)出表窗口、結(jié)構(gòu)體窗口等。
(5)消息窗口:是IDA輸出的信息,等同于一個控制臺輸出設(shè)備。
(3)IDA的基本使用
(1)函數(shù)修正
以push ebp/rbp指令開頭的地址為一個函數(shù)的起始地址,但是有時候IDA并沒有將其正確地識別為函數(shù),此時就需要手動地將其創(chuàng)建為函數(shù),創(chuàng)建函數(shù)之后通常就能對該函數(shù)進行反編譯操作
創(chuàng)建函數(shù)的方式為:在函數(shù)的起始地址的匯編代碼處,點擊右鍵,選擇Create Function,對應(yīng)的快捷鍵為P
(2)指令修正
在IDA中,如果某些指令或者數(shù)據(jù)識別有誤,可以進行手動修正(如使用快捷鍵D可轉(zhuǎn)化為數(shù)據(jù),使用快捷鍵C可轉(zhuǎn)化為代碼)
(3)數(shù)據(jù)修正
在數(shù)據(jù)段中,一個數(shù)據(jù)的長度可能為1、2、4或8字節(jié),此時可以通過快捷鍵D來修改為對應(yīng)的類型。
如果數(shù)據(jù)段中的某個部分為一個字符串,但是IDA并沒有正確識別,那么可以使用快捷鍵A將其轉(zhuǎn)換為一個ASCII字符串。
(4)注釋信息與重命名
修改程序中的變量或者函數(shù)名等信息幫助讀者理解,點擊右鍵,選擇Rename即可進行重命名。
此外,還可以為代碼添加注釋,使用快捷鍵“;”可以在反匯編窗口中添加注釋,使用快捷鍵“/”可以在反編譯窗口添加注釋。
對于一些針對不常用處理器架構(gòu)編寫的程序,可以開啟匯編的自動注釋功能。開啟的方式為勾選界面中的Auto comments
(5)二進制程序的patch
將修正后的多余字節(jié)轉(zhuǎn)化為空指令(nop指令,對應(yīng)的字節(jié)碼為0x90),這樣函數(shù)就能夠正常地反編譯
選擇菜單欄中的Edit→Patch program→Change byte功能進行修改
(6)交叉引用
IDA中包含了兩類:代碼交叉引用和數(shù)據(jù)交叉引用。
代碼交叉引用:
用于表示一條指令將控制權(quán)轉(zhuǎn)交給另一條指令。通過代碼交叉引用,可以知道哪些指令調(diào)用了哪個函數(shù)或指令。
數(shù)據(jù)交叉引用:
可用于追蹤二進制文件訪問數(shù)據(jù)的方式。通過數(shù)據(jù)交叉引用,可以知道哪些指令訪問了哪些數(shù)據(jù)。
二、調(diào)試器
2.1、簡介:
在逆向分析領(lǐng)域,分析者也會利用相關(guān)的調(diào)試工具來分析軟件的行為并驗證結(jié)果
調(diào)試器的兩個最基本的特征是:斷點設(shè)置和代碼跟蹤。
斷點允許用戶選擇程序中任意位置的某行代碼,一旦程序運行到這一行,那么它將指示調(diào)試器暫停運行程序,并顯示程序的當前狀態(tài)。
代碼跟蹤允許用戶在程序運行時跟蹤它的執(zhí)行,跟蹤意味著程序每執(zhí)行一條匯編代碼然后暫停,并允許用戶觀察甚至改變程序的狀態(tài)。
常用的調(diào)試器包括:Ollydbg、x64dbg、Windbg和gdb等。其中,Ollydbg可以調(diào)試Windows下的32位用戶態(tài)程序;x64dbg可以調(diào)試Windows下的64位應(yīng)用程序;Windbg是微軟提供的調(diào)試器,可以對用戶程序和系統(tǒng)內(nèi)核進行調(diào)試,但是GUI界面相對來說沒有那么友好;gdb是Linux系統(tǒng)下所用的主要調(diào)試器。下面主要講解最常用到的Ollydbg和gdb。
2.2、Ollydbg
Ollydbg(簡稱OD)是Windows下的一款具有可視化界面的用戶態(tài)調(diào)試工具。OD具有GUI界面,非常容易上手。專用版Ollydbg,該版本具有強大的對抗反調(diào)試的功能。
(1)主界面
反匯編窗口:載入程序后,窗口內(nèi)顯示的是程序反匯編后的源代碼。
信息窗口:進行動態(tài)調(diào)試時,窗口內(nèi)會顯示出當前代碼行的各個寄存器的信息,或者API函數(shù)的調(diào)用、跳轉(zhuǎn)等信息,可以用來輔助了解當前代碼行的寄存器的運行情況。
數(shù)據(jù)窗口:默認以十六進制的方式顯示內(nèi)存中的數(shù)據(jù)。
寄存器窗口:動態(tài)顯示CPU各個寄存器的內(nèi)容,包括數(shù)據(jù)寄存器、指針及變址寄存器、段寄存器,以及控制寄存器中的程序狀態(tài)字寄存器。
堆棧窗口:顯示堆棧的內(nèi)容。調(diào)用API函數(shù)或子程序時,通過查看堆??梢灾纻鬟f的參數(shù)等信息。
命令行:在原本的OD中是沒有命令行的,這個是一個外置的插件,可以方便地在動態(tài)調(diào)試時輸入命令。一般來說,主要是輸入下斷點或者清除斷點的命令?!懊钚忻?txt”文件中有詳細的命令及
功能介紹,大家可以查看。
(2)斷點操作
動態(tài)調(diào)試時要使程序在關(guān)鍵代碼處中斷,然后根據(jù)顯示的動態(tài)信息進行動態(tài)分析,這就需要對程序下斷點。斷點有一般斷點、內(nèi)存斷點、硬件斷點等類型,一般斷點是最常使用的斷點方式。
1)一般斷點
一般斷點就是將輸入的斷點地址處的第一個字節(jié)用INT3指令來代替。當程序運行到斷點地址時,就會執(zhí)行INT3指令,Ollydbg就會捕捉到這個指令而中斷下來。下斷點一般有如下兩種方式:
F2鍵:在反匯編窗口中的代碼行上面按F2鍵就可以下斷點。下
斷點后,虛擬地址處將呈紅色狀態(tài)。如果想取消斷點,再按一下F2鍵
即可。命令行方式:可以在命令行中使用bp命令下斷點。如bp 4516B8
或者bp MessageBoxA。2)內(nèi)存斷點
內(nèi)存斷點分為兩種:內(nèi)存訪問斷點和內(nèi)存寫入斷點。OD每一時刻只允許有一個內(nèi)存斷點。
內(nèi)存訪問斷點:在程序運行時調(diào)用被選擇的內(nèi)存數(shù)據(jù)就會被OD中斷。根據(jù)這個特點,在破解跟蹤時只要在關(guān)鍵數(shù)據(jù)內(nèi)存中下斷點,就可以知道程序在什么地方和什么時候用到了跟蹤的數(shù)據(jù)。該功能對于一些復(fù)雜算法的跟蹤有很大的幫助。從破解上講,一個注冊碼的生成一定是由一些關(guān)鍵數(shù)據(jù)或者原始數(shù)據(jù)計算而來的,所以在內(nèi)存中一定會用到這些關(guān)鍵數(shù)據(jù),那么內(nèi)存訪問斷點就是比較好的中斷方法。
內(nèi)存寫入斷點:在程序運行時向被選擇的內(nèi)存地址寫入數(shù)據(jù)就會被OD中斷。根據(jù)這個特點,在破解時可以跟蹤一個關(guān)鍵數(shù)據(jù)是什么時候生成的,生成的代碼段在什么地方。所以,如果不知道一個關(guān)鍵數(shù)據(jù)的由來,就可以用內(nèi)存寫入斷點的方式查看計算的核心。
如果想要設(shè)置內(nèi)存斷點,則可以在數(shù)據(jù)窗口中的十六進制欄內(nèi)選擇一部分內(nèi)存數(shù)據(jù),然后單擊鼠標右鍵出現(xiàn)功能菜單,選擇“斷點”,然后從中選擇內(nèi)存訪問斷點或者內(nèi)存寫入斷點。
3)硬件斷點
硬件斷點并不會將程序代碼改為INT3指令,如果有些程序有自校驗功能,就可以使用硬件斷點了。下中斷的方法和下內(nèi)存斷點的方法相同,共有三種方式:硬件訪問、硬件寫入、硬件執(zhí)行。最多一共可以設(shè)置4個硬件斷點。
(3)代碼跟蹤操作
代碼跟蹤操作主要包括一些常見的快捷鍵,用于對程序進行動態(tài)跟蹤。
F9鍵:載入程序后,按F9鍵就可以運行程序了。
F7鍵:單步跟蹤(步入),即一條代碼一條代碼地執(zhí)行,遇到Call語句時會跟入執(zhí)行該語句調(diào)用地址處的代碼或者調(diào)用的函數(shù)代碼。
F8鍵:單步跟蹤(步過),遇到Call語句時不會跟入。
F4鍵:執(zhí)行到所選代碼。
ALT+F9鍵:執(zhí)行到程序領(lǐng)空,如果進入到引用的DLL模塊領(lǐng)空,則可以用此快捷鍵快速回到程序領(lǐng)空。
2.3、gdb
(1)簡介:
gdb是一個由GNU開源組織發(fā)布的、UNIX/Linux操作系統(tǒng)下的、基于命令行的、功能強大的程序調(diào)試工具。
(2)安裝
在大多數(shù)Linux發(fā)行版中,gdb都是默認安裝的,如果沒有,那么在Ubuntu下可以通過apt-get進行安裝
安裝命令為:sudo apt-get install gdb
如果需要調(diào)試其他架構(gòu)的elf程序,則可以安裝gdb-multiarch
安裝命令為:sudo apt-get install gdb-multiarch
此外,gdb也有很多插件,如peda、gef、pwndbg等,這里的插件提供了一些額外的命令,便于對程序進行逆向分析。這些插件都可以在Github上找到,根據(jù)其安裝說明進行安裝即可。圖9-9為gdb安裝了peda插件之后運行的界面,可以通過peda help命令查看新增的命令。
(3)基本的調(diào)試操作
1)啟動和結(jié)束gdb
2)通用命令
3)斷點
4)運行調(diào)試目標
5)查看和修改程序狀態(tài)
6)其他命令
三、Trace類工具
3.1、簡介:
通過一定的方式監(jiān)控并記錄程序的運行,然后使分析者在記錄的信息中得到程序的一些動態(tài)信息
eg:strace工具是Linux下的一個用來跟蹤系統(tǒng)調(diào)用的工具。一個更為強大的Trace類工具:Qira。
3.2、Qira
官方主頁為http://qira.me/,由著名的黑客geohot開發(fā)。安裝完成之后,運行命令qira-s/bin/ls,這樣相當于在4000端口開啟服務(wù)/bin/ls,使用nc localhost 4000即可連接上去。同時,還會開啟3002的Web端口,如圖9-10所示。
瀏覽器Web界面主要包括:
1)最左邊兩列為fork,每次用nc連一次4000端口,就會多一個fork。圖9-10中的兩列表示鏈接過兩次4000端口。
2)右邊的最上面有4個框,分別對應(yīng)如下信息。
113表示程序運行的第113條指令。
0表示第0個fork。
0x80484c7表示指令的地址。
0xf6fff01c表示數(shù)據(jù)的地址。文章來源:http://www.zghlxwxcb.cn/news/detail-441005.html
3)右邊的下面是程序運行的指令、寄存器、內(nèi)存、調(diào)用的系統(tǒng)調(diào)
用等。文章來源地址http://www.zghlxwxcb.cn/news/detail-441005.html
到了這里,關(guān)于【軟件逆向-分析工具】反匯編和反編譯工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!