Like Share Discussion Bookmark Smile

J.J. Huang   2023-01-05   Visual Studio Visual Studio 2022   瀏覽次數:次   DMCA.com Protection Status

Visual Studio 2022 | 偵錯工具中檢視反組解碼程式

前言

在學習逆向工程的過程中,會需要知道程式對應到編譯器所建立之指令的組譯程式碼,進而分析、修改…等等。
然而使用Visual Studio來觀看程式的反組解碼程式是件非常簡單方便的事。

直接看看在Visual Studio觀看反組解碼程式的結果畫面。

註:此處使用Visual Studio 2022為例,動態圖僅逐步執行幾個步驟,並非完整。

準備專案與偵錯程式

首先,我們使用Visual Studio 2022來開個專案或是沿用HelloWorld專案。
宣告個整數變數a = 1,然後使用printf印出這個變數的位址。

1
2
3
4
5
6
7
8
#include <iostream>

int main()
{
int a = 1;
printf("%p\n", &a);
std::cout << "Hello World!\n";
}

開啟反組譯碼視窗

注意事項:

  • 首先該視窗與其他偵錯工具視窗一樣, 反組譯碼視窗只能在偵錯會話期間使用。
  • 若要啟用反組譯碼視窗,必須在【工具(T)】→【選項(O)】開啟選項視窗,開啟「偵錯」→「一般」 中勾選[啟用位址層級偵錯]。

開始偵錯與開啟反組解碼視窗:

  • 由於此處示範的是x86的偵錯模式,所以方案平台的選項是選擇x86
  • 首先在程式的int a = 1;這行產生一個紅色圓圈的中斷點。
  • 接著我們按【本機 Windows 偵錯工具】來進行偵錯。
  • 此時進入了偵錯模式,並且程式運行到剛剛設定的中斷點;也開啟了一個主控台視窗。
  • 此時可見Visual Studio偵錯模式下一些預設的視窗被開啟,像是下方的自動變數、右方的診斷工具…等等。

    註:這些視窗是預設開啟的視窗,可以透過設定或關閉進行調整,這邊就不詳細說明。

  • 在偵錯模式下,點選【偵錯(D)】→【視窗(W)】→【反組譯碼(D)】。

    注意:必須在偵錯模式中,視窗才會有反組譯碼的選項。

  • 「反組譯碼視窗」預設放在中央與程式撰寫區塊在一起。
  • 接著可以使用「逐步執行(F11)」來進行偵錯。

    註:動態圖僅做簡單的示範。

偵錯工具無法顯示原始程式碼或反組譯碼

以下內容擷取於:Microsoft - Visual Studio 2022 偵錯工具無法顯示原始程式碼或反組譯碼
這個錯誤為:偵錯工具無法顯示目前位置的原始程式碼或反組譯碼。

此錯誤訊息的發生原因可能有幾種:

  • 所叫用的中斷點位置可能沒有原始程式碼,可能是正在偵錯不支援反組譯碼的語言。
    • 開啟「中斷點視窗」,找出中斷點並加以刪除。
  • 若正在偵錯指令碼,可能會叫用中斷點,但是程式中卻沒有任何執行緒。
    • 從【偵錯】功能表選擇「逐步執行」或「繼續」,以繼續偵錯。
  • 安全性考量可能會禁止偵錯工具從正在偵錯的程式中讀取堆疊、執行緒、暫存器和其他的內容資訊。
    • 正在偵錯Web應用程式,但沒有正確的使用權限來存取虛擬目錄時,最常發生這種情形。請將虛擬目錄的安全性設成「匿名」,然後再試一次。

結語

使用「反組譯碼視窗」,在逆向工程學習中是了解組合語言的是相當重要的,所以透過反組譯碼來看見組合語言,就可以清楚看到程式是如何在電腦內運作。


註:以上參考了
Microsoft - 在 Visual Studio 偵錯工具中檢視反組解碼程式
Microsoft - Visual Studio 2022 偵錯工具無法顯示原始程式碼或反組譯碼
iT邦幫忙 - 記憶體地址空間和第一次反組譯(小碼農米爾)
iT邦幫忙 - 惡意程式x靜態分析x修改內容(唬唬)
Heresy’s Space - 一些比較少人知道的 VisualStudio 偵錯功能
Family with 220 icons by inipagi