x64dbg 是一款開源、免費、功能強大的動態反匯編除錯器,它能夠在Windows
平臺上進行應用程式的反匯編、除錯和分析作業,與傳統的除錯器如Ollydbg
相比,x64dbg除錯器的出現填補了Ollydbg
等傳統除錯器的不足,為反匯編除錯作業提供了更高效、更可靠的解決方案,正是因為有了這些優點,才能使其成為當今最受歡迎的反匯編除錯軟體之一,
x64dbg官方地址:https://x64dbg.com/
x64dbg和Ollydbg雖都是Windows
平臺上的除錯器工具,但它們有一些不同之處:
- 支持架構:Ollydbg僅支持x86架構,而x64dbg支持x86和x64架構,因此x64dbg可以除錯64位應用程式,而Ollydbg則無法做到,
- 開源性:x64dbg是一個開源專案,而Ollydbg是閉源軟體,
- 插件生態:x64dbg的插件系統更加完善,有更多的第三方插件可供使用,而Ollydbg的插件系統相對較少,
- 用戶界面:x64dbg的界面比Ollydbg更現代化,具有更好的可定制性,可以自定義布局,顏色和字體等,
- 功能比較:x64dbg具有許多高級功能,如記憶體映射,資料跟蹤,反匯編和代碼繪圖等,而Ollydbg則相對較少,
在學習使用該工具之前第一步則是要安裝軟體,x64dbg除錯器的安裝很容易,讀者只需要前往x64dbg
的官方開源倉庫中找到下載按鈕,
以Github倉庫為例,讀者需訪問https://github.com/x64dbg/x64dbg/releases
并在其中找到所對應的snapshot_2023-03-04_02-26.zip
版本點擊下載即可;
下載好以后解壓這個壓縮包,讀者會看到兩個檔案夾,其中pluginsdk
代表的是x64dbg
的開發工具包,如果需要開發自定義插件則需要引入該工具包,而release
則是編譯版本的x64dbg
本體,打開release
檔案夾讀者會看到如下圖所示的目錄結構,其中x32/x64
分別代表的是兩種架構的除錯器,而如果用戶需要安裝除錯器到系統內只需要點擊x96dbg.exe
并依次點擊下一步即可完成除錯器的安裝;
1.1 如何啟動除錯
不同于OllyDBG除錯器,x64dbg默認就支持兩種除錯模式,通常讀者可以選擇使用打開檔案的方式除錯程式,也可以直接附加到一個已經存在的行程上除錯同時支持脫離行程,需要注意的是為了保證最佳的除錯效果,除錯器的打開請讀者使用管理員方式運行,
當用戶需要打開除錯程式時,可以通過選單"檔案"->"打開"(或者按下快捷鍵F3),會彈出如下圖所示的打開檔案對話框,默認對話框會停留在x64dbg
軟體的根目錄,此時通過選擇所需除錯的行程即可打開除錯;
第二種除錯方式則是直接附加到一個已經存在的行程上,可以通過選單"檔案"->"附加"(或者按下快捷鍵Alt+A)會彈出如下圖所示的附加對話框,讀者只需要選中一個正在運行的程式即可附加到特定行程內,當用戶除錯結束后可通過Ctrl+Alt+F2脫離行程;
1.2 熟悉x64dbg視窗
當被除錯程式與除錯器之間建立除錯關系以后,就可以開始進行動態除錯分析了,在x64dbg中有許多的視窗,例如CPU視窗,暫存器視窗,堆疊視窗,十六進制視窗等,如下圖所示則是x64dbg運行后的主界面;
這里增加一個知識點,關于動態反匯編除錯與靜態反匯編除錯的區別:
-
動態反匯編除錯(Dynamic Disassembly Debugging)是指在程式運行時動態地反匯編機器碼,從而獲取指令級別的執行資訊和記憶體訪問情況,以輔助除錯和分析程式,動態反匯編除錯需要借助特殊的除錯工具,如GDB、x64dbg、Ollydbg等,通常用于除錯崩潰、死鎖、記憶體泄漏等問題,
-
靜態反匯編除錯(Static Disassembly Debugging)是指對程式進行反匯編分析,不需要運行程式,只需要對程式進行靜態分析就可以獲得指令級別的執行資訊和記憶體訪問情況,以輔助除錯和分析程式,靜態反匯編除錯需要使用特殊的工具,如IDA Pro、Binary Ninja等,通常用于逆向工程、惡意代碼分析、漏洞挖掘等方面,
如上圖所示,當除錯器運行后最大的視窗則是CPU表單,CPU表單是x64dbg的默認主視窗,用戶所有的除錯作業都在CPU表單中完成,因為CPU表單就是用于反應當前CPU以及暫存器執行狀態的,CPU表單其內部包含了五個子視窗,分別是反匯編視窗,暫存器視窗,堆疊地址視窗,十六進制資料視窗,以及堆疊引數決議視窗,
(1)反匯編視窗
反匯編視窗是x64dbg
的一個主要功能之一,它可以顯示被除錯程式的匯編指令,并允許用戶查看和修改這些指令(需要注意的是當一個行程被加載默認EIP會停在系統模塊中),其主要的作用包括;
- 顯示程式的匯編指令:反匯編視窗可以將二進制檔案轉換為匯編代碼,并顯示在視窗中,這使得程式員可以深入了解程式的內部作業原理,并且可以查找程式中的漏洞和安全問題,
- 允許用戶修改指令:反匯編視窗不僅可以顯示程式的匯編指令,還可以允許用戶直接在視窗中修改指令,這對于除錯和修復程式中的錯誤非常有用,但需要小心操作,以避免引入新的錯誤,
- 跟蹤代碼執行:反匯編視窗還可以跟蹤被除錯程式的代碼執行程序,以便程式員可以了解程式在運行時的行為和狀態,這對于除錯和優化程式非常有用,
- 顯示程式的符號表:反匯編視窗可以顯示程式的符號表,這對于程式員來說非常重要,因為它可以幫助他們更好地理解程式中的變數、函式和其他識別符號,
(2)暫存器視窗
暫存器視窗則是在除錯器最右側的頂端,該視窗用于顯示和解釋當前執行緒環境下CPU暫存器的各種狀態值和內容,并且讀者可以通過雙擊這些暫存器組來對其進行動態的調整引數;
暫存器 | 描述 |
---|---|
EAX | 通用暫存器,用于存放函式回傳值、算術運算結果等, |
EBX | 通用暫存器,用于存放記憶體地址或其他通用資料, |
ECX | 通用暫存器,用于存放函式引數, |
EDX | 通用暫存器,用于存放記憶體地址或其他通用資料, |
ESI | 通用暫存器,用于存放源資料的地址,例如字串拷貝等操作, |
EDI | 通用暫存器,用于存放目標資料的地址,例如字串拷貝等操作, |
EBP | 基址指標,用于存放當前堆疊幀的基址, |
ESP | 堆疊指標,用于存放當前堆疊頂部的地址, |
EIP | 指令指標,用于存放當前正在執行的指令的地址, |
EFLAGS | 標志暫存器,用于存放CPU的狀態標志,例如進位標志、零標志、符號標志等, |
其中標志暫存器(Flag Register)是一個16位的暫存器,用于存盤CPU運算的狀態標志,例如進位標志、零標志、符號標志等,下面列出了x86架構CPU中的標志暫存器以及它們的含義:
標志位 | 中文名稱 | 描述 |
---|---|---|
CF | 進位標志 | 當無符號整數加法或減法的結果超出了暫存器的寬度時,該標志位會被設定為1,CF=1表示有進位發生,CF=0表示無進位發生, |
PF | 奇偶標志 | 當一個操作的結果中有偶數個二進制位為1時,該標志位會被設定為1,PF=1表示結果中有偶數個1,PF=0表示結果中有奇數個1, |
AF | 調整標志 | 當一個二進制算術操作(例如加法或減法)中低4位產生了進位或借位時,該標志位會被設定為1,AF=1表示有進位或借位發生,AF=0表示無進位或借位發生, |
ZF | 零標志 | 當一個操作的結果為零時,該標志位會被設定為1,ZF=1表示結果為零,ZF=0表示結果不為零, |
SF | 符號標志 | 當一個操作的結果為負數時,該標志位會被設定為1,SF=1表示結果為負數,SF=0表示結果為非負數, |
TF | 陷阱標志 | 該標志位用于單步除錯,當TF=1時,CPU會在每個指令執行后暫停并等待除錯器的命令, |
IF | 中斷標志 | 該標志位用于控制CPU是否回應中斷請求,當IF=1時,CPU允許中斷請求;當IF=0時,CPU禁止中斷請求, |
DF | 方向標志 | 該標志位用于控制字串操作的方向,當DF=1時,字串操作是從高地址向低地址進行的;當DF=0時,字串操作是從低地址向高地址進行的, |
OF | 溢位標志 | 當有符號整數加法或減法的結果超出了暫存器的寬度時,該標志位會被設定為1,OF=1表示有溢位發生,OF=0表示無溢位發生, |
(3)堆疊視窗
堆疊視窗用于顯示當前執行緒的堆疊,堆疊是一種后進先出(Last-In-First-Out,LIFO)的資料結構,堆疊視窗會隨著ESP(Extended Stack Pointer)暫存器的變化而變化,ESP指向當前堆疊頂元素的地址,堆疊視窗可以顯示堆疊幀、函式呼叫和區域變數等資訊,這對于除錯和優化程式非常有用,此外,堆疊視窗還可以允許用戶修改堆疊上的資料,這對于除錯和修復程式中的錯誤非常有用,但需要小心操作,以避免引入新的錯誤,
堆疊視窗有兩個重要的作用,一個是用于呼叫函式時的引數傳遞,另一個作用是函式內部的變數區域空間,函式內定義的變數和臨時變數都存盤在堆疊中,當函式回傳時,這些變數會自動銷毀,堆疊視窗可以幫助程式員查看函式內部變數的值和狀態,從而更好地理解程式的行為和除錯錯誤,
(4)十六進制視窗
在x64dbg最左側底部則是十六進制視窗,該視窗的主要作用適用于瀏覽記憶體,或在特定區域讀入或寫出資料時使用,在某些時候還可以用來在特定記憶體區域下斷點,以下是一些關于它的主要作用:
- 瀏覽記憶體 - 十六進制視窗可以讓您直接查看記憶體中的資料,您可以使用箭頭鍵或滑鼠滾輪向上或向下滾動,以瀏覽更多記憶體,這對于分析程式的記憶體布局和查找特定資料非常有用,
- 讀入或寫出資料 - 可以在十六進制視窗中選擇特定的記憶體區域,并使用右鍵選單中的“復制”和“粘貼”選項來讀入或寫出資料,這對于修改程式的記憶體狀態或在除錯程序中注入資料非常有用,
- 設定斷點 - 可以在特定的記憶體地址上設定斷點,以便在程式執行到該地址時中斷,要設定斷點,請在十六進制視窗中右鍵單擊該地址,并選擇“設定斷點”,
除了以上這些功能外,十六進制視窗還可以顯示與特定記憶體地址相關的匯編代碼,并提供許多其他的操作選項,例如搜索記憶體、轉換資料格式等等,
(5)掌握常用快捷鍵
熟練掌握x64dbg的快捷鍵可以使除錯和分析作業更加高效和快速,x64dbg提供了豐富的快捷鍵選項,讓用戶在操作時可以盡可能地減少滑鼠操作,更專注于代碼和除錯資料的分析,通過掌握快捷鍵,可以更快速地執行除錯命令、添加或洗掉斷點、修改暫存器、查找記憶體等操作,從而提高除錯和分析的效率,因此,熟練使用x64dbg的快捷鍵是成為一名高效的除錯和分析人員的必備技能之一,以下是x64dbg所支持的快捷鍵分類,讀者可更具自己的實際情況學習掌握;
除錯控制
- F2:開始/停止除錯
- F3:單步執行
- F7:進入函式呼叫
- F8:跳過函式呼叫
- F9:繼續執行
- F12:暫停/繼續執行
斷點
- F5:添加/洗掉斷點
- Ctrl + F5:添加/洗掉硬體斷點
- F6:添加/洗掉條件斷點
- F9:啟用/禁用斷點
- Ctrl + F9:啟用/禁用所有斷點
暫存器
- Ctrl + R:打開/關閉暫存器視窗
- Ctrl + G:跳轉到指定地址
- F2/F4/F6:在暫存器視窗中修改暫存器的值
記憶體
- Ctrl + M:打開/關閉記憶體視窗
- Ctrl + E:打開/關閉運算式視窗
- Ctrl + F:查找指定位元組序列
- Ctrl + Shift + F:查找指定指令序列
- Ctrl + D:將記憶體中的資料以十六進制形式匯出到檔案中
動態分析
- Ctrl + A:打開/關倍訓編視窗
- Ctrl + B:打開/關閉堆疊視窗
- Ctrl + C:打開/關閉CPU視窗
- Ctrl + L:打開/關閉日志視窗
其他
- Ctrl + F2:打開/關閉工具列
- Ctrl + F10:打開/關閉選單欄
- Ctrl + Q:退出x64dbg
注意:以上快捷鍵是x64dbg的默認設定,您也可以通過"選項"選單中的"快捷鍵"選項來自定義快捷鍵,
1.3 熟悉x64dbg斷點
斷點機制是除錯器的重要功能,x64dbg為除錯著提供了多種除錯斷點,通常包括了軟體斷點,硬體斷點,記憶體斷點,一次性斷點,條件斷點,訊息斷點等,熟練使用斷點是除錯程式的基本技能,斷點通常可被總結為如下;
(1)軟體斷點
在程式執行到特定指令時暫停程式執行,這種斷點型別是由除錯器模擬實作的,通常通過修改程式指令來實作,它是最常見的斷點型別,因為可以在任何代碼段中設定斷點,
在x64dbg中,除錯這可以通過F2
快捷鍵在所需下斷點的位置下斷,當該位置被下斷點后,則除錯器會以紅色標注,而當前EIP指標則會使灰色顯示,如下圖所示;
此外軟體斷點同樣可以使用bp/bpx
等命令下斷,或通過bc
來取消斷點,當讀者需要在特定函式上下斷點時,可通過Ctrl+G
調出地址跳轉表達視窗,并輸入如MessageBoxA
等函式,跳轉后手動下斷點,
亦可在命令視窗輸入bp MessageBoxA
自動下斷點,斷點可在斷點
選項卡中看到該斷點的詳細引數;
(2)硬體斷點
與軟體斷點不同,硬體斷點是通過修改特定的處理器暫存器來實作的,這些暫存器用于跟蹤指令地址和資料訪問地址,硬體斷點通常比軟體斷點更快,但是受到硬體限制,可以在某些情況下設定的數量有限,
在x64dbg中,硬體斷點可以分為三種型別:硬體執行斷點、硬體讀取斷點和硬體寫入斷點,以下是每種型別的解釋:
-
硬體執行斷點 - 當程式執行到指定地址時,觸發硬體執行斷點,這種斷點型別適用于在特定指令處除錯程式,例如函式呼叫或跳轉指令,在x64dbg中,硬體執行斷點可以通過在指令前面的地址上設定“e”來實作,
-
硬體讀取斷點 - 當程式嘗試從指定記憶體地址讀取資料時,觸發硬體讀取斷點,這種斷點型別適用于在特定記憶體位置上除錯程式,例如檢測某個變數的值何時被更改,在x64dbg中,硬體讀取斷點可以通過在指定記憶體地址上設定“r”來實作,
-
硬體寫入斷點 - 當程式嘗試向指定記憶體地址寫入資料時,觸發硬體寫入斷點,這種斷點型別適用于在特定記憶體位置上除錯程式,例如檢測某個變數的值何時被更改,在x64dbg中,硬體寫入斷點可以通過在指定記憶體地址上設定“w”來實作,
(3)記憶體斷點
當程式在特定記憶體地址處讀取、寫入或執行時,暫停程式執行,這種斷點型別通常用于檢測記憶體訪問錯誤或跟蹤特定變數的更改,而一次性斷點則是在程式執行到特定指令時只觸發一次,這種斷點型別通常用于除錯復雜代碼中的問題,而不是在每次執行到指令時都觸發斷點,
在x64dbg中,記憶體斷點可以根據不同的操作型別進行分類,記憶體斷點被分為記憶體訪問,記憶體執行,記憶體寫入,記憶體讀取等,他們之間的應用各不相同;
- 記憶體訪問斷點(Access breakpoint):當程式試圖訪問特定記憶體地址時觸發,可以用于檢測對敏感資料的未授權訪問,例如密碼、私鑰等,
- 記憶體執行斷點(Execute breakpoint):當程式試圖執行特定記憶體地址處的指令時觸發,可以用于檢測惡意代碼注入、代碼劫持等攻擊,
- 記憶體寫入斷點(Write breakpoint):當程式試圖寫入特定記憶體地址時觸發,可以用于檢測對敏感資料的修改、防止非法更改程式代碼等,
- 記憶體讀取斷點(Read breakpoint):當程式試圖從特定記憶體地址讀取資料時觸發,可以用于檢測對敏感資料的竊取、防止非法讀取程式代碼等,
(4)訊息斷點
x64dbg訊息斷點(Message Breakpoint)是一種特殊型別的斷點,可以用于監視程式執行期間的Windows訊息,包括鍵盤輸入、滑鼠操作、視窗訊息等,當程式接收到指定型別的訊息時,訊息斷點會觸發,程式執行會暫停,以便進行除錯,
訊息斷點在除錯GUI程式時非常有用,可以幫助除錯視窗訊息的處理代碼,定位程式中的錯誤或例外行為,例如,當你想要除錯一個視窗訊息處理函式時,可以在該函式上設定訊息斷點,當程式接收到對應的訊息時,程式會暫停在該函式內部,方便進行除錯,
1.4 熟悉x64dbg代碼跟蹤
(1)反匯編除錯命令
在前面的章節中筆者介紹了x64dbg的視窗以及斷點的基本設定方法,接下來將介紹x64dbg中的代碼跟蹤,代碼跟蹤是任何一個除錯器的核心功能,一般而言跟蹤功能都會包括,單步步過(快捷鍵F8),單步步進(快捷鍵F7),運行到回傳(快捷鍵Ctrl+F9),以及運行到用戶代碼(Alt+F9快捷鍵)等常用功能,
在x64dbg中進行代碼跟蹤可以幫助我們分析程式的執行程序和除錯代碼,以便更好地理解程式的運行機制,下面是一些常用的代碼跟蹤功能,及對該功能的決議:
- 單步步過(快捷鍵F8):該功能用于逐行執行程式,當執行到函式呼叫時,會直接跳到函式內部執行,而不會逐行執行函式內部的代碼,
- 單步步進(快捷鍵F7):該功能用于逐行執行程式,當執行到函式呼叫時,會進入函式內部逐行執行代碼,直到執行完畢并回傳到函式呼叫處,
- 運行到回傳(快捷鍵Ctrl+F9):該功能用于直接運行程式,直到執行到當前函式的回傳陳述句處停止,并回傳到函式呼叫處,
- 運行到用戶代碼(快捷鍵Alt+F9):該功能用于直接運行程式,直到執行到用戶指定的代碼位置停止,可以通過設定斷點來指定代碼位置,
在進行代碼跟蹤時,我們可以在代碼視窗中看到當前執行的行和執行指標所指向的記憶體地址,也可以在暫存器視窗中查看各個暫存器的值,以便更好地理解程式的執行程序,
(2)反匯編檢索命令
在x64dbg中,讀者可通過Ctrl+F
快捷鍵命令調出命令搜索視窗,并輸入一條反匯編指令集,即可實作檢索模塊內具備的命令位置,當用戶勾選整塊搜索時,x64dbg會搜尋整個行程內所有匹配的命令,比較遺憾的是x64dbg目前還不支持搜尋多條指令集;
雖然無法搜索連續的匯編指令集,但卻可是搜尋二進制字串,通過快捷鍵Ctrl+B
讀者可打開二進制搜索框,我們以如下這條命令為例;
打開二進制搜索框,輸入8B FF 55 8B EC
即可用于檢索上方的指令片段,也算是一種折中的方法;
同時x64dbg還支持搜索字串,通過右鍵選單即可調出搜索框,并實作特殊字串的檢索;
原文鏈接
https://www.lyshark.com/post/6b00105a.html
文章作者:lyshark (王瑞)文章出處:https://www.cnblogs.com/LyShark/p/17531170.html
本博客所有文章除特別宣告外,均采用 BY-NC-SA 許可協議,轉載請注明出處!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/556678.html
標籤:訊息安全
上一篇:提升網站速度與用戶體驗!了解Whirl動態加載庫的最新技術
下一篇:返回列表