Like Share Discussion Bookmark Smile

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

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

反匯編到現在也差不多有一點點的經驗了,這篇將會多介紹一些東西,這邊要介紹有些程式中討厭的Nag視窗。

什麼是Nag?翻譯為:撈叨;所以是什麼呢?就是常有一些產品,在尚未註冊或是已經過期的狀態一下,在開啟程式前,會跳出一個提醒視窗,告知要購買新的序號了,還有在結束的時候,也會出現這個視窗;這就稱之為Nag視窗。

還有這個程式的PE被故意修改過了,所以在用OD開啟的時候會出現錯誤,至於什麼是PE,這邊先不講解,這邊主要還是在於反匯編的練習,後面會慢慢提到一些其他的知識。

檔案下載

目的程式:
RegisterMe.Oops.7z

解壓縮密碼:

1
morosedog

使用PEid檢驗

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

開啟RegisterMe.Oops.exe使用並分析

  • 開啟 RegisterMe.Oops.exe
  • 跳出Nag視窗,顯示標題Register Me內容Remove the nags to resister This will make program fully registered :))
  • 按下確定
  • 跳出主程式視窗,顯示標題Register Me ! wait no longer :))內容You need to register me now! It is supposed ti be quite easy. Just patch the program to remove the Nags.
  • 點擊關閉
  • 跳出Nag視窗,顯示標題Register Me內容Oops! Iam not registered !!

分析:基本上就是找到彈跳視窗的函數,然後找到判斷的地方,將其跳過,應該就可以了

目標說明

在開啟程式後,Nag視窗都不顯示

使用OllyDBG開啟錯誤卡死問題

主要是因為PE的部分被惡修改,造成OD執行上的錯誤。

打開選項 -> 除錯設定 -> 事件,將設定第一次暫停於選擇系統斷點,這樣就不會卡死

註:改好PE問題,要反匯編程式記得修改回WinMain(若位置已知)

使用OllyDBG 修正PE檔頭

  • 按下Alt + M或是上方的M圖示,開啟記憶體視窗
  • 你可以看到PE檔頭
  • 我們要注意的是地址為00開頭,如果是7xx看到的,那些PE檔頭是dll的。

  • 而我這邊的建議是用另一個OD開啟第OllyDBG - 第十一章 | 反匯編練習 (三) 上的目標程式,來做比對

  • 這樣你就可以很清楚知道,到底哪些地方怪怪的

  • 比較一下兩張圖片的PE大小,一個為00005000,一個為00001000

    • 通常正常的PE大小應該都為00001000
  • 而且下方的代碼資料輸入表…等等都不見了

  • 由此可見,這個PE檔頭真的有問題

  • 左鍵雙擊有問題的那個PE檔頭

  • 相信到這邊會有一堆看不懂的東西,這很正常,我也沒很懂,因為我不了解PE的結構

  • 不過沒關係,我們先往下看,看到004000C0 50 45 00 00>ASCII "PE" ; PE signature (PE),這邊就是PE檔頭的開始

  • 同樣的,我們開啟兩個的來做比對,就可以發現有一些資料被異常修改的很大

  • 我這邊有特別標示出怪怪的資料

  • 我們將這些怪怪的資料,根據比對的資料去做修改
  • 點選資料,點擊右鍵選擇修改整數
1
2
3
4
5
6
7
8
9
10
11
12
SizeOfCode = 40000400 改成比對的資料 600
SizeOfInitializedData = 40000A00 改成比對的資料 1800

BaseOfCode = 40001000 一般都是1000
BaseOfData = 40002000 改成比對的資料 2000

NumberOfRvaAndSizes = 40000004 一般都是10

這個程式沒有輸出,沒有輸出表,所以

Export Table address = 500000  改成 0
Export Table size = 50000 改成 0

註:基本上資料的最高位有數值,基本上是不太可能的,這程式沒有很大,所以4000400,基本上應該是0000400,只是我這邊用比對的資料去做修改,也是可以的(算是運氣好)。

  • 我們要另存這個檔,先記住修改的位置為 00400DC ~ 0040013C 這中間
  • 我們回到反匯編視窗
  • 在最下方的資料視窗按下Ctrl + G輸入00400DC
  • 選中00400DC ~ 0040013C
  • 按下右鍵選擇複製到可執行檔案
  • 在跳出視窗按下右鍵選擇備份 -> 儲存資料到檔案
  • 另存檔名為RegisterMe.Oops.fixPE.exe

  • 選項 -> 除錯設定 -> 事件,將設定第一次暫停於選擇WinMain(若位置已知)
  • 按下F3
  • 開啟剛剛另存的RegisterMe.Oops.fixPE.exe
  • 恭喜沒再報錯誤了

註:這邊提供修好的RegisterMe.Oops.fixPE.7z給予下載

使用OllyDBG分析

在開始之前,建議還是使用OD先做初步的分析在做爆破或是破解。

然而經過前面多篇的反覆練習,對於OD的使用,有了基本的功力,在這邊將會直接開始使用動態圖來做分析反匯編,將不再透過文字來描述,僅僅會說明一些修改的重點。

方法一:

  • 使用修改指令的方式跳過惱人的Nag視窗
  • 主要是將會跳出Nag的判斷或是call將其使用jmp的方式跳過

方法二:

  • 使用NOP來將跳出Nag的指令做填充

總結

這邊已經開始提到PE檔頭的部分,我對這塊也是不了解的,在反匯編練習到一段落後,將會開始來說明一下PE

額外補充

  • GetModuleHandleA,這個API函數用於獲取程式的ImageBase (基址)
  • 名詞的解釋
    • Image Base = 基址,PE裝入記憶體時的基地址。默認情況下,EXE文件在記憶體中對應的地址是0x00400000,DLL文件是0x10000000。這些位置可能通過編譯選項修改
    • VA = (VirtualAddress, 虛擬地址),PE文件中的指令裝入記憶體後的地址
    • RVA = (RelativeVirtuakAddress, 相對虛擬地址),是記憶體地址相對於映射基址的偏移量
    • EP = (EntryPoiny, 程式入口點)
  • 虛擬地址,基址,相對虛擬地址三者之間
    • VA = Image Base + RVA

註:我這邊提供一些可以參考的文章
CSDN billvsme的专栏OllyDbg 使用笔记 (四)
PE文件与虚拟内存之间的映射