x64dbg是一個調試器,可全功能調試 dll 和 exe 文件。

下載地址:https://github.com/x64dbg/x64dbg/releases

解壓後運行release\x96dbg.exe,根據程序的類型選擇對應的dbg。哪怕不知道該選哪個也沒關係,你可以隨便選一個,然後用它去打開你想要逆向的程序,如果不是對應的程序,會在程序的下方給出提示。

基本功能:

1、控制軟體運行

調試器的最基本功能就是將一個飛速運行的程序中斷下來,並且使其按照用戶的意願執行。調試器是靠迫使目標程序觸發一個精心構造的異常來完成這些工作的。

2、查看軟體運行中信息

查看軟體的當前信息,這些信息包含但不限於當前線程的寄存器信息,堆棧信息、內存信息、當前 EIP 附近的反彙編信息等。

3、修改軟體執行流程

修改內存信息、反彙編信息、堆棧信息、寄存器信息等等。

組成:

該調試器由三大部分組成:

  • DBG
  • GUI(這款調試器的圖形界面是基於Qt的)
  • Bridge

 簡介:

這個軟體與 OD 一樣是開源軟體,熟悉 OD 的一定會發現,這款軟體的界面與 OD 的界面極其的相似,當然也有著與 OD 相同的功能。鑒於 OD 已經好幾年沒有更新,是時候試試這款可以反彙編64位文件的軟體了(ps:軟體本身就有中文版哦)。

它有著更加清晰的顏色區分,並且背後的團隊還在不斷的更新中哦(越來越多的插件)

直接把要調試的文件拖進來!它的操作幾乎與 OD 相同,再加上中文的界面,還是十分友好的。

基本操作:

  • 下斷點

F2 或者右鍵而且在 x64dbg 里你還可以直接點左邊的小灰點

  • 搜索字元串

  • 修改完成後就保存吧

本人對反編譯以及彙編這個方面並不擅長,因此選擇把自己寫的小程序拿來分析,將彙編指令跟源代碼進行比對。以下是測試的結果。

程序的初始化會佔用大量的彙編指令,而這部分是我們平時寫程序時看不到的。

初始化完成後的啟動位置會被注釋為 EntryPoint 。

之後開始腳本正文。

前兩句是初始化數組 array[] 與計數變數 n , i 等,這裡略過。

之後會運行如下代碼:

<while(scanf("%d",&n)!=EOF)

{
      ……………………
}>

是的,這是一道 ACM 的題,因為很簡單所以拿來分析也方便一點……

對於這個結構,彙編代碼給出的解釋如下:

箭頭指向的地方就是 while() 里的判定,讓我們跟過去。

大家都看見了左邊有個指向上方的灰色箭頭,不用說也知道是指向回剛剛的判斷條件之後的內容。實際上在這裡彙編代碼的邏輯是很清晰的,一層層調用起來,一層層返回,與函數有異曲同工之妙。例如這裡會調用 scanf 函數,在你輸入了之後又會經過重重代碼,最後到達的指令就是 scanf 指令的下一條指令。

將輸入的整型數據處理完畢並進行判斷以後,寄存器回到 while 循環區,並開始執行循環內的第一條代碼。

< printf("ceshiing.....");>

x64dbg 顯示有兩條命令處理這個函數,第一個是獲取顯示內容,第二個是執行顯示,第二個還會調用大量的彙編指令,這裡不多加贅述。

接下來是兩個 for 循環與 if 判斷語句:

< for(i=0;i<n;i++){scanf("%lf",array+i);}

                 for(i=0;i<n;i++)

                 {if(array[i]>nmax)nmax=array[i];

                  if(array[i]<nmin)nmin=array[i];

                  sum+=array[i];                       

                 }>

彙編指令中將這個過程非常直觀地表示了出來。

第一個循環用於輸入每個評委給的分數。 jmp 無條件指令跳轉, jl 按找參數的正負符號跳轉, jl 的前一條 cmp 將兩個值相減,用來給 jl 是否跳轉提供依據。

第二個循環用於尋找最大值與最小值。可以從結構看出, if 語句中滿足條件的話就 不會發生跳轉。

最後執行以下代碼,完成一次大循環:

< sum-=nmax,sum-=nmin;

                 sum=sum/(n-2);

                 printf("%.2lf\n",sum);

                 //初始化數據

                 nmax=0,nmin=100,sum=0;>

是不是很熟悉?又回到了最開始判定的地方。初始化完成後,就是判定,判定是的話又會返回 while 循環區的第一條代碼……直到循環完成。再後面的彙編代碼都是一些定義了,之前有許多 call 指令的目標便在這裡被定義。包括 printf , scanf 都被封裝在下面。

那麼本次延展的主要內容就到這裡結束了。彙編指令相較高級語言來說要晦澀許多,哪怕是以底層著稱的C語言譯轉為彙編指令以後依舊會變得如此複雜。儘管這樣,彙編指令也富有邏輯性。Call指令使程序變得模塊化,使得C語言中連續的內容不會被分散。簡潔的跳轉指令構成了完善清晰的循環結構。我們可以看出,程序的代碼部分會集中在一個小區域,也就是 EntryPoint 之後的一部分內容,這位我們解析代碼提供了便利。對程序的逆向或破解有興趣的同學可以去看看網上更多的與此相關的內容哦,這篇文章僅供簡介這個程序的解析過程的入門。

最後是我們可愛的開發人員們:

mrexodia

Sigma

tr4ceflow

Dreg

Nukem

Herz3h

Torusrxxx

 

以及貢獻者們:

blaquee

wk-952

RaMMicHaeL

lovrolu

fileoffset

SmilingWolf

ApertureSecurity

mrgreywater

Dither

zerosum0x0

RadicalRaccoon

fetzerms

muratsu

ForNeVeR

wynick27

Atvaark

Avin

mrfearless

Storm Shadow

shamanas

joesavage

justanotheranonymoususer

gushromp

Forsari0