x64dbg - 第十章 | 反匯編練習(二) 中
前置作業
這篇延續上一篇文章,所以請先行觀看x64dbg - 第九章 | 反匯編練習(二) 上
- 重點:
00401340,假設該函數是計算序列號的地方。
任務目標
- 找尋正確的序列號。
實際分析
開啟
TraceMe.exe在命令區塊輸入
bp 00401340,並按Enter(狀態:已於 00401340 設置中斷點!)F9執行程式輸入用戶名
abcdefg和序列號12345678,並按下Check斷點在
00401340 | 55 | push ebp |F8一步一步過,並觀察反匯編視窗註解、資訊視窗、暫存器視窗中間指令為計算序列號,非本章重點⋯故先行步過⋯
步過到下方指令時
1
2
30040138D | 55 | push ebp |
0040138E | 50 | push eax | eax:"12345678"
0040138F | FF15 04404000 | call dword ptr ds:[<&lstrcmpA>] |可以發現傳入了
ebp和eax,而ebp=0018F6D8 "5075"和eax=0018F728 "12345678"然後調用了
lstrcmpA,該函數用於比較註:函數:lstrcmpA
在此可以大膽假設
5075為abcdefg的有效序列號F8繼續步過,並觀察反匯編視窗註解、資訊視窗、暫存器視窗步過到下方指令時
1
00401395 | F7D8 | neg eax |
觀察
eax=FFFFFFFF表示為-1,比較結果為不相同 (參考lstrcmpA)F9讓程式執行完畢修改序列號為
5075,並按下CheckF8一步一步過,並觀察反匯編視窗註解、資訊視窗、暫存器視窗步過到下方指令時
1
2
30040138D | 55 | push ebp |
0040138E | 50 | push eax | eax:"5075"
0040138F | FF15 04404000 | call dword ptr ds:[<&lstrcmpA>] |可以發現傳入了
ebp和eax,而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運算操作,並根據結果設置標誌寄存器,結果本身不會保存。
test和cmp結論test邏輯與運算結果為零,就把ZF(零標誌)置1。cmp算數減法運算結果為零,就把ZF(零標誌)置1。
eax=FFFFFFFF為什麼表示為-1
主要是因為負數的表示是用補數 +1來做表示的。1
2
3
4
500000001 二進制的表示: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 使用笔记 (二)
