OllyDBG - 第九章 | 反匯編練習 (二) 中
這篇將延續OllyDBG - 第八章 | 反匯編練習 (二) 上繼續練習,這邊將會試著找到他所計算的序號位置。
檔案下載
相關的目的程式和使用的工具,請直接至OllyDBG - 第八章 | 反匯編練習 (二) 上,這邊下載
分析
延續上一篇的分析過程,我們有發現我們輸入的用戶名和序列號被push到某一個call裡面,以下提供代碼和我加上的註解說明
1 | 004011A3 . 8B3D A0404000 mov edi,dword ptr ds:[<&USER32.GetDlgIte>; user32.GetDlgItemTextA |
所以當斷點到004011E5 . E8 56010000 call TraceMe.00401340的時候,需要F7跟進去做分析
使用OllyDBG分析 (方法二)
- 啟動
OllyDBG - 按下快捷鍵
F3 - 選擇
TraceMe.exe - 在入口點地址後面加上註解 (良好的註解有助於分析)

- 根據分析我們需要在
004011E5的地址下斷點註:記得先移除或是停用之前設定的斷點
- 在反匯編視窗按下
Ctrl + G - 輸入
004011E5 - 然後在
004011E5 . E8 56010000 call TraceMe.00401340上面設定斷點

- 按下
F9執行程式 - 輸入用戶名
abcdefg、序列號12345678 - 按下
Check按鈕 - 會斷點在
004011E5 . E8 56010000 call TraceMe.00401340 - 按下
F7 - 會進到``
F8一步一步分析 (如果看不出所以然,重新再看多看幾遍⋯)

- 關鍵的地方
0040138F |. FF15 04404000 call dword ptr ds:[<&KERNEL32.lstrcmpA>] ; \lstrcmpA註:lstrcmpA用於比較兩個字符串
- 可以看到
push一個5075和一個12345678,前者這邊先不管怎麼來的,後者是我們輸入的序列號註:
5075是透過計算的得出來的,這在下一篇會特別講解 - 然後使用
lstrcmpA比較 - 所以我可以假設序列號為
5075
1 | 0040138D |. 55 push ebp ; /String2 = "5075" |
驗證
- 直接開始
TraceMe.exe - 輸入用戶名
abcdefg、序列號5075 - 按下
Check按鈕 - 跳出訊息視窗
恭喜你!成功!

這邊我好奇如果用戶名不一樣是否可以過呢?
- 直接開始
TraceMe.exe - 輸入用戶名
Morose、序列號5075 - 按下
Check按鈕 - 跳出訊息視窗
序列號錯誤, 再來一次!
註:所以在這邊我可以假設序列號是透過用戶名計算出來的

總結
組合語言的瞭解真的很重要,但是我這邊不建議一開始就去看組合語言,很容易就放棄了,建議先培養興趣,先找到一些成就感,然慢慢的去把不懂不了解的找到答案,就會默默地將組合語言搞懂了。
這篇只是找到斷點位置,並且跟進去分析,看到一些蛛絲馬跡,然後多做測試多猜測,就可以找到方向。
在下一篇將會試著把計算序列號過程的組合語言,透過分析了解去看序列號是如何計算出來的。
註:我這邊提供一些可以參考的文章 (以上的練習我沒事先參考)
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (二)