Like Share Discussion Bookmark Smile

J.J. Huang   2019-07-30   x64dbg   瀏覽次數:

x64dbg - 第十章 | 反匯編練習(二) 中

前置作業

這篇延續上一篇文章,所以請先行觀看x64dbg - 第九章 | 反匯編練習(二) 上

  • 重點:00401340,假設該函數是計算序列號的地方。

任務目標

  • 找尋正確的序列號。

實際分析

  • 開啟TraceMe.exe

  • 在命令區塊輸入bp 00401340,並按Enter (狀態:已於 00401340 設置中斷點!)

  • F9執行程式

  • 輸入用戶名abcdefg和序列號12345678,並按下Check

  • 斷點在00401340 | 55 | push ebp |

  • F8一步一步過,並觀察反匯編視窗註解、資訊視窗、暫存器視窗

  • 中間指令為計算序列號,非本章重點⋯故先行步過⋯

  • 步過到下方指令時

    1
    2
    3
    0040138D | 55                       | push ebp                                    |
    0040138E | 50 | push eax | eax:"12345678"
    0040138F | FF15 04404000 | call dword ptr ds:[<&lstrcmpA>] |
  • 可以發現傳入了ebpeax,而ebp=0018F6D8 "5075"eax=0018F728 "12345678"

  • 然後調用了lstrcmpA,該函數用於比較

    註:函數:lstrcmpA

  • 在此可以大膽假設5075abcdefg的有效序列號

  • F8繼續步過,並觀察反匯編視窗註解、資訊視窗、暫存器視窗

  • 步過到下方指令時

    1
    00401395 | F7D8                     | neg eax                                     |
  • 觀察eax=FFFFFFFF表示為-1,比較結果為不相同 (參考lstrcmpA)

  • F9讓程式執行完畢

  • 修改序列號為5075,並按下Check

  • F8一步一步過,並觀察反匯編視窗註解、資訊視窗、暫存器視窗

  • 步過到下方指令時

    1
    2
    3
    0040138D | 55                       | push ebp                                    |
    0040138E | 50 | push eax | eax:"5075"
    0040138F | FF15 04404000 | call dword ptr ds:[<&lstrcmpA>] |
  • 可以發現傳入了ebpeax,而ebp=0018F6D8 "5075"eax=0018F728 "5075"

  • 然後調用了lstrcmpA,該函數用於比較

  • F8繼續步過,並觀察反匯編視窗註解、資訊視窗、暫存器視窗

  • 步過到下方指令時

    1
    00401395 | F7D8                     | neg eax                                     |
  • 觀察eax=0表示為0,比較結果為相同 (參考lstrcmpA)

  • 恭喜,可以確定用戶名abcdefg的有效序列號為5075


額外補充

  • EIP暫存器
    • EIP暫存器包含下一條將要執行的指令的位址。
    • EIP只能在一個call指令後從堆疊讀出。

      註:白話文就是,把下一次要執行的指令位址,先放在這個暫存器立面。


  • EAX暫存器
    • 函數回傳的結果都存放在EAX暫存器裡。

- `test` - 屬於邏輯運算指令。 - 對兩個參數(目標,源)執行`AND`邏輯操作,並根據結果設置標誌寄存器,結果本身不會保存。 - `test eax,eax`的一個非常普遍的用法是用來測試一方暫存器是否為空。 >註:如果`eax`為零,設定`ZF`零標誌為`1`
  • cmp
    • 屬於算數運算指令。
    • 對兩個參數(目標,源)執行SUB運算操作,並根據結果設置標誌寄存器,結果本身不會保存。

  • testcmp結論
    • test邏輯與運算結果為零,就把ZF(零標誌)置1。
    • cmp算數減法運算結果為零,就把ZF(零標誌)置1。

  • eax=FFFFFFFF為什麼表示為-1
    主要是因為負數的表示是用補數 +1來做表示的。
    1
    2
    3
    4
    5
    00000001 二進制的表示:0000 0000 0000 0000 0000 0000 0000 0001
    00000001 二進制的補數:1111 1111 1111 1111 1111 1111 1111 1110
    00000001 的補數再加一:1111 1111 1111 1111 1111 1111 1111 1111

    FFFFFFFF 二進制的表示:1111 1111 1111 1111 1111 1111 1111 1111

註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏OllyDbg 使用笔记 (二)