Like Share Discussion Bookmark Smile

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

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

前言

這篇延續上一篇x64dbg - 第二十八章 | 反匯編練習(十七),針對提供的輔助程式eXeScope.exe做暴力破解,這沒什麼技術含量,這邊將嘗試分析出註冊碼的算法。

目標程式

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


程式簡介

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


任務目標

  • 分析註冊碼算法

額外補充

  • div組合語言中除法指令
    • (1) 除數:有8位和16位兩種,在一個寄存器或內存單元中。
    • (2) 被除數:默認放在axdxax中,如果除數為8位,被除數則為16位,默認在ax中存放;如果除數為16 位,被除數則為32位,在dxax中存放,dx存放高16位,ax存放低16位。

搜尋思路

  • 使用搜尋字串找關鍵字

修改思路

  • 分析註冊碼算法

實際分析

  • 根據上一篇的分析

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

  • 開啟eXeScope.exe

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

  • 向上觀察

    1
    2
    3
    004C2ABF    | E8 B8940000              | call exescope.4CBF7C                           |
    004C2AC4 | 84C0 | test al,al |
    004C2AC6 | 0F84 8D000000 | je exescope.4C2B59 |
  • test al,al影響je的跳轉結果

  • call exescope.4CBF7C會異動al的值

  • 004C2ABF設定中斷點

  • 移除其他中斷點

  • F9執行程式

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

  • 彈出註冊視窗

  • 你的名字(N)輸入abcdefghijID輸入1234567890

  • 點擊確定

  • 斷點在004C2ABF | E8 B8940000 | call exescope.4CBF7C |

  • F7步入

  • 斷點在004CBF7C | 55 | push ebp |

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

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    004CBF7C    | 55                       | push ebp                                       |
    004CBF7D | 8BEC | mov ebp,esp |
    004CBF7F | 51 | push ecx |
    004CBF80 | 53 | push ebx |
    004CBF81 | 8955 FC | mov dword ptr ss:[ebp-4],edx | [ebp-4]:"abcdefghij"
    004CBF84 | 8B45 FC | mov eax,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
    004CBF87 | E8 B48EF3FF | call exescope.404E40 |
    004CBF8C | 33C0 | xor eax,eax | eax:"\\;L"
    004CBF8E | 55 | push ebp |
    004CBF8F | 68 1BC04C00 | push exescope.4CC01B |
    004CBF94 | 64:FF30 | push dword ptr fs:[eax] |
    004CBF97 | 64:8920 | mov dword ptr fs:[eax],esp |
    004CBF9A | 33DB | xor ebx,ebx |
    004CBF9C | 8B45 FC | mov eax,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
    004CBF9F | E8 AC8CF3FF | call exescope.404C50 |
    004CBFA4 | 83F8 0A | cmp eax,A | eax:"\\;L", A:'\n'
    004CBFA7 | 75 5C | jne exescope.4CC005 |
    004CBFA9 | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
    004CBFAC | B8 30C04C00 | mov eax,exescope.4CC030 | eax:"\\;L", 4CC030:"A1910"
    004CBFB1 | E8 DE8FF3FF | call exescope.404F94 |
    004CBFB6 | 48 | dec eax | eax:"\\;L"
    004CBFB7 | 74 10 | je exescope.4CBFC9 |
    004CBFB9 | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
    004CBFBC | B8 40C04C00 | mov eax,exescope.4CC040 | eax:"\\;L", 4CC040:"A1423"
    004CBFC1 | E8 CE8FF3FF | call exescope.404F94 |
    004CBFC6 | 48 | dec eax | eax:"\\;L"
    004CBFC7 | 75 3C | jne exescope.4CC005 |
    004CBFC9 | B8 02000000 | mov eax,2 | eax:"\\;L"
    004CBFCE | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
    004CBFD1 | 8A5402 FF | mov dl,byte ptr ds:[edx+eax-1] |
    004CBFD5 | 80FA 30 | cmp dl,30 | 30:'0'
    004CBFD8 | 72 2B | jb exescope.4CC005 |
    004CBFDA | 80FA 39 | cmp dl,39 | 39:'9'
    004CBFDD | 77 26 | ja exescope.4CC005 |
    004CBFDF | 40 | inc eax | eax:"\\;L"
    004CBFE0 | 83F8 0B | cmp eax,B | eax:"\\;L", B:'\v'
    004CBFE3 | 75 E9 | jne exescope.4CBFCE |
    004CBFE5 | 8B45 FC | mov eax,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
    004CBFE8 | 0FB640 08 | movzx eax,byte ptr ds:[eax+8] | eax:"\\;L", eax+8:&"FMain"
    004CBFEC | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
    004CBFEF | 0FB652 09 | movzx edx,byte ptr ds:[edx+9] | edx:"1234567890", edx+9:"0"34567890"
    004CBFF3 | 03C2 | add eax,edx | eax:"\\;L", edx:"1234567890"
    004CBFF5 | B9 0A000000 | mov ecx,A | A:'\n'
    004CBFFA | 33D2 | xor edx,edx | edx:"1234567890"
    004CBFFC | F7F1 | div ecx |
    004CBFFE | 83FA 04 | cmp edx,4 | edx:"1234567890"
    004CC001 | 75 02 | jne exescope.4CC005 |
    004CC003 | B3 01 | mov bl,1 |
    004CC005 | 33C0 | xor eax,eax | eax:"\\;L"
    004CC007 | 5A | pop edx | edx:"1234567890"
    004CC008 | 59 | pop ecx |
    004CC009 | 59 | pop ecx |
    004CC00A | 64:8910 | mov dword ptr fs:[eax],edx | edx:"1234567890"
    004CC00D | 68 22C04C00 | push exescope.4CC022 |
    004CC012 | 8D45 FC | lea eax,dword ptr ss:[ebp-4] | [ebp-4]:"abcdefghij"
    004CC015 | E8 7689F3FF | call exescope.404990 |
    004CC01A | C3 | ret |
    004CC01B | E9 5483F3FF | jmp exescope.404374 |
    004CC020 | EB F0 | jmp exescope.4CC012 |
    004CC022 | 8BC3 | mov eax,ebx | eax:"\\;L"
    004CC024 | 5B | pop ebx |
    004CC025 | 59 | pop ecx |
    004CC026 | 5D | pop ebp |
    004CC027 | C3 | ret |
  • 第一個條件,ID長度必須10位

    1
    `004CBFA4    | 83F8 0A                  | cmp eax,A                                      | A:'\n'`
  • 第二個條件,開頭必須為A1910A1423

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    004CBFA9    | 8B55 FC                  | mov edx,dword ptr ss:[ebp-4]                   | [ebp-4]:"1234567890"
    004CBFAC | B8 30C04C00 | mov eax,exescope.4CC030 | 4CC030:"A1910"
    004CBFB1 | E8 DE8FF3FF | call exescope.404F94 |
    004CBFB6 | 48 | dec eax |
    004CBFB7 | 74 10 | je exescope.4CBFC9 |
    004CBFB9 | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"1234567890"
    004CBFBC | B8 40C04C00 | mov eax,exescope.4CC040 | 4CC040:"A1423"
    004CBFC1 | E8 CE8FF3FF | call exescope.404F94 |
    004CBFC6 | 48 | dec eax |
    004CBFC7 | 75 3C | jne exescope.4CC005 |
  • 第三個條件,判斷ID的第三位至第十位,是否在0~9之間

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    004CBFC9    | B8 02000000              | mov eax,2                                      |
    004CBFCE | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"1234567890"
    004CBFD1 | 8A5402 FF | mov dl,byte ptr ds:[edx+eax-1] |
    004CBFD5 | 80FA 30 | cmp dl,30 | 30:'0'
    004CBFD8 | 72 2B | jb exescope.4CC005 |
    004CBFDA | 80FA 39 | cmp dl,39 | 39:'9'
    004CBFDD | 77 26 | ja exescope.4CC005 |
    004CBFDF | 40 | inc eax |
    004CBFE0 | 83F8 0B | cmp eax,B | B:'\v'
    004CBFE3 | 75 E9 | jne exescope.4CBFCE |
  • 第四個動作,將第九位存入eax暫存器,第十位存入edx暫存器

    1
    2
    3
    4
    004CBFE5    | 8B45 FC                  | mov eax,dword ptr ss:[ebp-4]                   | [ebp-4]:"1234567890"
    004CBFE8 | 0FB640 08 | movzx eax,byte ptr ds:[eax+8] |
    004CBFEC | 8B55 FC | mov edx,dword ptr ss:[ebp-4] | [ebp-4]:"1234567890"
    004CBFEF | 0FB652 09 | movzx edx,byte ptr ds:[edx+9] |
  • 第五個動作,使用備註說明

    1
    2
    3
    4
    004CBFF3    | 03C2                     | add eax,edx                                    | EAX = EAX + EDX
    004CBFF5 | B9 0A000000 | mov ecx,A | ECX = 0xA
    004CBFFA | 33D2 | xor edx,edx | EDX = 0
    004CBFFC | F7F1 | div ecx | EDX = EAX % ECX
  • 第六個條件,當EDX = 0x4時,將bl變為1

    1
    2
    3
    4
    004CBFFE    | 83FA 04                  | cmp edx,4                                      |
    004CC001 | 75 02 | jne exescope.4CC005 |
    004CC003 | B3 01 | mov bl,1 |
    004CC005 | 33C0 | xor eax,eax |
  • al = 0x1時,跳轉不成立,說明註冊碼正確

  • 總結分析結果

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    (1) ID必須10
    (2) 前5位開頭必須為A1910或A1423
    (3) 第6~8位,只需要在0~9之間的數字
    (4) 第9~10位,邏輯如下:

    當第9位等於7,第10位等於1
    ASCII碼分別是:0x370x31

    EAX = 0x37
    EDX = 0x31
    EAX = EAX + EDX = 0x68
    ECX = 0xA
    EDX = 0

    當EDX = EAX % ECX = 0x68 % 0xA = 0x4即成立

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