Like Share Discussion Bookmark Smile

J.J. Huang   2019-08-03   x64dbg   瀏覽次數:

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

目標程式

檔案下載:RegisterMe.Oops.exe
解壓密碼:morosedog


程式說明

這個程式的PE被故意修改過了,所以在用OllyDBG開啟的時候會出現錯誤,至於什麼是PE,這邊先不講解。
(這邊使用x64dbg沒有顯示錯誤)

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


任務目標

  • 查看比對PE異常的部分
  • 移除所有的Nag視窗

分析程式

  • 開啟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 !!

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


搜尋思路

  • MASM32 / TASM32撰寫的,使用函數搜尋 (輸入框函數:MessageBox)。
  • 使用搜尋字串找關鍵字。

修改思路

  • 使用NOP填充替代彈出Nag的部分
  • 使用jmp跳過彈出Nag的部分

PE分析

  • 開啟RegisterMe.Oops.exe
  • PE Viewer視窗點擊Reload
  • 切換到IMAGE_OPTIONAL_HEADERIMAGE_DIRECTORY_ENTRIES

  • 另外開啟一個x64dbg
  • 開啟reverseMe.exe
  • PE Viewer視窗點擊Reload
  • 切換到IMAGE_OPTIONAL_HEADERIMAGE_DIRECTORY_ENTRIES

  • 比較兩個IMAGE_OPTIONAL_HEADERIMAGE_DIRECTORY_ENTRIES的差異

  • 差異如下
    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

註:詳細的修改方式可以參考OllyDBG - 第十三章 | 反匯編練習 (四) 上


實際分析

  • 開啟RegisterMe.Oops.exe

  • 於反匯編視窗點選右鍵選擇搜尋(S)->目前模組->跨模組呼叫(I)

  • 發現MessageBoxA,對其設定中斷點

  • F9執行程式

  • 斷點0040101F | E8 C6010000 | call <JMP.&MessageBoxA> |

  • F8步過

  • 彈出視窗標題為Register Me內容為Remove the nags to register This will make program fully registered :))

  • 在此可以確認,這邊就是第一個Nag

  • 按下確認按鈕

  • F8繼續步過,並持續觀察

  • 步過到下方指令時

    1
    00401034   | E8 19000000              | call registerme.oops.401052                 |
  • 彈出視窗標題為Register Me ! Wait no longer :))內容為You need to register me now! It is supposed to be quite easy. Just patch the program to remove the Nags.

  • 在此可以確認,這邊是主程式的一個函數00401052

  • 關閉視窗

  • 斷點00401047 | E8 9E010000 | call <JMP.&MessageBoxA> |

  • F8步過

  • 彈出視窗標題為Register Me內容為Oops! I am not registered !!

  • 在此可以確認,這邊就是第二個Nag


分析總結

  • 0040101F為第一個Nag
  • 00401047為第二個Nag
  • 00401034為Call00401052主程式位址。

修改思路

  • Nag段用NOP做填充。
  • 跳過會彈Nag的位址。

實際修改

這邊使用修改思路的第1個方法做示範。

  • 開啟RegisterMe.Oops.exe

  • 00401011 ~ 0040101F 為第一個Nag

  • 全選,並右鍵選擇二進位->用 NOP 填充 (Ctrl + 9)

    1
    2
    3
    4
    5
    00401011   | 6A 00                    | push 0                                      |
    00401013 | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
    00401018 | 68 34304000 | push registerme.oops.403034 | 403034:"Remove the nags to register\r\nThis will make program fully registered :))"
    0040101D | 6A 00 | push 0 |
    0040101F | E8 C6010000 | call <JMP.&MessageBoxA> |
  • 00401039 ~ 00401047 為第二個Nag

  • 全選,並右鍵選擇二進位->用 NOP 填充 (Ctrl + 9)

    1
    2
    3
    4
    5
    00401039   | 6A 00                    | push 0                                      |
    0040103B | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
    00401040 | 68 89304000 | push registerme.oops.403089 | 403089:"Oops! I am not registered !!"
    00401045 | 6A 00 | push 0 |
    00401047 | E8 9E010000 | call <JMP.&MessageBoxA> |
  • 點擊修補程式 或是快捷鍵Ctrl + P

  • 點擊修補檔案(P)

  • 另存檔名RegisterMe.Oops.NoNag.exe

  • 恭喜補丁產生RegisterMe.Oops.NoNag.exe


這邊使用修改思路的第2個方法做示範。

  • 開啟RegisterMe.Oops.exe

  • 00401011 ~ 0040101F 為第一個Nag

  • 0040100F | 74 13 | je registerme.oops.401024 |按下空白鍵

  • 將指令修改為jmp 0x00401024,按下確定

  • 修改後如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // 修改前
    0040100F | 74 13 | je registerme.oops.401024 |
    00401011 | 6A 00 | push 0 |
    00401013 | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
    00401018 | 68 34304000 | push registerme.oops.403034 | 403034:"Remove the nags to register\r\nThis will make program fully registered :))"
    0040101D | 6A 00 | push 0 |
    0040101F | E8 C6010000 | call <JMP.&MessageBoxA> |
    00401024 | 6A 0A | push A |
    // 修改後
    0040100F | EB 13 | jmp registerme.oops.401024 |
    00401011 | 6A 00 | push 0 |
    00401013 | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
    00401018 | 68 34304000 | push registerme.oops.403034 | 403034:"Remove the nags to register\r\nThis will make program fully registered :))"
    0040101D | 6A 00 | push 0 |
    0040101F | E8 C6010000 | call <JMP.&MessageBoxA> |
    00401024 | 6A 0A | push A |
  • 00401039 ~ 00401047 為第二個Nag

  • 00401039 | 6A 00 | push 0 |按下空白鍵

  • 將指令修改為jmp 0x0040104C,按下確定

  • 修改後如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // 修改前
    00401039 | 6A 00 | push 0 |
    0040103B | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
    00401040 | 68 89304000 | push registerme.oops.403089 | 403089:"Oops! I am not registered !!"
    00401045 | 6A 00 | push 0 |
    00401047 | E8 9E010000 | call <JMP.&MessageBoxA> |
    0040104C | 50 | push eax |
    0040104D | E8 BC010000 | call <JMP.&ExitProcess> |
    // 修改後
    00401039 | EB 11 | jmp registerme.oops.40104C |
    0040103B | 68 7D304000 | push registerme.oops.40307D | 40307D:"Register Me"
    00401040 | 68 89304000 | push registerme.oops.403089 | 403089:"Oops! I am not registered !!"
    00401045 | 6A 00 | push 0 |
    00401047 | E8 9E010000 | call <JMP.&MessageBoxA> |
    0040104C | 50 | push eax |
    0040104D | E8 BC010000 | call <JMP.&ExitProcess> |
  • 點擊修補程式 或是快捷鍵Ctrl + P

  • 點擊修補檔案(P)

  • 另存檔名RegisterMe.Oops.NoNag.exe

  • 恭喜補丁產生RegisterMe.Oops.NoNag.exe


註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏OllyDbg 使用笔记 (四)