0x0 環境
- x64dbg
- 看雪找的一個serial.exe
- Windows 10
0x1 主要內容
本文通過分析一個非明碼比較的序列號保護程序,展示x64dbg的常見用法以及逆向的基本思路,在實戰中講解x64dbg的一些用法:
- 字符串搜索
- 反匯編界面基本操作
- 軟件斷點
- 函數斷點
- 常見窗口介紹
0x2 分析
-
分析程序功能
這程序就長這樣:
在help里面可以找到一個注冊功能,注冊界面如下:
輸入正確的用戶名和密碼即可注冊成功,當然,如果輸入錯誤,會彈出一個messagebox顯示錯誤信息
-
查殼
可以看出,目標程序是使用匯編寫的,貌似沒殼。
-
分析目標程序
將目標程序用x64dbg(實際上是x32dbg)打開,看看x64dbg的界面,這里常用的窗口都使用紅字標注出來了
字符串搜索功能,我們可以通過x64dbg的字符串搜索功能來查看內存中加載的字符串,具體操作步驟為:CPU(反匯編)窗口->鼠標右鍵->搜索->選擇模塊(根據個人需求選擇,一般選擇當前模塊,前提是得先執行到主模塊)->字符串
我們單步到主模塊(單步調試快捷鍵和od一樣,F7單步步入,F8單步步過),字符串搜索得到如下結果,可以看到很明顯的字符串:
雙擊該字符串即可跳到反匯編窗口中相應位置。
下軟件斷點,運行程序,觀察是何處調用了該代碼(鼠標點擊相應行,按下F2即可快速使用軟件斷點),下軟件斷點后,地址處會變為紅色,斷點窗口能看到相應信息。
讓程序運行起來(快捷鍵F9),輸入注冊信息,點擊確認,等待命中軟件斷點
可以看到,程序的EIP指向了我們的軟件斷點,此時信息框信息為失敗。
單步步過,一直走到返回ret,即可查看上層代碼
可以看到,源程序是使用了2個處理函數,分別對用戶名和密碼進行了運算,用戶名運結果放到了eax中,密碼運算結果放在ebx中,比較二者運算結果是否相同,決定調用注冊成功函數還是注冊失敗函數。(由於此時只是介紹工具使用,故不展示算法分析部分,大致流程為eax = F1(用戶名),ebx = F2(注冊碼),cmp eax,ebx)
這時候,我們使用x64dbg的代碼修改功能,將對應的注冊失敗驗證跳過,即可完成破解:將0x401243處的je 0x40124C改為jmp 0x40124C(雙擊代碼行即可修改)
保存到文件(反匯編窗口右鍵->補丁->修補文件)
現在,驗證我們的破解成果吧
可以看到,已經破解成功了,當然,完美的破解應當是寫出注冊機,這里只是展示工具使用,主要不是展示逆向,所以暫時不寫注冊流程。
0x3 知識點總結
- 相應界面的查看:CPU(反匯編)窗口、寄存器窗口、內存窗口、棧窗口
- 常用快捷鍵:F2下軟件斷點、F7單步步入、F8單步步過、F9運行程序
- 常用功能:
- 字符串搜索:CPU(反匯編)窗口->鼠標右鍵->搜索->選擇模塊(根據個人需求選擇,一般選擇當前模塊,前提是得先執行到主模塊)->字符串
- 保存修改到文件:反匯編窗口右鍵->補丁->修補文件