Like Share Discussion Bookmark Smile

J.J. Huang   2019-09-02   x64dbg   瀏覽次數:

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

前言

這篇延續上一篇x64dbg - 第二十七章 | 反匯編練習(十六),針對提供的輔助程式eXeScope.exe做破解,因未註冊的eXeScope.exe,僅可對相同的檔案做一次的修改。

目標程式

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


程式簡介

這是一套可將程式中的英文字挑出來加以修改、翻譯,將軟體轉成中文的操作介面來,它包括可更改選單menu、字體font、對話方塊dialog,它還能直接修改EXEDLLOCX..etc.


任務目標

  • 破解註冊
  • 分析註冊碼算法 (未實現)

分析程式

  • 執行eXeScope.exe

  • 開啟主程式

  • 點擊幫助->註冊(R)...

  • 彈出註冊視窗

  • 輸入你的名字(N)ID

  • 點擊確定

  • 彈出錯誤視窗,內容無效的 ID 或名字

  • 點擊文件->打開(O)...

  • 選擇上一章的Urlegal.exe

  • 展開資源->對話框

  • 選擇103

  • 編輯對話框內的網址

  • Dialog: 103Static: http://www.worldlynx.net/pgerhart/

    注意:103 (十進制)0x67 (十六進制)表示為Nag視窗的hInstance

  • 修改http://www.worldlynx.net/pgerhart/ -> https://morosedog.gitlab.io/

  • 點擊保持更新

  • 點擊確定

  • 再次點擊文件->打開(O)...

  • 選擇上一章的Urlegal.exe

  • 展開資源->對話框

  • 選擇103

  • 編輯對話框內的網址

  • Dialog: 103Static: http://www.worldlynx.net/pgerhart/

    注意:103 (十進制)0x67 (十六進制)表示為Nag視窗的hInstance

  • 修改https://morosedog.gitlab.io/ -> http://www.worldlynx.net/pgerhart/

  • 點擊保持更新

  • 彈出錯誤視窗,內容你還沒有註冊,只能寫入一次。

檢驗顯示是使用Borland Delphi 6.0 - 7.0 [Overlay]編寫。


搜尋思路

  • 使用搜尋字串找關鍵字
  • 根據堆疊的調用,判斷產生Nag視窗的函數位置

修改思路

  • 跳過註冊邏輯判斷
  • 分析註冊碼算法 (未實現)

實際分析

  • 開啟eXeScope.exe

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

  • 搜尋輸入ID

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    位址       反組譯                           字串                                 
    0040F5C9 mov eax,exescope.40F764 "VarIdiv"
    0045525E mov edx,exescope.455278 "WidthType"
    0045AD08 mov eax,dword ptr ds:[446930] "|iD"==L"楼D"==&"pIG"
    0046C38A mov ecx,exescope.46C450 "JumpID(\"\",\"%s\")"
    004BC39A mov edx,exescope.4BC524 "~Tmp.mid"
    004BC5C3 mov edx,exescope.4BC6B0 "MIDI"
    004BE349 mov eax,exescope.4BE5FC "PixWidth"
    004BE374 mov eax,exescope.4BE63C "AvgWidth"
    004BE382 mov eax,exescope.4BE650 "MaxWidth"
    004BE3CC mov eax,exescope.4BE6B4 "WidthBytes"
    004C0065 mov ecx,exescope.4C007C "Resident (Exported Functions)"
    004C00AE mov ecx,exescope.4C00C4 "Non-resident (Exported Functions)"
    004C108A push exescope.4C11D4 "GUID="
    004C2B32 mov ecx,exescope.4C2BE4 "ID"
    004C2B5E mov eax,exescope.4C2BF0 "无效的 ID 或名字"
    004C7328 mov ecx,exescope.4C7628 "Resident"
    004C7356 mov ecx,exescope.4C763C "Non-resident"
    004C974B mov edx,exescope.4C98F4 "MIDI (*.mid)|*.mid"
    004C9F2D mov edx,exescope.4CA048 "MIDI (*.mid)|*.mid"
    004CBD7B mov ecx,exescope.4CBF2C "Width"==L"楗瑤h"
    004CBE0F mov ecx,exescope.4CBF68 "ID"
    004CC0C9 mov ecx,exescope.4CC268 "Width"==L"楗瑤h"
  • 點擊无效的 ID 或名字

  • 到達004C2B5E位址,觀察指令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    004C2B57    | EB 20                    | jmp exescope.4C2B79                            |
    004C2B59 | 6A 00 | push 0 |
    004C2B5B | 8D55 EC | lea edx,dword ptr ss:[ebp-14] |
    004C2B5E | B8 F02B4C00 | mov eax,exescope.4C2BF0 | 4C2BF0:"无效的 ID 或名字"
    004C2B63 | E8 680D0000 | call exescope.4C38D0 |
    004C2B68 | 8B45 EC | mov eax,dword ptr ss:[ebp-14] |
    004C2B6B | 66:8B0D 202C4C00 | mov cx,word ptr ds:[4C2C20] |
    004C2B72 | B2 01 | mov dl,1 |
    004C2B74 | E8 2F4BF7FF | call exescope.4376A8 |
    004C2B79 | 33C0 | xor eax,eax |
  • 004C2B57 | EB 20 | jmp exescope.4C2B79 |會跳過无效的 ID 或名字

  • 004C2B57設定中斷點

  • F9執行程式

  • 點擊幫助->註冊(R)...

  • 彈出註冊視窗

  • 輸入你的名字(N)ID

  • 點擊確定

  • 彈出錯誤視窗,內容無效的 ID 或名字

  • 發現程式並沒有斷點在004C2B57

  • 向上觀察

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    004C2AC6    | 0F84 8D000000            | je exescope.4C2B59                             |
    004C2ACC | A1 E8FE4C00 | mov eax,dword ptr ds:[4CFEE8] | 004CFEE8:"T.M"
    004C2AD1 | 8B00 | mov eax,dword ptr ds:[eax] |
    004C2AD3 | E8 7821F4FF | call exescope.404C50 |
    004C2AD8 | 85C0 | test eax,eax |
    004C2ADA | 7E 7D | jle exescope.4C2B59 |
    004C2ADC | 8D55 F0 | lea edx,dword ptr ss:[ebp-10] |
    004C2ADF | A1 FCFE4C00 | mov eax,dword ptr ds:[4CFEFC] |
    004C2AE4 | 8B00 | mov eax,dword ptr ds:[eax] |
    004C2AE6 | E8 11FCFCFF | call exescope.4926FC |
    004C2AEB | 8B45 F0 | mov eax,dword ptr ss:[ebp-10] |
    004C2AEE | 8D4D F4 | lea ecx,dword ptr ss:[ebp-C] |
    004C2AF1 | BA B82B4C00 | mov edx,exescope.4C2BB8 | 4C2BB8:".ini"
    004C2AF6 | E8 2570F4FF | call exescope.409B20 |
    004C2AFB | 8B4D F4 | mov ecx,dword ptr ss:[ebp-C] |
    004C2AFE | B2 01 | mov dl,1 |
    004C2B00 | A1 2CBE4300 | mov eax,dword ptr ds:[43BE2C] | 0043BE2C:"x綜"
    004C2B05 | E8 D293F7FF | call exescope.43BEDC |
    004C2B0A | 8BF0 | mov esi,eax |
    004C2B0C | A1 E8FE4C00 | mov eax,dword ptr ds:[4CFEE8] | 004CFEE8:"T.M"
    004C2B11 | 8B00 | mov eax,dword ptr ds:[eax] |
    004C2B13 | 50 | push eax |
    004C2B14 | B9 C82B4C00 | mov ecx,exescope.4C2BC8 | 4C2BC8:"Name"
    004C2B19 | BA D82B4C00 | mov edx,exescope.4C2BD8 | 4C2BD8:"Reg"
    004C2B1E | 8BC6 | mov eax,esi |
    004C2B20 | 8B38 | mov edi,dword ptr ds:[eax] |
    004C2B22 | FF57 04 | call dword ptr ds:[edi+4] |
    004C2B25 | A1 4CFE4C00 | mov eax,dword ptr ds:[4CFE4C] | 004CFE4C:"X.M"
    004C2B2A | 8B00 | mov eax,dword ptr ds:[eax] |
    004C2B2C | 50 | push eax |
    004C2B2D | BA D82B4C00 | mov edx,exescope.4C2BD8 | 4C2BD8:"Reg"
    004C2B32 | B9 E42B4C00 | mov ecx,exescope.4C2BE4 | 4C2BE4:"ID"
    004C2B37 | 8BC6 | mov eax,esi |
    004C2B39 | 8B38 | mov edi,dword ptr ds:[eax] |
    004C2B3B | FF57 04 | call dword ptr ds:[edi+4] |
    004C2B3E | 8BC6 | mov eax,esi |
    004C2B40 | E8 9B10F4FF | call exescope.403BE0 |
    004C2B45 | A1 5CFC4C00 | mov eax,dword ptr ds:[4CFC5C] |
    004C2B4A | C600 01 | mov byte ptr ds:[eax],1 |
    004C2B4D | C783 4C020000 01000000 | mov dword ptr ds:[ebx+24C],1 |
    004C2B57 | EB 20 | jmp exescope.4C2B79 |
    004C2B59 | 6A 00 | push 0 |
    004C2B5B | 8D55 EC | lea edx,dword ptr ss:[ebp-14] | [ebp-14]:&"舡A"
    004C2B5E | B8 F02B4C00 | mov eax,exescope.4C2BF0 | 4C2BF0:"无效的 ID 或名字"
    004C2B63 | E8 680D0000 | call exescope.4C38D0 |
  • 發現兩個關鍵跳轉

    1
    2
    004C2AC6    | 0F84 8D000000            | je exescope.4C2B59                             |
    004C2ADA | 7E 7D | jle exescope.4C2B59 |
  • 004C2ADA004C2AC6設定中斷點

  • 點擊確定

  • 004C2AC6 | 0F84 8D000000 | je exescope.4C2B59 |跳轉已實現

  • 會跳轉到無效的 ID 或名字

  • je跳轉實現為ZF=1,我們將其修改為ZF=0

  • F8繼續步過,持續觀察

  • 步過到下方指令時

    1
    004C2ADA    | 7E 7D                    | jle exescope.4C2B59                            |
  • 004C2ADA | 7E 7D | jle exescope.4C2B59 |跳轉未實現

  • F8繼續步過,持續觀察

  • 步過到下方指令時

    1
    004C2B57    | EB 20                    | jmp exescope.4C2B79                            |
  • 004C2B57 | EB 20 | jmp exescope.4C2B79 |跳轉已實現

  • 跳過了无效的 ID 或名字

  • F9繼續執行

  • 點擊幫助->註冊(R)...

  • 彈出註冊視窗

  • 顯示已註冊

  • 點擊文件->打開(O)...

  • 選擇上一章的Urlegal.exe

  • 展開資源->對話框

  • 選擇103

  • 編輯對話框內的網址

  • Dialog: 103Static: http://www.worldlynx.net/pgerhart/

    注意:103 (十進制)0x67 (十六進制)表示為Nag視窗的hInstance

  • 修改http://www.worldlynx.net/pgerhart/ -> https://morosedog.gitlab.io/

  • 點擊保持更新

  • 沒有彈出錯誤視窗,內容你還沒有註冊,只能寫入一次。

  • 恭喜程式真正被破解


分析總結

  • 004C2AC6,實現跳轉則彈出失敗訊息。

修改思路

根據分析總結

  • 004C2AC6使用 NOP 填充

實際修改

  • 開啟eXeScope.exe

  • 反匯編視窗中按下Ctrl + G輸入004C2AC6,會跳轉到004C2AC6位址

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

  • 修改後如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 修改前
    004A5461 | 0F85 D7010000 | jne exescope.4A563E |
    004A5467 | 896C24 34 | mov dword ptr ss:[esp+34],ebp |
    004A546B | 8B45 18 | mov eax,dword ptr ss:[ebp+18] |
    // 修改後
    004A5461 | 90 | nop |
    004A5462 | 90 | nop |
    004A5463 | 90 | nop |
    004A5464 | 90 | nop |
    004A5465 | 90 | nop |
    004A5466 | 90 | nop |
    004A5467 | 896C24 34 | mov dword ptr ss:[esp+34],ebp |
    004A546B | 8B45 18 | mov eax,dword ptr ss:[ebp+18] |
  • 點擊修補程式 或是快捷鍵Ctrl + P

  • 點擊修補檔案(P)

  • 另存檔名eXeScope.crack.exe

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


註:以上參考了
x64dbg
x64dbg’s documentation!
看雪論壇[原创]非常适合新手学习的eXeScope深入分析