Like Share Discussion Bookmark Smile

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

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

目標程式

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


程式簡介

PC Surgeon是診斷和修復Windows平台所需的強大工具。超過65種特性和功能,使你能夠診斷,監控和修復你的系統。


前置作業

下載目標程式並解壓縮,pcsurgeon.exe右鍵選擇內容->相容性->勾選以相容模式執行這個程式->選擇Windows XP (Service Pack 3)->勾選以系統管理員的身份執行此程式

註:因為軟體老舊,所以用Windows XP來執行,方可正常開啟。


任務目標

  • 移除提示購買視窗(Nag)。
  • 移除驗證試用天數判斷。

分析程式

  • 開啟pcsurgeon.exe

  • 彈出視窗,下方顯示Cannot retrieve IP Info (無法檢索IP訊息)

    註:這個可能是因為Win7環境或是因為虛擬環境造成該軟體無法抓取IP的資訊,可以忽略。

  • 按下OK

  • 彈出視窗Register for only $20.00usd. You have 5 days remaining in your evaluation. (註冊只需$ 20.00usd。 你還有5天的試用時間。)

  • 稍待片刻視窗會被關閉,並開啟主程式

  • 注意到主程式標題PC Surgeon <unregistered - 5 days remaining..> (PC外科醫生<未註冊 - 剩餘5天..)
  • 點擊Help->About
  • 看到<Unregistered Version> (<未註冊版本>)

  • 點擊Use Reg Key
  • 會要求輸入First NameLast NameRegistration Key來做註冊

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


額外補充

  • leamov的差異

    • lea傳遞變數位置
    • mov傳遞變數數值
  • fld st(0),dword ptr ds:[5CCA3C]

    • 5CCA3C的四個位元組浮點數值,存入st(0)
  • fsub st(0),qword ptr ds:[eax]

    • st(0)浮點數值 減去 eax的八個位元組浮點數值

搜尋思路

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

    註:unregistered個跟About中的<Unregistered Version>


修改思路

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

實際分析

  • 開啟pcsurgeon.exe

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

  • 搜尋輸入unregistered

  • 發現PC Surgeon <unregistered -,對其設定中斷點

  • F9執行程式

  • 彈出視窗,下方顯示Cannot retrieve IP Info (無法檢索IP訊息)

    註:該視窗就是忽略按下OK即可

  • 斷點005CC83C | 68 70CB5C00 | push pcsurgeon.5CCB70 | 5CCB70:"PC Surgeon <unregistered - "

  • F8一步一步過

  • 步過到下方指令時

    1
    005CC894 | FF92 EC000000         | call dword ptr ds:[edx+EC]            |
  • 彈出視窗Register for only $20.00usd. You have 5 days remaining in your evaluation. (註冊只需$ 20.00usd。 你還有5天的試用時間。)

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

  • 向上觀察會跳轉實現會跳過彈出訊息視窗的指令

    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
    005CC820 | A1 8CEB6000           | mov eax,dword ptr ds:[60EB8C]         |
    005CC825 | 8038 00 | cmp byte ptr ds:[eax],0 |
    005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |
    005CC82E | A1 DCF16000 | mov eax,dword ptr ds:[60F1DC] |
    005CC833 | 8038 00 | cmp byte ptr ds:[eax],0 |
    005CC836 | 0F85 F9000000 | jne pcsurgeon.5CC935 |
    005CC83C | 68 70CB5C00 | push pcsurgeon.5CCB70 | 5CCB70:"PC Surgeon <unregistered - "
    005CC841 | D905 3CCA5C00 | fld st(0),dword ptr ds:[5CCA3C] |
    005CC847 | A1 8CEC6000 | mov eax,dword ptr ds:[60EC8C] |
    005CC84C | DC20 | fsub st(0),qword ptr ds:[eax] |
    005CC84E | 83C4 F4 | add esp,FFFFFFF4 |
    005CC851 | DB3C24 | fstp tword ptr ss:[esp],st(0) |
    005CC854 | 9B | fwait |
    005CC855 | 8D55 E4 | lea edx,dword ptr ss:[ebp-1C] | [ebp-1C]:L"5"
    005CC858 | B8 94CB5C00 | mov eax,pcsurgeon.5CCB94 | 5CCB94:L"0"
    005CC85D | E8 42FAE3FF | call pcsurgeon.40C2A4 |
    005CC862 | FF75 E4 | push dword ptr ss:[ebp-1C] | [ebp-1C]:L"5"
    005CC865 | 68 A0CB5C00 | push pcsurgeon.5CCBA0 | 5CCBA0:" days remaining..>"
    005CC86A | 8D45 E8 | lea eax,dword ptr ss:[ebp-18] | [ebp-18]:"PC Surgeon <unregistered - 5 days remaining..>"
    005CC86D | BA 03000000 | mov edx,3 |
    005CC872 | E8 A98AE3FF | call pcsurgeon.405320 |
    005CC877 | 8B55 E8 | mov edx,dword ptr ss:[ebp-18] | [ebp-18]:"PC Surgeon <unregistered - 5 days remaining..>"
    005CC87A | 8B45 FC | mov eax,dword ptr ss:[ebp-4] |
    005CC87D | E8 22D5EAFF | call pcsurgeon.479DA4 |
    005CC882 | 8B45 FC | mov eax,dword ptr ss:[ebp-4] |
    005CC885 | 8B80 20120000 | mov eax,dword ptr ds:[eax+1220] |
    005CC88B | C680 20030000 01 | mov byte ptr ds:[eax+320],1 |
    005CC892 | 8B10 | mov edx,dword ptr ds:[eax] |
    005CC894 | FF92 EC000000 | call dword ptr ds:[edx+EC] |
  • 005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |005CC836 | 0F85 F9000000 | jne pcsurgeon.5CC935 |會跳轉過彈出Nag

  • 005CC828005CC836設定中斷點,並移除其他中斷點

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 斷點在005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |跳轉未實現

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

  • F9執行程式

  • 主程式直接開啟,標體無試用版的標示

  • 在此可以確認5CC935位址為開啟主程式


  • 移除005CC828中斷點

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 斷點在005CC836 | 0F85 F9000000 | jne pcsurgeon.5CC935 |跳轉未實現

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

  • F9執行程式

  • 主程式直接開啟,標體無試用版的標示

  • 在此可以確認再次5CC935位址為開啟主程式


  • 移除所有中斷點

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

  • 搜尋輸入unregistered

  • 發現<Unregistered Version>,對其設定中斷點

  • F9執行程式

  • 開啟主程式點擊Help->About

  • 斷點0056247B | BA B8265600 | mov edx,pcsurgeon.5626B8 | 5626B8:"<Unregistered Version>"

  • 向上觀察會跳轉實現會跳過<Unregistered Version>訊息準備的指令

    1
    2
    3
    4
    5
    6
    7
    8
    0056245E | A1 8CEB6000           | mov eax,dword ptr ds:[60EB8C]         | eax:"擊C"
    00562463 | 8038 00 | cmp byte ptr ds:[eax],0 | eax:"擊C"
    00562466 | 75 22 | jne pcsurgeon.56248A |
    00562468 | 8B83 08030000 | mov eax,dword ptr ds:[ebx+308] | eax:"擊C"
    0056246E | B2 01 | mov dl,1 |
    00562470 | E8 1F78F1FF | call pcsurgeon.479C94 |
    00562475 | 8B83 24030000 | mov eax,dword ptr ds:[ebx+324] | eax:"擊C", [ebx+324]:"擊C"
    0056247B | BA B8265600 | mov edx,pcsurgeon.5626B8 | 5626B8:"<Unregistered Version>"
  • 00562466 | 75 22 | jne pcsurgeon.56248A |會跳過訊息準備的指令

  • 00562466設定中斷點,並移除其他中斷點

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 開啟主程式點擊Help->About

  • 斷點在00562466 | 75 22 | jne pcsurgeon.56248A |跳轉未實現

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

  • F9執行程式

  • About視窗開啟,顯示Licensed Version. Do Not Copy! (許可版本。 不要抄襲!)

  • 在此可以確認00562466位址跳過試用版訊息準備


分析總結

  • 005CC828005CC836位址判斷是否為註冊版,決定是否要跳轉005CC935位址開啟主程式
  • 00562466位址跳過試用版訊息準備

修改思路

根據分析總結

  • 使用jmp直接跳轉實現到主程式直接開啟。
  • 使用jmp直接跳轉實現過About訊息準備。

實際修改

  • 開啟pcsurgeon.exe

  • 005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |按下空白鍵

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

  • 修改後如下

    1
    2
    3
    4
    // 修改前
    005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |
    // 修改後
    005CC828 | E9 08010000 | jmp pcsurgeon.5CC935 |
  • 00562466 | 75 22 | jne pcsurgeon.56248A |按下空白鍵

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

  • 修改後如下

    1
    2
    3
    4
    // 修改前
    00562466 | 75 22 | jne pcsurgeon.56248A |
    // 修改後
    00562466 | EB 22 | jmp pcsurgeon.56248A |
  • 點擊修補程式 或是快捷鍵Ctrl + P

  • 點擊修補檔案(P)

  • 另存檔名pcsurgeon.crack.exe

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

註:開啟新的補丁.exe不要忘記設定相容性和管理員執行。


實際驗證

  • 開啟pcsurgeon.crack.exe
  • 直接開啟主程式,標題無試用天數,成功破解
  • 開啟About,顯示Licensed Version. Do Not Copy! (許可版本。 不要抄襲!),成功破解

額外分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 跳轉`Nag`部分指令
005CC820 | A1 8CEB6000 | mov eax,dword ptr ds:[60EB8C] |
005CC825 | 8038 00 | cmp byte ptr ds:[eax],0 |
005CC828 | 0F85 07010000 | jne pcsurgeon.5CC935 |
005CC82E | A1 DCF16000 | mov eax,dword ptr ds:[60F1DC] |
005CC833 | 8038 00 | cmp byte ptr ds:[eax],0 |
005CC836 | 0F85 F9000000 | jne pcsurgeon.5CC935 |
005CC83C | 68 70CB5C00 | push pcsurgeon.5CCB70 | 5CCB70:"PC Surgeon

// 準備`About`訊息部分指令
0056245E | A1 8CEB6000 | mov eax,dword ptr ds:[60EB8C] | eax:"擊C"
00562463 | 8038 00 | cmp byte ptr ds:[eax],0 | eax:"擊C"
00562466 | 75 22 | jne pcsurgeon.56248A |
00562468 | 8B83 08030000 | mov eax,dword ptr ds:[ebx+308] | eax:"擊C"
0056246E | B2 01 | mov dl,1 |
00562470 | E8 1F78F1FF | call pcsurgeon.479C94 |
00562475 | 8B83 24030000 | mov eax,dword ptr ds:[ebx+324] | eax:"擊C", [ebx+324]:"擊C"
0056247B | BA B8265600 | mov edx,pcsurgeon.5626B8 | 5626B8:"<Unregistered Version>"
  • 可見cmp關鍵的eax值都是由0060EB8C位址取得

  • 條件為eax=0為試用版

  • 005CC820 | A1 8CEB6000 | mov eax,dword ptr ds:[60EB8C] |右鍵選擇尋找參考(R)->位址: 60EB8C

  • 可見以下位址參考

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    位址       反組譯                          
    0050B6F4 mov eax,dword ptr ds:[60EB8C]
    0056245E mov eax,dword ptr ds:[60EB8C]
    005B44B3 mov eax,dword ptr ds:[60EB8C]
    005C2BF6 mov edx,dword ptr ds:[60EB8C]
    005C2BFE mov eax,dword ptr ds:[60EB8C]
    005C2E68 mov edx,dword ptr ds:[60EB8C]
    005CC748 mov eax,dword ptr ds:[60EB8C]
    005CC7D6 mov eax,dword ptr ds:[60EB8C]
    005CC820 mov eax,dword ptr ds:[60EB8C]
    005CCC49 mov eax,dword ptr ds:[60EB8C]
    005CCCCB mov eax,dword ptr ds:[60EB8C]
  • 右鍵選擇Set breakpoint on all commands (在所有命令上設置斷點)

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 斷點005C2BF6 | 8B15 8CEB6000 | mov edx,dword ptr ds:[60EB8C] |

  • 向下觀察

    1
    2
    3
    4
    005C2BF6 | 8B15 8CEB6000         | mov edx,dword ptr ds:[60EB8C]            |
    005C2BFC | 8802 | mov byte ptr ds:[edx],al |
    005C2BFE | A1 8CEB6000 | mov eax,dword ptr ds:[60EB8C] |
    005C2C03 | 8038 00 | cmp byte ptr ds:[eax],0 |
  • mov byte ptr ds:[edx],al在賦值

  • cmp byte ptr ds:[eax],0判斷

  • 兩個皆嘗試

  • 第一個嘗試

    1
    2
    3
    4
    5
    6
    7
    8
    // 修改前
    005C2BFC | 8802 | mov byte ptr ds:[edx],al |
    // 修改後
    005C2BFC | C602 01 | mov byte ptr ds:[edx],1 |
    005C2BFF | 90 | nop |
    005C2C00 | 90 | nop |
    005C2C01 | 90 | nop |
    005C2C02 | 90 | nop |
  • 移除所有斷點

  • Ctrl + F2重新啟動(S)

  • F9執行程式

  • 直接開啟主程式,標題無試用天數,成功破解

  • 開啟About,顯示Licensed Version. Do Not Copy! (許可版本。 不要抄襲!),成功破解


  • 第二個嘗試
    1
    2
    3
    4
    // 修改前
    005C2C03 | 8038 00 | cmp byte ptr ds:[eax],0 |
    // 修改後
    005C2C03 | 8038 01 | cmp byte ptr ds:[eax],1 |
  • Ctrl + F2重新啟動(S)
  • F9執行程式
  • 彈出視窗Register for only $20.00usd. You have 15 days remaining in your evaluation. (註冊只需$ 20.00usd。 你還有15天的試用時間。)
  • 主程式,標題試用天數15天
  • 開啟About,顯示<Unregistered Version> (<未註冊版本>)

額外修改

  • 開啟pcsurgeon.exe

  • 005C2BFC | 8802 | mov byte ptr ds:[edx],al |按下空白鍵

  • 將指令修改為mov byte ptr ds:[edx], 0x1,按下確定

    註:記得勾選使用 NOPs 填充(F)

  • 修改後如下
    // 修改前
    005C2BFC | 8802 | mov byte ptr ds:[edx],al |
    // 修改後
    005C2BFC | C602 01 | mov byte ptr ds:[edx],1 |
    005C2BFF | 90 | nop |
    005C2C00 | 90 | nop |
    005C2C01 | 90 | nop |
    005C2C02 | 90 | nop |

  • 點擊修補程式 或是快捷鍵Ctrl + P

  • 點擊修補檔案(P)

    註:這邊會有需要重定位的問題,點擊Yes即可

  • 另存檔名pcsurgeon.crack.exe

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

註:開啟新的補丁.exe不要忘記設定相容性和管理員執行。


註:以上參考了
x64dbg
x64dbg’s documentation!
CSDN billvsme的专栏OllyDbg 使用笔记 (七)
知乎汇编语言–x86汇编指令集大全