OllyDBG - 第九章 | 反匯編練習 (二) 中
這篇將延續OllyDBG - 第八章 | 反匯編練習 (二) 上繼續練習,這邊將會試著找到他所計算的序號位置。
檔案下載
相關的目的程式和使用的工具,請直接至OllyDBG - 第八章 | 反匯編練習 (二) 上,這邊下載
分析
延續上一篇的分析過程,我們有發現我們輸入的用戶名和序列號被push
到某一個call裡面,以下提供代碼和我加上的註解說明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| 004011A3 . 8B3D A0404000 mov edi,dword ptr ds:[<&USER32.GetDlgIte>; user32.GetDlgItemTextA 004011A9 . 53 push ebx 004011AA . 8D4424 4C lea eax,dword ptr ss:[esp+0x4C] 004011AE . 6A 51 push 0x51 ; /Count = 51 (81.) 004011B0 . 50 push eax ; |Buffer = 00000061 004011B1 . 6A 6E push 0x6E ; |ControlID = 6E (110.) 004011B3 . 56 push esi ; |hWnd = 00250276 ('TraceMe 动态分析技术',class='#32770',wndproc=76E5AF83) 004011B4 . FFD7 call edi ; \GetDlgItemTextA 004011B6 . 8D8C24 9C0000>lea ecx,dword ptr ss:[esp+0x9C] 004011BD . 6A 65 push 0x65 ; /Count = 65 (101.) 004011BF . 51 push ecx ; |Buffer = user32.76E5008E 004011C0 . 68 E8030000 push 0x3E8 ; |ControlID = 3E8 (1000.) 004011C5 . 56 push esi ; |hWnd = 00250276 ('TraceMe 动态分析技术',class='#32770',wndproc=76E5AF83) 004011C6 . 8BD8 mov ebx,eax ; | 004011C8 . FFD7 call edi ; \GetDlgItemTextA 004011CA . 8A4424 4C mov al,byte ptr ss:[esp+0x4C] 004011CE . 84C0 test al,al 004011D0 . 74 76 je short TraceMe.00401248 004011D2 . 83FB 05 cmp ebx,0x5 004011D5 . 7C 71 jl short TraceMe.00401248 004011D7 . 8D5424 4C lea edx,dword ptr ss:[esp+0x4C] 004011DB . 53 push ebx ; 輸入的用戶名長度 004011DC . 8D8424 A00000>lea eax,dword ptr ss:[esp+0xA0] 004011E3 . 52 push edx ; 用戶名 004011E4 . 50 push eax ; 序列號 004011E5 . E8 56010000 call TraceMe.00401340 ; 關鍵,計算序號的地方 004011EA . 8B3D BC404000 mov edi,dword ptr ds:[<&USER32.GetDlgIte>; user32.GetDlgItem 004011F0 . 83C4 0C add esp,0xC 004011F3 85C0 test eax,eax 004011F5 . 74 37 je short TraceMe.0040122E
|
所以當斷點到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 2 3
| 0040138D |. 55 push ebp ; /String2 = "5075" 0040138E |. 50 push eax ; |String1 = "12345678" 0040138F |. FF15 04404000 call dword ptr ds:[<&KERNEL32.lstrcmpA>] ; \lstrcmpA
|
驗證
- 直接開始
TraceMe.exe
- 輸入用戶名
abcdefg
、序列號5075
- 按下
Check
按鈕
- 跳出訊息視窗
恭喜你!成功!
這邊我好奇如果用戶名不一樣是否可以過呢?
- 直接開始
TraceMe.exe
- 輸入用戶名
Morose
、序列號5075
- 按下
Check
按鈕
- 跳出訊息視窗
序列號錯誤, 再來一次!
註:所以在這邊我可以假設序列號是透過用戶名計算出來的
總結
組合語言的瞭解真的很重要,但是我這邊不建議一開始就去看組合語言,很容易就放棄了,建議先培養興趣,先找到一些成就感,然慢慢的去把不懂不了解的找到答案,就會默默地將組合語言搞懂了。
這篇只是找到斷點位置,並且跟進去分析,看到一些蛛絲馬跡,然後多做測試多猜測,就可以找到方向。
在下一篇將會試著把計算序列號過程的組合語言,透過分析了解去看序列號是如何計算出來的。
註:我這邊提供一些可以參考的文章 (以上的練習我沒事先參考)
CSDN billvsme的专栏 的 OllyDbg 使用笔记 (二)