Like Share Discussion Bookmark Smile

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

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

目標程式

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


程式簡介

URLegal能檢查你的書籤文件並找出無效鏈接。你能選擇測試單一文件或是檢查子目錄,文件中的每一HTTP URL將自動通過連接到目標網站和接收具體的HTML頁面進行測試,結果在一文本窗口中進行展示。


前置作業

  • 下載目標程式並解壓縮
  • 執行SETUP.EXE,一路Next安裝
  • Finish開啟主程式

任務目標

  • 移除所有的Nag視窗

分析程式

  • 執行URLegal.exe

  • 開啟主程式

  • 點擊File

  • 點擊Register...

  • 彈出Registering視窗

  • 輸入NameCode

  • 點擊Validata My Codes

  • 彈出Name / Code mis-match. Try again. (名稱/代碼不匹配。 再試一次)

  • 關閉主程式

  • 彈出How did you like URLegal?視窗

  • 點擊右上角X

  • 會自對開啟Windows 說明及支援

  • 點擊I will Register Soon

  • 正常關閉主程式

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


額外補充

1
2
3
4
5
6
7
INT_PTR DialogBoxParamA(
HINSTANCE hInstance,
LPCSTR lpTemplateName,
HWND hWndParent,
DLGPROC lpDialogFunc,
LPARAM dwInitParam
);
1
2
3
4
5
6
7
HWND CreateDialogParamA(
HINSTANCE hInstance,
LPCSTR lpTemplateName,
HWND hWndParent,
DLGPROC lpDialogFunc,
LPARAM dwInitParam
);
  • hInstance,類型:HINSTANCE:包含對話框模板的模組句柄。如果此參數為NULL,則使用當前可執行文件。

    • hInstanceWindwos來說是一個獨一無二的數字,是用來標記這個對話框的句柄
  • 兩個模式的對話框,區別為是否允許使用者在不同窗口間進行切換;模式對話框為不允許,非模式對話框允許。

  • 模式對話框,是由Windwos為它內建一個消息循環;非模式對話框,則是通過使用者程序中的消息循環派送。

  • 模式對話框的簡單範例:


輔助程式

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


輔助程式簡介

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


輔助程式前置作業

  • 下載目標程式並解壓縮
  • 右鍵點選eXeScope.exe
  • 點選內容
  • 點選相容性
  • 勾選以系統管理員的身份執行此程式

註:不然開啟程式都會是僅可讀取模式,無法進行寫入修改。

輔助程式使用簡單示範

  • 開啟eXeScope.exe

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

  • 選擇C:\Program Files (x86)\URLegal\Urlegal.exe

    • 建議先備份一份Urlegal.exe
  • 展開資源->對話框

  • 找尋標題為How did you like URLegal?

  • 點擊測試顯示 (可以預覽該對話框)

  • 點擊對話框編輯器(&D) (可以編輯對話框的物件位置、大小..等等)

  • 編輯對話框內的網址

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

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

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

  • 點擊保持更新

  • 點擊確定

  • 執行URLegal.exe

  • 開啟主程式

  • 關閉主程式

  • 彈出How did you like URLegal?視窗

  • URL已經確定被修改了


搜尋思路

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

修改思路

  • 針對彈出的Nag視窗做處理

實際分析

  • 開啟URLegal.exe

  • 於反匯編視窗點選右鍵選擇搜尋(S)->目前模組->指令(O)

  • 輸入push 0x67

    1
    2
    位址       反組譯    
    00401240 push 67
  • 點擊位址=00401240 反組譯=push 67

  • 跳轉到00401240 | 6A 67 | push 67 |

  • 向上觀察

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    00401220   | 55                    | push ebp                                 |
    00401221 | 8BEC | mov ebp,esp |
    00401223 | 6A FF | push FFFFFFFF |
    00401225 | 68 05744100 | push urlegal.417405 |
    0040122A | 64:A1 00000000 | mov eax,dword ptr fs:[0] |
    00401230 | 50 | push eax |
    00401231 | 64:8925 00000000 | mov dword ptr fs:[0],esp |
    00401238 | 51 | push ecx |
    00401239 | 894D F0 | mov dword ptr ss:[ebp-10],ecx |
    0040123C | 8B45 08 | mov eax,dword ptr ss:[ebp+8] |
    0040123F | 50 | push eax |
    00401240 | 6A 67 | push 67 |
  • 找尋push ebp入口點

  • 00401220 | 55 | push ebp |右鍵選擇尋找參考(R)->選定的位址(S)

  • 可見以下位址參考

    1
    2
    位址       反組譯                
    004023BB call urlegal.401220
  • 點擊位址=004023BB 反組譯=call urlegal.401220

  • 跳轉到004023BB | E8 60EEFFFF | call urlegal.401220 |

  • 向上觀察

    1
    2
    3
    4
    5
    6
    004023AA   | E8 691A0000           | call urlegal.403E18                      |
    004023AF | 85C0 | test eax,eax |
    004023B1 | 75 43 | jne urlegal.4023F6 |
    004023B3 | 6A 00 | push 0 |
    004023B5 | 8D8D 98FEFFFF | lea ecx,dword ptr ss:[ebp-168] |
    004023BB | E8 60EEFFFF | call urlegal.401220 |
  • 會發現004023B1 | 75 43 | jne urlegal.4023F6 |跳轉未實現

  • 可跳過004023BB | E8 60EEFFFF | call urlegal.401220 |

  • test eax,eax影響jne的跳轉結果

  • call urlegal.403E18會異動eax的值

  • 004023AA設定中斷點

  • 移除其他中斷點

  • F9執行程式

  • 關閉主程式

  • 斷點在004023AA | E8 691A0000 | call urlegal.403E18 |

  • F7步入

  • 觀察程式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    00403E18   | 55                    | push ebp                                 |
    00403E19 | 8BEC | mov ebp,esp |
    00403E1B | 51 | push ecx | ecx:"艇A"==&"甋A"
    00403E1C | 894D FC | mov dword ptr ss:[ebp-4],ecx |
    00403E1F | 8B45 FC | mov eax,dword ptr ss:[ebp-4] |
    00403E22 | 8B40 2C | mov eax,dword ptr ds:[eax+2C] |
    00403E25 | 8BE5 | mov esp,ebp |
    00403E27 | 5D | pop ebp |
    00403E28 | C3 | ret |
  • F8一步一步過,並持續觀察

  • 步過到下方指令時

    1
    2
    00403E1F   | 8B45 FC               | mov eax,dword ptr ss:[ebp-4]             |
    00403E22 | 8B40 2C | mov eax,dword ptr ds:[eax+2C] |
  • mov eax,dword ptr ss:[ebp-4]mov eax,dword ptr ds:[eax+2C]會異動eax的值

  • 00403E1F | 8B45 FC | mov eax,dword ptr ss:[ebp-4] |按下空白鍵

  • 將指令修改為mov eax, 0x1,按下確定

  • 修改後如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 修改前
    00403E18 | 55 | push ebp |
    00403E19 | 8BEC | mov ebp,esp |
    00403E1B | 51 | push ecx | ecx:"艇A"==&"甋A"
    00403E1C | 894D FC | mov dword ptr ss:[ebp-4],ecx |
    00403E1F | 8B45 FC | mov eax,dword ptr ss:[ebp-4] |
    00403E22 | 8B40 2C | mov eax,dword ptr ds:[eax+2C] |
    00403E25 | 8BE5 | mov esp,ebp |
    00403E27 | 5D | pop ebp |
    00403E28 | C3 | ret |
    // 修改後
    00403E18 | 55 | push ebp |
    00403E19 | 8BEC | mov ebp,esp |
    00403E1B | 51 | push ecx | ecx:"艇A"==&"甋A"
    00403E1C | 894D FC | mov dword ptr ss:[ebp-4],ecx |
    00403E1F | B8 01000000 | mov eax,1 |
    00403E24 | 90 | nop |
    00403E25 | 8BE5 | mov esp,ebp |
    00403E27 | 5D | pop ebp |
    00403E28 | C3 | ret |
  • F9執行程式

  • 主程式正常關閉

  • 沒有彈出Nag視窗


分析總結

  • 004023AA判斷是否註冊的位址
  • 00403E1F00403E22判斷是否跳轉關鍵

修改思路

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

實際修改

  • 開啟URLegal.exe

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

  • 00403E1F | 8B45 FC | mov eax,dword ptr ss:[ebp-4] |按下空白鍵

  • 將指令修改為mov eax, 0x1,按下確定

  • 修改後如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 修改前
    00403E18 | 55 | push ebp |
    00403E19 | 8BEC | mov ebp,esp |
    00403E1B | 51 | push ecx | ecx:"艇A"==&"甋A"
    00403E1C | 894D FC | mov dword ptr ss:[ebp-4],ecx |
    00403E1F | 8B45 FC | mov eax,dword ptr ss:[ebp-4] |
    00403E22 | 8B40 2C | mov eax,dword ptr ds:[eax+2C] |
    00403E25 | 8BE5 | mov esp,ebp |
    00403E27 | 5D | pop ebp |
    00403E28 | C3 | ret |
    // 修改後
    00403E18 | 55 | push ebp |
    00403E19 | 8BEC | mov ebp,esp |
    00403E1B | 51 | push ecx | ecx:"艇A"==&"甋A"
    00403E1C | 894D FC | mov dword ptr ss:[ebp-4],ecx |
    00403E1F | B8 01000000 | mov eax,1 |
    00403E24 | 90 | nop |
    00403E25 | 8BE5 | mov esp,ebp |
    00403E27 | 5D | pop ebp |
    00403E28 | C3 | ret |
  • 點擊修補程式 或是快捷鍵Ctrl + P

  • 點擊修補檔案(P)

  • 另存檔名URLegal.crack.exe

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


心得分享

  • 搜尋的方式這邊僅示範了尋找參考
  • 亦可使用暫停的方式,找尋堆疊也可找到關鍵位置

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