Like Share Discussion Bookmark Smile

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

OllyDBG - 第十一章 | 反匯編練習 (三) 上

在上一篇的反匯編中獲得了很大的進展,也很明確知道自己在技術上缺少了什麼,主要就是組合語言和80x86的相關知識;在這塊的部分,我會在反匯編的過程中,不斷的去補充這方面的知識,希望透過不斷的練習時做,慢慢熟悉,而不是透過死背的方式去做學習!

檔案下載

目的程式:
reverseMe.7z

解壓縮密碼:

1
morosedog

使用PEid檢驗

檢驗顯示是使用MASM32 / TASM32 [Overlay]編寫。

開啟reverseMe.exe使用並分析

  • 開啟 reverseMe.exe
  • 直接跳出訊息視窗標題為Key File ReverseMe內容為Evaluation period out of date. Purchase new license

目標說明

讓程式使其驗證通過。

思路 (本人弱弱的,勿噴)

首先跳出一些訊息,所以應該可以利用OllyDBG - 第二章 | 字串參考的方式來找到關鍵字斷點,接續進行分析找到驗證的地方

使用OllyDBG分析

  • 啟動OllyDBG
  • 按下快捷鍵F3
  • 選擇reverseMe.exe
  • 在入口點地址後面加上註解 (良好的註解有助於分析)

  • 於反匯編視窗按下右鍵
  • 選擇尋找 ->所有參考文字字串

  • 會開啟一個文字字串參考位於 reveerseM:CODE的視窗
  • 找到Evaluation period out of date. Purchase new license下斷點

  • F9執行程式
  • 斷點到00401084 . 68 17204000 push 00402017 ; ||Text = "Evaluation period out of date. Purchase new license"
  • 繼續F8
  • 到達0040108B . E8 D7020000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA
  • 就會跳出訊息視窗

  • 開始分析這段代碼,可以發現他在執行call <jmp.&USER32.MessageBoxA>之前push了四個參數

    註:MessageBox函數

  • 所以我們可以研判不能進入到這
  • 於是往上看什麼地方可以跳過這段的判斷
  • 發現0040107B . /75 1D jnz short 0040109A ; |這段可以跳過
  • 針對這段上方的00401078 . 83F8 FF cmp eax,-1 ; |的指令做分析

  • Ctrl + F2重新開始
  • 直接F8慢慢執行追蹤
  • 會發現主要跳轉判斷前面是在call <jmp.&KERNEL32.CreateFileA>然後push了七個參數,可以看到OPEN_EXISTING表示僅在文件或設備存在時打開它

    註:CreateFileA函數

  • 繼續運行執行到00401078 . 83F8 FF cmp eax,-1 ; |
  • 會發現 eax = FFFFFFFF 與 -1 做比較
  • 根據cmp結果jnz 若不等於0則跳越 ZF=0 (這段的比較結果,放在額外補充那邊說明)
  • 所以我們可以假設他要去打開一個Keyfile.dat的檔案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
0040105C   .  6A 00         push 0                                   ; |/hTemplateFile = NULL
0040105E . 68 6F214000 push 0040216F ; ||Attributes = READONLY|HIDDEN|SYSTEM|ARCHIVE|TEMPORARY|402048
00401063 . 6A 03 push 3 ; ||Mode = OPEN_EXISTING
00401065 . 6A 00 push 0 ; ||pSecurity = NULL
00401067 . 6A 03 push 3 ; ||ShareMode = FILE_SHARE_READ|FILE_SHARE_WRITE
00401069 . 68 000000C0 push C0000000 ; ||Access = GENERIC_READ|GENERIC_WRITE
0040106E . 68 79204000 push 00402079 ; ||FileName = "Keyfile.dat"
00401073 . E8 0B020000 call <jmp.&KERNEL32.CreateFileA> ; |\CreateFileA
00401078 . 83F8 FF cmp eax,-1 ; |
0040107B . 75 1D jnz short 0040109A ; |
0040107D . |6A 00 push 0 ; |/Style = MB_OK|MB_APPLMODAL
0040107F . |68 00204000 push 00402000 ; ||Title = " Key File ReverseMe"
00401084 . |68 17204000 push 00402017 ; ||Text = "Evaluation period out of date. Purchase new license"
00401089 . |6A 00 push 0 ; ||hOwner = NULL
0040108B . |E8 D7020000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA
00401090 . |E8 24020000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess
00401095 . |E9 83010000 jmp 0040121D
0040109A > \6A 00 push 0 ; /pOverlapped = NULL
  • 在相同目錄下建立一個Keyfile.dat檔案
  • Ctrl + F2重新開始
  • 直接F8慢慢執行追蹤
  • 繼續運行執行到00401078 . 83F8 FF cmp eax,-1 ; |
  • 會發現 eax = 00000088 與 -1 做比較
  • 根據cmp結果jnz 若不等於0則跳越 ZF=0 (這段的比較結果,放在額外補充那邊說明)
  • 實現跳轉到0040109A > \6A 00 push 0 ; /pOverlapped = NULL

  • 繼續F8
  • 004010BF . /7C 36 jl short 004010F7會跳轉
  • 繼續F8
  • 到達00401105 . E8 5D020000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA
  • 跳出訊息視窗標題為Key File ReverseMe內容為Keyfile is no valid. Sorry.

  • 根據上面的分析,凡是跳轉到004010F7的就是失敗
  • 直接看指令,看有沒有跳轉到不一樣的地方
  • 發現004010D8 . /E9 28010000 jmp 00401205
  • 跳轉的地方是成功的訊息視窗

  • 既然找到跳出成功訊息視窗的位置,那我們直接暴破吧
  • 直接在00401078 83F8 FF cmp eax,-1判斷檔案這邊直接做跳轉
  • 修改成jmp 00401205

    註:簡單解釋就是讀取檔案後去cmp這件事情直接改掉,變成直接跳到跳出成功訊息。

總結

這邊直接使用暴破的方式,沒有特別去分析Keyfile.dat的解析方式;主要是因為我發現cmp dword ptr ds:[402173],10這段的理解沒有很清楚,需要再對組合語言這個指令近一步了解。

應該在下一篇會針對分析Keyfile.dat的解析方式,會先花點時間了解一些組合語言,這樣解釋起來比較正確。

額外補充

這邊馬上補充cmp eax, -1的說明:

當前eax = FFFFFFFF
cmp FFFFFFFF, -1 結果會是相等 = 0 ,所以下方的jnz 若不等於0則跳越 ZF=0,是不會跳轉的。

註:cmp相等 = 0

為什麼FFFFFFFF 會等於 -1?
負數的表示是用補數再加1來做表示的。

00000001 = 二進制的 0000 0000 0000 0000 0000 0000 0000 0001
= 補數 1111 1111 1111 1111 1111 1111 1111 1110
= 加1 1111 1111 1111 1111 1111 1111 1111 1111

1111 1111 1111 1111 1111 1111 1111 1111 = 十六進制的 FFFFFFFF
所以 cmp 會相等就是這樣來的~

所以當CreateFileAOPEN_EXISTING的時候,找不到檔案的狀況下,函數回傳到eax的值就是FFFFFFFF


註:我這邊提供一些可以參考的文章 (以上的練習我沒事先參考)
CSDN billvsme的专栏OllyDbg 使用笔记 (三)