Like Share Discussion Bookmark Smile

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

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

目標程式

檔案下載:[VisualSite Designer](/download/x64dbg/chapter17/VisualSite Designer.7z)
解壓密碼:morosedog


程式簡介

Visual Site Designer 是一套所見即所得的網站設計軟體,讓你使用多頁面、圖片和動畫製作網站。


任務目標

  • 移除使用次數限制。
  • 移除廣告視窗(Nag)。

分析程式

  • 開啟VisualSite Designer.exe
  • 彈出視窗,下方顯示Number of trials 10 (試驗次數10)

  • 點擊綠色的部分,會開啟主程式

  • 關閉主程式,會彈出廣告視窗


額外補充

  • 軟件斷點

    • 平常常用的F2設定的斷點。
    • 原理是在斷點處重寫代碼,寫入int3中斷指令 (當CPU執行到int3x64dbg可取得控制權)。
  • 硬件斷點

    • 依賴CPU的物理支持。
    • 其中有8個專用的調試寄存器:Dr0-Dr7
      • Dr0-Dr3:存放執行地址。
      • Dr4-Dr5:默認不使用。
      • Dr6-Dr7:記錄Dr0-Dr3的屬性 (讀、寫還是執行)。
    • 是硬件斷點最多下四個的原因
  • 內存斷點 (特殊斷點)

    • 每次僅能設置一個
    • 設置一個斷點,會改變整個內存的屬性

  • 何時使用軟件斷點硬件斷點
    軟件斷點只能在x64dbgCPU介面設置,無法在資料資料中設置,也無法在一段指令的中間設置。
    如果想在Windwos的動態連結程式庫(DLL)裡面設定斷點,就會需要使用硬件斷點,如使用軟件斷點設置在動態連結程式庫(DLL)裡面是不會被保存的,重啟程式將丟失斷點。

搜尋思路

  • F8一步一步過,找到彈出視窗的位置。
  • F9執行程式,使用Alt + F9執行到使用者代碼(U),找到Call的位置。

修改思路

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

實際分析

  • 開啟VisualSite Designer.exe

  • F9執行程式

  • 彈出試驗次數視窗

  • 回到x64dbg

  • F12暫停(P)

  • 注意標題,領空變成user32.dll

  • Alt + F9執行到使用者代碼(U)

  • 左下角由暫停變成執行

  • 回到試驗次數視窗

  • 點擊綠色的部分

  • 注意標題,領空變成VisualSite Designer.exe,並停在00489917 | 83F8 01 | cmp eax,1 |

  • 向上觀察

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    004898D1 | 84C0                  | test al,al                            |
    004898D3 | 0F84 FF000000 | je visualsite designer.4899D8 |
    004898D9 | 8A87 E0000000 | mov al,byte ptr ds:[edi+E0] |
    004898DF | 84C0 | test al,al |
    004898E1 | 0F85 42010000 | jne visualsite designer.489A29 |
    004898E7 | 8B87 E4000000 | mov eax,dword ptr ds:[edi+E4] |
    004898ED | 6A 00 | push 0 |
    004898EF | 85C0 | test eax,eax |
    004898F1 | 0F8E A1000000 | jle visualsite designer.489998 |
    004898F7 | 8D8C24 10020000 | lea ecx,dword ptr ss:[esp+210] |
    004898FE | E8 6D240200 | call visualsite designer.4ABD70 |
    00489903 | 8D8C24 0C020000 | lea ecx,dword ptr ss:[esp+20C] |
    0048990A | C68424 78870000 0B | mov byte ptr ss:[esp+8778],B | B:'\v'
    00489912 | E8 132B0300 | call <JMP.&Ordinal#2514> |
    00489917 | 83F8 01 | cmp eax,1 |
  • 00489912 | E8 132B0300 | call <JMP.&Ordinal#2514> |預期這邊是彈出試驗視窗的位址,將斷點設置在此

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 停在00489912 | E8 132B0300 | call <JMP.&Ordinal#2514> |

  • 並且沒有彈出試驗次數視窗

  • F8步過

  • 彈出試驗次數視窗

  • 在此可以確認,00489912 | E8 132B0300 | call <JMP.&Ordinal#2514> |為彈出試驗次數視窗位址


  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 停在00489912 | E8 132B0300 | call <JMP.&Ordinal#2514> |

  • 向上觀察

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    004898D1 | 84C0                  | test al,al                            |
    004898D3 | 0F84 FF000000 | je visualsite designer.4899D8 |
    004898D9 | 8A87 E0000000 | mov al,byte ptr ds:[edi+E0] |
    004898DF | 84C0 | test al,al |
    004898E1 | 0F85 42010000 | jne visualsite designer.489A29 |
    004898E7 | 8B87 E4000000 | mov eax,dword ptr ds:[edi+E4] |
    004898ED | 6A 00 | push 0 |
    004898EF | 85C0 | test eax,eax |
    004898F1 | 0F8E A1000000 | jle visualsite designer.489998 |
    004898F7 | 8D8C24 10020000 | lea ecx,dword ptr ss:[esp+210] |
    004898FE | E8 6D240200 | call visualsite designer.4ABD70 |
    00489903 | 8D8C24 0C020000 | lea ecx,dword ptr ss:[esp+20C] |
    0048990A | C68424 78870000 0B | mov byte ptr ss:[esp+8778],B | B:'\v'
    00489912 | E8 132B0300 | call <JMP.&Ordinal#2514> |
    00489917 | 83F8 01 | cmp eax,1 |
  • 發現三個跳轉指令分別為je visualsite designer.4899D8jne visualsite designer.489A29jle visualsite designer.489998,在這三個上面都設置中斷點

  • 移除其他的中斷點

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 停在004898D3 | 0F84 FF000000 | je visualsite designer.4899D8 |跳轉未實現

  • 修改ZF = 1跳轉已實現

  • F9執行程式

  • 發現程序被關閉

  • 在此可以假設004898D3 | 0F84 FF000000 | je visualsite designer.4899D8 |是跳轉到程序關閉


  • Ctrl + F2重新啟動(S)

  • 移除004898D3 | 0F84 FF000000 | je visualsite designer.4899D8 |中斷點

  • F9執行程式

  • 停在004898E1 | 0F85 42010000 | jne visualsite designer.489A29 |跳轉未實現

  • 修改ZF = 0跳轉已實現

  • F9執行程式

  • 主程式直接被開啟

  • 在此可以假設004898E1 | 0F85 42010000 | jne visualsite designer.489A29 |是跳轉到主程式直接開啟


  • Ctrl + F2重新啟動(S)

  • 移除004898E1 | 0F85 42010000 | jne visualsite designer.489A29 |中斷點

  • F9執行程式

  • 停在004898F1 | 0F8E A1000000 | jle visualsite designer.489998 |跳轉未實現

  • 修改ZF = 1跳轉已實現

  • F9執行程式

  • 彈出試用期到期視窗

  • 在此可以假設004898F1 | 0F8E A1000000 | jle visualsite designer.489998 |是跳轉彈出試用期過期的視窗


  • Ctrl + F2重新啟動(S)

  • 移除所有中斷點

  • F9執行程式

  • 彈出試驗次數視窗

  • 點擊綠色的部分

  • 主程式被開啟

  • 關閉主程式

  • 彈出廣告視窗

  • 回到x64dbg

  • F12暫停(P)

  • 注意標題,領空變成user32.dll

  • Alt + F9執行到使用者代碼(U)

  • 左下角由暫停變成執行

  • 回廣告視窗

  • 關閉廣告視窗

  • 注意標題,領空變成VisualSite Designer.exe,並停在00480C29 | 8D4C24 00 | lea ecx,dword ptr ss:[esp] |

  • 向上觀察

    1
    2
    3
    00480C1C | C74424 68 00000000    | mov dword ptr ss:[esp+68],0           |
    00480C24 | E8 01B80300 | call <JMP.&Ordinal#2514> |
    00480C29 | 8D4C24 00 | lea ecx,dword ptr ss:[esp] |
  • 00480C24 | E8 01B80300 | call <JMP.&Ordinal#2514> |預期這邊是彈出廣告視窗的位址,將斷點設置在此

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 彈出試驗次數視窗

  • 點擊綠色的部分

  • 主程式被開啟

  • 關閉主程式

  • 停在00480C24 | E8 01B80300 | call <JMP.&Ordinal#2514> |

  • 並且沒有彈出廣告視窗

  • F8步過

  • 彈出廣告視窗

  • 在此可以確認,00480C24 | E8 01B80300 | call <JMP.&Ordinal#2514> |為彈出廣告視窗位址


分析總結

  • 00489912 | E8 132B0300 | call <JMP.&Ordinal#2514> |為彈出試驗次數視窗位址
  • 004898D3 | 0F84 FF000000 | je visualsite designer.4899D8 |是跳轉到程序關閉
  • 004898E1 | 0F85 42010000 | jne visualsite designer.489A29 |是跳轉到主程式直接開啟
  • 004898F1 | 0F8E A1000000 | jle visualsite designer.489998 |是跳轉彈出試用期過期的視窗
  • 00480C24 | E8 01B80300 | call <JMP.&Ordinal#2514> |為彈出廣告視窗位址

修改思路

根據分析總結

  • 使用jmp直接跳轉實現到主程式直接開啟。
  • 將彈出廣告視窗位址用NOP做填充。

實際修改

  • 開啟VisualSite Designer.exe

  • 004898E1 | 0F85 42010000 | jne visualsite designer.489A29 |按下空白鍵

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

  • 修改後如下

    1
    2
    3
    4
    // 修改前
    004898E1 | 0F85 42010000 | jne visualsite designer.489A29 |
    // 修改後
    004898E1 | E9 43010000 | jmp visualsite designer.489A29 |
  • 00480C24 | E8 01B80300 | call <JMP.&Ordinal#2514> |右鍵選擇二進位->用 NOP 填充 (Ctrl + 9)

    1
    2
    3
    4
    5
    6
    7
    8
    // 修改前
    00480C24 | E8 01B80300 | call <JMP.&Ordinal#2514> |
    // 修改後
    00480C24 | 90 | nop |
    00480C25 | 90 | nop |
    00480C26 | 90 | nop |
    00480C27 | 90 | nop |
    00480C28 | 90 | nop |
  • 點擊修補程式 或是快捷鍵Ctrl + P

  • 點擊修補檔案(P)

  • 另存檔名VisualSite Designer.crack.exe

  • 恭喜補丁產生VisualSite Designer.crack.exe


實際驗證

  • 開啟VisualSite Designer.crack.exe
  • 直接開啟主程式,成功破解試用次數限制
  • 關閉主程式,成功移除廣告視窗

經驗分享

  • F8一步一步過,如果太多會按到很辛苦,可以使用Ctrl + F8自動步過。

  • 點擊修補程式發現沒有任何異動,無法點擊修補檔案(P),請把目標程式重新解壓縮一份新的,重新修改和重新產生補丁。

    註:會造成此問題,可能是因為在動態連結程式庫(DLL)裡面設定到軟件斷點造成的問題。


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