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
,並按下Check
F8
一步一步過,並觀察反匯編視窗註解、資訊視窗、暫存器視窗步過到下方指令時
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 使用笔记 (二)