Like Share Discussion Bookmark Smile

J.J. Huang   2019-07-13   OllyDBG   瀏覽次數:

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 使用笔记 (二)