Like Share Discussion Bookmark Smile

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

x64dbg - 第二十一章 | 反匯編練習(十)

目標程式

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


程式簡介

Flash Jigsaw Producer具有舒適的界面,能夠從任何尺寸高達2800x2800像素的BMP,GIFJPG圖像建立Flash拼圖。


前置作業

  • 使用管理者權限安裝
  • Next安裝
  • 安裝完畢自動開啟主程式


任務目標

  • 破解非註冊版本限制的功能。

分析程式

  • 開啟fjproducer.exe
  • 點擊Options->Flash Sizes...
  • 見標題後方多了(unregistered)

  • 點擊Desk->Select...
  • 彈出視窗,標題為No Registration!內容為For registered users only

檢驗顯示是使用Microsoft Visual C++ 7.0編寫。


搜尋思路

  • 使用搜尋字串找關鍵字。

修改思路

  • 修改驗證的邏輯

實際分析

  • 開啟fjproducer.exe

  • 於反匯編視窗點選右鍵選擇搜尋(S)->目前模組->字串引用(S)

  • 搜尋輸入unregistered

  • 運氣不錯,發現標題的字串

    1
    2
    位址       反組譯                    字串                                    
    00404700 push fjproducer.429CC8 "Flash Jigsaw Producer (unregistered)"
  • 左鍵雙擊

  • 到達00404700位址,向上觀察會跳轉跳過彈出訊息視窗的指令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    004046E0 | 8A4424 04             | mov al,byte ptr ss:[esp+4]               |
    004046E4 | 84C0 | test al,al |
    004046E6 | 74 12 | je fjproducer.4046FA |
    004046E8 | A1 440A4300 | mov eax,dword ptr ds:[430A44] |
    004046ED | 68 F09C4200 | push fjproducer.429CF0 | 429CF0:"Flash Jigsaw Producer"
    004046F2 | 50 | push eax |
    004046F3 | FF15 5C924200 | call dword ptr ds:[<&SetWindowTextA>] |
    004046F9 | C3 | ret |
    004046FA | 8B0D 440A4300 | mov ecx,dword ptr ds:[430A44] |
    00404700 | 68 C89C4200 | push fjproducer.429CC8 | 429CC8:"Flash Jigsaw Producer (unregistered)"
    00404705 | 51 | push ecx |
    00404706 | FF15 5C924200 | call dword ptr ds:[<&SetWindowTextA>] |
    0040470C | C3 | ret |
  • 004046E6 | 74 12 | je fjproducer.4046FA |會跳到彈出未註冊

  • 004046E6按右鍵選擇二進位->用 NOP 填充 (Ctrl + 9)

    1
    2
    3
    4
    5
    // 修改前
    004046E6 | 74 12 | je fjproducer.4046FA |
    // 修改後
    004046E6 | 90 | nop |
    004046E7 | 90 | nop |
  • F9執行程式

  • 點擊Options->Flash Sizes...

  • 見標題後方多了(unregistered)

  • 點擊Desk->Select...

  • 彈出視窗,標題為No Registration!內容為For registered users only

  • 發現程式並沒有真正破解

  • 在此可以確認單純跳過只是修改標題的內容


  • Ctrl + F2重新啟動(S)
  • 反匯編視窗中按下Ctrl + G輸入004046E6,會跳轉到004046E6位址
  • 到達00404700位址,向上觀察影響je跳轉
    1
    2
    3
    004046E0 | 8A4424 04             | mov al,byte ptr ss:[esp+4]               |
    004046E4 | 84C0 | test al,al |
    004046E6 | 74 12 | je fjproducer.4046FA |
  • test al,al影響je的跳轉結果
  • mov al,byte ptr ss:[esp+4]會異動al的值
  • 004046E0 | 8A4424 04 | mov al,byte ptr ss:[esp+4] |右鍵選擇尋找參考(R)->選定的位址(S)
  • 可見以下位址參考
    1
    2
    3
    位址       反組譯                   
    004047D3 call fjproducer.4046E0
    00404880 call fjproducer.4046E0
  • 右鍵選擇Set breakpoint on all commands (在所有命令上設置斷點)
  • Ctrl + F2重新啟動(S)
  • F9執行程式
  • 斷點004047D3 | E8 08FFFFFF | call fjproducer.4046E0 |
  • F7步入
  • 斷點在004046E0 | 8A4424 04 | mov al,byte ptr ss:[esp+4] |
  • 可以發現這邊是決定標題顯示的地方

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 斷點004047D3 | E8 08FFFFFF | call fjproducer.4046E0 |

  • 向上觀察

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    0040478B | 68 60034300           | push fjproducer.430360                   | 430360:"C:\\Users\\morose\\AppData\\Local\\YavSoft\\fjproducer\\startup.ini"
    00404790 | 68 8CE04200 | push fjproducer.42E08C | 42E08C:"fjpefi0azn1tat3byxaf"
    00404795 | 68 249D4200 | push fjproducer.429D24 | 429D24:"Program ID"
    0040479A | 68 149D4200 | push fjproducer.429D14 | 429D14:"Registration"
    0040479F | FF15 28904200 | call dword ptr ds:[<&WritePrivateProfile |
    004047A5 | 8B0D ACE34200 | mov ecx,dword ptr ds:[42E3AC] | 0042E3AC:&"Password"
    004047AB | 68 60034300 | push fjproducer.430360 | 430360:"C:\\Users\\morose\\AppData\\Local\\YavSoft\\fjproducer\\startup.ini"
    004047B0 | 6A 28 | push 28 |
    004047B2 | 68 34034300 | push fjproducer.430334 | 430334:"<No Pass>"
    004047B7 | 68 089D4200 | push fjproducer.429D08 | 429D08:"<-No Pass->"
    004047BC | 51 | push ecx |
    004047BD | 68 149D4200 | push fjproducer.429D14 | 429D14:"Registration"
    004047C2 | FF15 68904200 | call dword ptr ds:[<&GetPrivateProfileSt |
    004047C8 | 68 34034300 | push fjproducer.430334 | 430334:"<No Pass>"
    004047CD | E8 6EFEFFFF | call fjproducer.404640 |
    004047D2 | 50 | push eax |
    004047D3 | E8 08FFFFFF | call fjproducer.4046E0 |
  • 004047CD004047C20040479Fcall回傳eax的值

  • 004047CD004047C20040479F設定中斷點

  • 移除其他中斷點

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 斷點在0040479F | FF15 28904200 | call dword ptr ds:[<&WritePrivateProfile |

  • F8一步一步過,並持續觀察eax的變化

  • 004047CDcall回傳eax的值,FFFFFF00,故這個需要在F7步入觀察

  • F7步入

  • 觀察程式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    00404640 | 83EC 2C               | sub esp,2C                               |
    00404643 | 56 | push esi | esi:"<No Pass>"
    00404644 | 8B7424 34 | mov esi,dword ptr ss:[esp+34] | [esp+34]:"<No Pass>"
    00404648 | 8BC6 | mov eax,esi | esi:"<No Pass>"
    0040464A | 8D50 01 | lea edx,dword ptr ds:[eax+1] | edx:"No Pass>"
    0040464D | 8D49 00 | lea ecx,dword ptr ds:[ecx] |
    00404650 | 8A08 | mov cl,byte ptr ds:[eax] |
    00404652 | 40 | inc eax |
    00404653 | 84C9 | test cl,cl |
    00404655 | 75 F9 | jne fjproducer.404650 |
    00404657 | 2BC2 | sub eax,edx | edx:"No Pass>"
    00404659 | 83F8 04 | cmp eax,4 |
    0040465C | 73 07 | jae fjproducer.404665 |
    0040465E | 32C0 | xor al,al |
    00404660 | 5E | pop esi | esi:"<No Pass>"
    00404661 | 83C4 2C | add esp,2C |
    00404664 | C3 | ret |
    00404665 | 6A 03 | push 3 |
    00404667 | 68 C49C4200 | push fjproducer.429CC4 | 429CC4:"fjr"
    0040466C | 56 | push esi | esi:"<No Pass>"
    0040466D | E8 6EAA0100 | call fjproducer.41F0E0 |
    00404672 | 83C4 0C | add esp,C |
    00404675 | 85C0 | test eax,eax |
    00404677 | 75 E5 | jne fjproducer.40465E |
  • 中間過程應該是在驗證註冊的內容

  • 0040465E | 32C0 | xor al,al |最後傳入eax的值

  • 在此可以假設0040465E回傳的eax是否註冊成功

  • 0040465E | 32C0 | xor al,al |按下空白鍵

  • 將指令修改為xor al, 0x1,按下確定

  • 修改後如下

    1
    2
    3
    4
    // 修改前
    0040465E | 32C0 | xor al,al |
    // 修改後
    0040465E | 32C0 | xor al,1 |
  • 移除所有中斷點

  • F9執行程式

  • 點擊Desk->Select...

  • 功能正常使用

  • 點擊Options->Flash Sizes...

  • 見標題沒有為註冊訊息

  • 恭喜程式真正被破解


分析總結

  • 0040465E 回傳是否註冊成功的關鍵eax

修改思路

根據分析總結

  • 修改直接賦予al的值為0x1

實際修改

  • 開啟fjproducer.exe

  • 0040465E | 32C0 | xor al,al |按下空白鍵

  • 將指令修改為xor al, 0x1,按下確定

  • 修改後如下

    1
    2
    3
    4
    // 修改前
    0040465E | 32C0 | xor al,al |
    // 修改後
    0040465E | 32C0 | xor al,1 |
  • 點擊修補程式 或是快捷鍵Ctrl + P

  • 點擊修補檔案(P)

  • 另存檔名fjproducer.crack.exe

  • 恭喜補丁產生fjproducer.crack.exe


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