1. 程式人生 > >160個破解練習之CrackMe 006

160個破解練習之CrackMe 006

直接進入正題,有了前面幾個分析Delphi程式的基礎,再分析這個程式就不會沒有頭緒了,首先開啟程式介面如下:


程式比較簡單,兩個輸入框,三個按鈕,其中一個按鈕禁用,其中一個按鈕有提示如下資訊:


      這個1.0版本的軟體的目的是使 “ ok ” 和 ” Cancella “ 這兩個按鈕不可見,以便可以看到Ringzer0的 logo,所以你必須填入正確的程式碼。

如果按鈕不能變得不可見,就不能完成對這個軟體的破解。

由於是Delphi程式,那麼就直接開啟Dark工具分析:


有幾個關鍵的事件:密碼框內容改變、使用者名稱框內容改變、ok按鈕單擊、Cancella按鈕單擊

先來看使用者名稱框內容改變事件:

00442E04  /.  55            push ebp                                 ;  使用者名稱改變函式
00442E05  |.  8BEC          mov ebp,esp
00442E07  |.  6A 00         push 0x0
00442E09  |.  6A 00         push 0x0
00442E0B  |.  53            push ebx
00442E0C  |.  8BD8          mov ebx,eax
00442E0E  |.  33C0          xor eax,eax
00442E10  |.  55            push ebp
00442E11  |.  68 9B2E4400   push aLoNg3x_.00442E9B
00442E16  |.  64:FF30       push dword ptr fs:[eax]
00442E19  |.  64:8920       mov dword ptr fs:[eax],esp
00442E1C  |.  8B83 D0020000 mov eax,dword ptr ds:[ebx+0x2D0]
00442E22  |.  8078 47 00    cmp byte ptr ds:[eax+0x47],0x0           ;  右邊按鈕是否隱藏,0為隱
00442E26  |.  75 0F         jnz short aLoNg3x_.00442E37
00442E28  |.  B2 01         mov dl,0x1
00442E2A  |.  8B83 CC020000 mov eax,dword ptr ds:[ebx+0x2CC]         ;  ok按鈕的ID
00442E30  |.  8B08          mov ecx,dword ptr ds:[eax]               ;  aLoNg3x_.0044282C
00442E32  |.  FF51 60       call dword ptr ds:[ecx+0x60]             ;  啟用按鈕
00442E35  |.  EB 49         jmp short aLoNg3x_.00442E80              ;  若隱藏了,直接啟用左邊按鈕就返回
00442E37  |>  8D55 FC       lea edx,[local.1]
00442E3A  |.  8B83 E0020000 mov eax,dword ptr ds:[ebx+0x2E0]
00442E40  |.  E8 7B04FEFF   call aLoNg3x_.004232C0
00442E45  |.  8B45 FC       mov eax,[local.1]
00442E48  |.  50            push eax
00442E49  |.  8D55 F8       lea edx,[local.2]
00442E4C  |.  8B83 DC020000 mov eax,dword ptr ds:[ebx+0x2DC]
00442E52  |.  E8 6904FEFF   call aLoNg3x_.004232C0
00442E57  |.  8B45 F8       mov eax,[local.2]                        ;  輸入的使用者名稱
00442E5A  |.  5A            pop edx                                  ;  aLoNg3x_.0041E13E
00442E5B  |.  E8 DCFBFFFF   call aLoNg3x_.00442A3C                   ;  關鍵call,使用者名稱密碼匹配比較
00442E60  |.  84C0          test al,al
00442E62  |.  74 0F         je short aLoNg3x_.00442E73               ;  關鍵跳,匹配就啟用,否則禁用
00442E64  |.  B2 01         mov dl,0x1
00442E66  |.  8B83 CC020000 mov eax,dword ptr ds:[ebx+0x2CC]
00442E6C  |.  8B08          mov ecx,dword ptr ds:[eax]               ;  aLoNg3x_.0044282C
00442E6E  |.  FF51 60       call dword ptr ds:[ecx+0x60]             ;  啟用按鈕
00442E71  |.  EB 0D         jmp short aLoNg3x_.00442E80
00442E73  |>  33D2          xor edx,edx
00442E75  |.  8B83 CC020000 mov eax,dword ptr ds:[ebx+0x2CC]         ;  按鈕ID
00442E7B  |.  8B08          mov ecx,dword ptr ds:[eax]               ;  aLoNg3x_.0044282C
00442E7D  |.  FF51 60       call dword ptr ds:[ecx+0x60]             ;  禁用按鈕
00442E80  |>  33C0          xor eax,eax
00442E82  |.  5A            pop edx                                  ;  aLoNg3x_.0041E13E
00442E83  |.  59            pop ecx                                  ;  aLoNg3x_.0041E13E
00442E84  |.  59            pop ecx                                  ;  aLoNg3x_.0041E13E
00442E85  |.  64:8910       mov dword ptr fs:[eax],edx
00442E88  |.  68 A22E4400   push aLoNg3x_.00442EA2
00442E8D  |>  8D45 F8       lea eax,[local.2]
00442E90  |.  BA 02000000   mov edx,0x2
00442E95  |.  E8 4209FCFF   call aLoNg3x_.004037DC
00442E9A  \.  C3            retn
00442E9B   .^ E9 D803FCFF   jmp aLoNg3x_.00403278
00442EA0   .^ EB EB         jmp short aLoNg3x_.00442E8D
00442EA2   .  5B            pop ebx                                  ;  aLoNg3x_.0041E13E
00442EA3   .  59            pop ecx                                  ;  aLoNg3x_.0041E13E
00442EA4   .  59            pop ecx                                  ;  aLoNg3x_.0041E13E
00442EA5   .  5D            pop ebp                                  ;  aLoNg3x_.0041E13E
00442EA6   .  C3            retn


        程式碼中給出了詳細的注視,首先判斷Cancella按鈕是否是隱藏的(不要問怎麼知道的,根據前面幾個的Delphi軟體的分析得知的),如果是就將ok按鈕啟用並返回,否則判斷了輸入的使用者名稱和密碼是否匹配(關鍵call裡),如果匹配就啟用按鈕,否則禁用按鈕,關鍵call裡的程式碼如下:
00442A3C  /$  55            push ebp                                 ;  關鍵call,兩個事件都是使用的同一個
00442A3D  |.  8BEC          mov ebp,esp
00442A3F  |.  83C4 F8       add esp,-0x8
00442A42  |.  53            push ebx
00442A43  |.  56            push esi
00442A44  |.  8955 F8       mov [local.2],edx
00442A47  |.  8945 FC       mov [local.1],eax
00442A4A  |.  8B45 FC       mov eax,[local.1]
00442A4D  |.  E8 9611FCFF   call aLoNg3x_.00403BE8
00442A52  |.  8B45 F8       mov eax,[local.2]                        ;  密碼
00442A55  |.  E8 8E11FCFF   call aLoNg3x_.00403BE8
00442A5A  |.  33C0          xor eax,eax
00442A5C  |.  55            push ebp
00442A5D  |.  68 E52A4400   push aLoNg3x_.00442AE5
00442A62  |.  64:FF30       push dword ptr fs:[eax]
00442A65  |.  64:8920       mov dword ptr fs:[eax],esp
00442A68  |.  8B45 FC       mov eax,[local.1]                        ;  使用者名稱
00442A6B  |.  E8 C40FFCFF   call aLoNg3x_.00403A34                   ;  使用者名稱長度
00442A70  |.  83F8 05       cmp eax,0x5                              ;  應該要大於5
00442A73  |.  7E 53         jle short aLoNg3x_.00442AC8
00442A75  |.  8B45 FC       mov eax,[local.1]                        ;  使用者名稱
00442A78  |.  E8 B70FFCFF   call aLoNg3x_.00403A34                   ;  長度
00442A7D  |.  8BD8          mov ebx,eax                              ;  長度
00442A7F  |.  8B45 FC       mov eax,[local.1]                        ;  使用者名稱
00442A82  |.  E8 AD0FFCFF   call aLoNg3x_.00403A34                   ;  長度
00442A87  |.  8BD0          mov edx,eax                              ;  長度
00442A89  |.  4A            dec edx
00442A8A  |.  85D2          test edx,edx                             ;  長度大於1
00442A8C  |.  7E 20         jle short aLoNg3x_.00442AAE
00442A8E  |.  B8 01000000   mov eax,0x1                              ;  eax=1
00442A93  |>  8B4D FC       /mov ecx,[local.1]                       ;  使用者名稱
00442A96  |.  0FB64C01 FF   |movzx ecx,byte ptr ds:[ecx+eax-0x1]
00442A9B  |.  8B75 FC       |mov esi,[local.1]                       ;  使用者名稱
00442A9E  |.  0FB63406      |movzx esi,byte ptr ds:[esi+eax]
00442AA2  |.  0FAFCE        |imul ecx,esi
00442AA5  |.  0FAFC8        |imul ecx,eax
00442AA8  |.  03D9          |add ebx,ecx                             ;  user32.767A78F4
00442AAA  |.  40            |inc eax
00442AAB  |.  4A            |dec edx
00442AAC  |.^ 75 E5         \jnz short aLoNg3x_.00442A93
00442AAE  |>  8B45 F8       mov eax,[local.2]                        ;  密碼
00442AB1  |.  E8 BA4BFCFF   call aLoNg3x_.00407670                   ;  關鍵計算  --密碼字串轉十六進位制
00442AB6  |.  2BD8          sub ebx,eax
00442AB8  |.  81FB 9A020000 cmp ebx,0x29A                            ;  這個要相等
00442ABE  |.  75 04         jnz short aLoNg3x_.00442AC4
00442AC0  |.  B3 01         mov bl,0x1
00442AC2  |.  EB 06         jmp short aLoNg3x_.00442ACA              ;  這個要執行
00442AC4  |>  33DB          xor ebx,ebx                              ;  這個也不能執行
00442AC6  |.  EB 02         jmp short aLoNg3x_.00442ACA
00442AC8  |>  33DB          xor ebx,ebx                              ;  這個不能執行
00442ACA  |>  33C0          xor eax,eax
00442ACC  |.  5A            pop edx                                  ;  aLoNg3x_.00442E60
00442ACD  |.  59            pop ecx                                  ;  aLoNg3x_.00442E60
00442ACE  |.  59            pop ecx                                  ;  aLoNg3x_.00442E60
00442ACF  |.  64:8910       mov dword ptr fs:[eax],edx
00442AD2  |.  68 EC2A4400   push aLoNg3x_.00442AEC
00442AD7  |>  8D45 F8       lea eax,[local.2]
00442ADA  |.  BA 02000000   mov edx,0x2
00442ADF  |.  E8 F80CFCFF   call aLoNg3x_.004037DC
00442AE4  \.  C3            retn
00442AE5   .^ E9 8E07FCFF   jmp aLoNg3x_.00403278
00442AEA   .^ EB EB         jmp short aLoNg3x_.00442AD7
00442AEC   .  8BC3          mov eax,ebx                              ;  要保證ebx不為0
00442AEE   .  5E            pop esi                                  ;  aLoNg3x_.00442E60
00442AEF   .  5B            pop ebx                                  ;  aLoNg3x_.00442E60
00442AF0   .  59            pop ecx                                  ;  aLoNg3x_.00442E60
00442AF1   .  59            pop ecx                                  ;  aLoNg3x_.00442E60
00442AF2   .  5D            pop ebp                                  ;  aLoNg3x_.00442E60
00442AF3   .  C3            retn

         關鍵call中判斷了使用者名稱的長度要大於5,然後根據下面的一套規則計算出一個值儲存在ebx中,然後ebx-密碼=0x29A就可以正常啟用ok按鈕。這個計算規則看上面的程式碼就好(如使用者名稱:221111,密碼35552)。        密碼框文字改變的函式和使用者名稱框文字改變函式的內容和判斷條件一樣,這裡就不再複述。

接下來看右邊的按鈕單擊事件,程式碼如下:

00442EA8  /.  55            push ebp                                 ;  右邊按鈕單擊
00442EA9  |.  8BEC          mov ebp,esp
00442EAB  |.  6A 00         push 0x0
00442EAD  |.  53            push ebx
00442EAE  |.  8BD8          mov ebx,eax
00442EB0  |.  33C0          xor eax,eax
00442EB2  |.  55            push ebp
00442EB3  |.  68 322F4400   push aLoNg3x_.00442F32
00442EB8  |.  64:FF30       push dword ptr fs:[eax]
00442EBB  |.  64:8920       mov dword ptr fs:[eax],esp
00442EBE  |.  8D55 FC       lea edx,[local.1]
00442EC1  |.  8B83 E0020000 mov eax,dword ptr ds:[ebx+0x2E0]
00442EC7  |.  E8 F403FEFF   call aLoNg3x_.004232C0                   ;  密碼長度
00442ECC  |.  8B45 FC       mov eax,[local.1]                        ;  密碼
00442ECF  |.  E8 9C47FCFF   call aLoNg3x_.00407670
00442ED4  |.  50            push eax
00442ED5  |.  8D55 FC       lea edx,[local.1]
00442ED8  |.  8B83 DC020000 mov eax,dword ptr ds:[ebx+0x2DC]
00442EDE  |.  E8 DD03FEFF   call aLoNg3x_.004232C0
00442EE3  |.  8B45 FC       mov eax,[local.1]                        ;  使用者名稱
00442EE6  |.  5A            pop edx                                  ;  aLoNg3x_.00424640
00442EE7  |.  E8 08FCFFFF   call aLoNg3x_.00442AF4                   ;  關鍵call 使用者名稱 密碼匹配檢測
00442EEC  |.  84C0          test al,al
00442EEE  |.  74 1C         je short aLoNg3x_.00442F0C               ;  不能跳
00442EF0  |.  33D2          xor edx,edx
00442EF2  |.  8B83 D0020000 mov eax,dword ptr ds:[ebx+0x2D0]         ;  右邊按鈕ID
00442EF8  |.  E8 B302FEFF   call aLoNg3x_.004231B0                      隱藏
00442EFD  |.  B2 01         mov dl,0x1
00442EFF  |.  8B83 CC020000 mov eax,dword ptr ds:[ebx+0x2CC]         ;  左邊按鈕ID
00442F05  |.  8B08          mov ecx,dword ptr ds:[eax]               ;  aLoNg3x_.0044282C
00442F07  |.  FF51 60       call dword ptr ds:[ecx+0x60]             ;  啟用
00442F0A  |.  EB 10         jmp short aLoNg3x_.00442F1C
00442F0C  |>  BA 482F4400   mov edx,aLoNg3x_.00442F48                ;  0
00442F11  |.  8B83 E0020000 mov eax,dword ptr ds:[ebx+0x2E0]
00442F17  |.  E8 D403FEFF   call aLoNg3x_.004232F0
00442F1C  |>  33C0          xor eax,eax
00442F1E  |.  5A            pop edx                                  ;  aLoNg3x_.00424640
00442F1F  |.  59            pop ecx                                  ;  aLoNg3x_.00424640
00442F20  |.  59            pop ecx                                  ;  aLoNg3x_.00424640
00442F21  |.  64:8910       mov dword ptr fs:[eax],edx
00442F24  |.  68 392F4400   push aLoNg3x_.00442F39
00442F29  |>  8D45 FC       lea eax,[local.1]
00442F2C  |.  E8 8708FCFF   call aLoNg3x_.004037B8
00442F31  \.  C3            retn
00442F32   .^ E9 4103FCFF   jmp aLoNg3x_.00403278
00442F37   .^ EB F0         jmp short aLoNg3x_.00442F29
00442F39   .  5B            pop ebx                                  ;  aLoNg3x_.00424640
00442F3A   .  59            pop ecx                                  ;  aLoNg3x_.00424640
00442F3B   .  5D            pop ebp                                  ;  aLoNg3x_.00424640
00442F3C   .  C3            retn


        這段程式碼裡同樣對使用者名稱和密碼進行檢測,看是否符合要求,如果符合,就隱藏右邊的按鈕,並且將左邊按鈕啟用,那麼主要看字串檢測的關鍵call ,如下:

00442AF4  /$  55            push ebp                                 ;  右擊按鈕關鍵call
00442AF5  |.  8BEC          mov ebp,esp
00442AF7  |.  83C4 F8       add esp,-0x8
00442AFA  |.  53            push ebx
00442AFB  |.  56            push esi
00442AFC  |.  8955 F8       mov [local.2],edx
00442AFF  |.  8945 FC       mov [local.1],eax
00442B02  |.  8B45 FC       mov eax,[local.1]
00442B05  |.  E8 DE10FCFF   call aLoNg3x_.00403BE8
00442B0A  |.  33C0          xor eax,eax
00442B0C  |.  55            push ebp
00442B0D  |.  68 902B4400   push aLoNg3x_.00442B90
00442B12  |.  64:FF30       push dword ptr fs:[eax]
00442B15  |.  64:8920       mov dword ptr fs:[eax],esp
00442B18  |.  8B45 FC       mov eax,[local.1]
00442B1B  |.  E8 140FFCFF   call aLoNg3x_.00403A34                   ;  使用者名稱長度
00442B20  |.  83F8 05       cmp eax,0x5                              ;  使用者名稱長度要大於5
00442B23  |.  7E 53         jle short aLoNg3x_.00442B78
00442B25  |.  8B45 FC       mov eax,[local.1]
00442B28  |.  0FB640 04     movzx eax,byte ptr ds:[eax+0x4]          ;  使用者名稱第五個字串ASCII碼
00442B2C  |.  B9 07000000   mov ecx,0x7                              ;  ecx=7
00442B31  |.  33D2          xor edx,edx
00442B33  |.  F7F1          div ecx                                  ;  eax =eax /ecx
00442B35  |.  8BC2          mov eax,edx
00442B37  |.  83C0 02       add eax,0x2
00442B3A  |.  E8 E1FEFFFF   call aLoNg3x_.00442A20
00442B3F  |.  8BF0          mov esi,eax
00442B41  |.  33DB          xor ebx,ebx
00442B43  |.  8B45 FC       mov eax,[local.1]                        ;  使用者名稱
00442B46  |.  E8 E90EFCFF   call aLoNg3x_.00403A34                   ;  使用者名稱長度
00442B4B  |.  85C0          test eax,eax
00442B4D  |.  7E 16         jle short aLoNg3x_.00442B65
00442B4F  |.  BA 01000000   mov edx,0x1
00442B54  |>  8B4D FC       /mov ecx,[local.1]
00442B57  |.  0FB64C11 FF   |movzx ecx,byte ptr ds:[ecx+edx-0x1]
00442B5C  |.  0FAFCE        |imul ecx,esi
00442B5F  |.  03D9          |add ebx,ecx                             ;  user32.767A78F4
00442B61  |.  42            |inc edx
00442B62  |.  48            |dec eax
00442B63  |.^ 75 EF         \jnz short aLoNg3x_.00442B54
00442B65  |>  2B5D F8       sub ebx,[local.2]                        ;  ebx-密碼
00442B68  |.  81FB 697A0000 cmp ebx,0x7A69                           ;  相等
00442B6E  |.  75 04         jnz short aLoNg3x_.00442B74              ;  不跳
00442B70  |.  B3 01         mov bl,0x1
00442B72  |.  EB 06         jmp short aLoNg3x_.00442B7A
00442B74  |>  33DB          xor ebx,ebx
00442B76  |.  EB 02         jmp short aLoNg3x_.00442B7A
00442B78  |>  33DB          xor ebx,ebx
00442B7A  |>  33C0          xor eax,eax
00442B7C  |.  5A            pop edx                                  ;  aLoNg3x_.00442EEC
00442B7D  |.  59            pop ecx                                  ;  aLoNg3x_.00442EEC
00442B7E  |.  59            pop ecx                                  ;  aLoNg3x_.00442EEC
00442B7F  |.  64:8910       mov dword ptr fs:[eax],edx
00442B82  |.  68 972B4400   push aLoNg3x_.00442B97
00442B87  |>  8D45 FC       lea eax,[local.1]
00442B8A  |.  E8 290CFCFF   call aLoNg3x_.004037B8
00442B8F  \.  C3            retn
00442B90   .^ E9 E306FCFF   jmp aLoNg3x_.00403278
00442B95   .^ EB F0         jmp short aLoNg3x_.00442B87
00442B97   .  8BC3          mov eax,ebx
00442B99   .  5E            pop esi                                  ;  aLoNg3x_.00442EEC
00442B9A   .  5B            pop ebx                                  ;  aLoNg3x_.00442EEC
00442B9B   .  59            pop ecx                                  ;  aLoNg3x_.00442EEC
00442B9C   .  59            pop ecx                                  ;  aLoNg3x_.00442EEC
00442B9D   .  5D            pop ebp                                  ;  aLoNg3x_.00442EEC
00442B9E   .  C3            retn


      程式碼的關鍵是在地址 442B54處的一段計算,然後將計算的結果與密碼作差看是否等於0x7A69,如果是則eax返回非0,就可以實現右側按鈕單擊時隱藏了,如下:


接下來應該就是單擊ok按鈕使其隱藏了,分析按鈕的事件處理函式如下:

00442D64  /.  55            push ebp                                 ;  ok按鈕單擊
00442D65  |.  8BEC          mov ebp,esp
00442D67  |.  6A 00         push 0x0
00442D69  |.  53            push ebx
00442D6A  |.  8BD8          mov ebx,eax
00442D6C  |.  33C0          xor eax,eax
00442D6E  |.  55            push ebp
00442D6F  |.  68 ED2D4400   push aLoNg3x_.00442DED
00442D74  |.  64:FF30       push dword ptr fs:[eax]
00442D77  |.  64:8920       mov dword ptr fs:[eax],esp
00442D7A  |.  8B83 D0020000 mov eax,dword ptr ds:[ebx+0x2D0]
00442D80  |.  8078 47 01    cmp byte ptr ds:[eax+0x47],0x1           ;  判斷右邊按鈕是否存在
00442D84  |.  75 12         jnz short aLoNg3x_.00442D98              ;  跳過
00442D86  |.  BA 002E4400   mov edx,aLoNg3x_.00442E00                ;  0
00442D8B  |.  8B83 E0020000 mov eax,dword ptr ds:[ebx+0x2E0]
00442D91  |.  E8 5A05FEFF   call aLoNg3x_.004232F0
00442D96  |.  EB 3F         jmp short aLoNg3x_.00442DD7
00442D98  |>  8D55 FC       lea edx,[local.1]
00442D9B  |.  8B83 E0020000 mov eax,dword ptr ds:[ebx+0x2E0]
00442DA1  |.  E8 1A05FEFF   call aLoNg3x_.004232C0
00442DA6  |.  8B45 FC       mov eax,[local.1]
00442DA9  |.  E8 C248FCFF   call aLoNg3x_.00407670
00442DAE  |.  50            push eax
00442DAF  |.  8D55 FC       lea edx,[local.1]
00442DB2  |.  8B83 DC020000 mov eax,dword ptr ds:[ebx+0x2DC]
00442DB8  |.  E8 0305FEFF   call aLoNg3x_.004232C0
00442DBD  |.  8B45 FC       mov eax,[local.1]                        ;  使用者名稱
00442DC0  |.  5A            pop edx                                  ;  aLoNg3x_.00424640
00442DC1  |.  E8 DAFDFFFF   call aLoNg3x_.00442BA0                   ;  關鍵call 密碼檢測
00442DC6  |.  84C0          test al,al
00442DC8  |.  74 0D         je short aLoNg3x_.00442DD7               ;  這裡不能跳轉
00442DCA  |.  33D2          xor edx,edx
00442DCC  |.  8B83 CC020000 mov eax,dword ptr ds:[ebx+0x2CC]
00442DD2  |.  E8 D903FEFF   call aLoNg3x_.004231B0
00442DD7  |>  33C0          xor eax,eax
00442DD9  |.  5A            pop edx                                  ;  aLoNg3x_.00424640
00442DDA  |.  59            pop ecx                                  ;  aLoNg3x_.00424640
00442DDB  |.  59            pop ecx                                  ;  aLoNg3x_.00424640
00442DDC  |.  64:8910       mov dword ptr fs:[eax],edx
00442DDF  |.  68 F42D4400   push aLoNg3x_.00442DF4
00442DE4  |>  8D45 FC       lea eax,[local.1]
00442DE7  |.  E8 CC09FCFF   call aLoNg3x_.004037B8
00442DEC  \.  C3            retn
00442DED   .^ E9 8604FCFF   jmp aLoNg3x_.00403278
00442DF2   .^ EB F0         jmp short aLoNg3x_.00442DE4
00442DF4   .  5B            pop ebx                                  ;  aLoNg3x_.00424640
00442DF5   .  59            pop ecx                                  ;  aLoNg3x_.00424640
00442DF6   .  5D            pop ebp                                  ;  aLoNg3x_.00424640
00442DF7   .  C3            retn


  這裡的處理與上面的類似,關鍵在於地址442DC1處的關鍵call,這個call的程式碼如下:
00442BA0  /$  55            push ebp                                 ;  使用者名稱檢測  密碼檢測  --  ok按鈕單擊
00442BA1  |.  8BEC          mov ebp,esp
00442BA3  |.  6A 00         push 0x0
00442BA5  |.  6A 00         push 0x0
00442BA7  |.  6A 00         push 0x0
00442BA9  |.  53            push ebx
00442BAA  |.  56            push esi
00442BAB  |.  8BF2          mov esi,edx
00442BAD  |.  8945 FC       mov [local.1],eax
00442BB0  |.  8B45 FC       mov eax,[local.1]
00442BB3  |.  E8 3010FCFF   call aLoNg3x_.00403BE8
00442BB8  |.  33C0          xor eax,eax
00442BBA  |.  55            push ebp
00442BBB  |.  68 672C4400   push aLoNg3x_.00442C67
00442BC0  |.  64:FF30       push dword ptr fs:[eax]
00442BC3  |.  64:8920       mov dword ptr fs:[eax],esp
00442BC6  |.  33DB          xor ebx,ebx
00442BC8  |.  8D55 F8       lea edx,[local.2]
00442BCB  |.  8BC6          mov eax,esi
00442BCD  |.  E8 6E4AFCFF   call aLoNg3x_.00407640
00442BD2  |.  8D45 F4       lea eax,[local.3]
00442BD5  |.  8B55 F8       mov edx,[local.2]                        ;  密碼
00442BD8  |.  E8 730CFCFF   call aLoNg3x_.00403850
00442BDD  |.  8B45 F8       mov eax,[local.2]                        ;  密碼
00442BE0  |.  E8 4F0EFCFF   call aLoNg3x_.00403A34                   ;  密碼長度
00442BE5  |.  83F8 05       cmp eax,0x5
00442BE8  |.  7E 60         jle short aLoNg3x_.00442C4A              ;  不能跳
00442BEA  |.  8B45 F8       mov eax,[local.2]
00442BED  |.  E8 420EFCFF   call aLoNg3x_.00403A34
00442BF2  |.  8BF0          mov esi,eax
00442BF4  |.  83FE 01       cmp esi,0x1
00442BF7  |.  7C 2F         jl short aLoNg3x_.00442C28
00442BF9  |>  8D45 F4       /lea eax,[local.3]
00442BFC  |.  E8 0310FCFF   |call aLoNg3x_.00403C04
00442C01  |.  8D4430 FF     |lea eax,dword ptr ds:[eax+esi-0x1]
00442C05  |.  50            |push eax
00442C06  |.  8B45 F8       |mov eax,[local.2]
00442C09  |.  0FB64430 FF   |movzx eax,byte ptr ds:[eax+esi-0x1]
00442C0E  |.  F7E8          |imul eax
00442C10  |.  0FBFC0        |movsx eax,ax
00442C13  |.  F7EE          |imul esi
00442C15  |.  B9 19000000   |mov ecx,0x19
00442C1A  |.  99            |cdq
00442C1B  |.  F7F9          |idiv ecx
00442C1D  |.  83C2 41       |add edx,0x41
00442C20  |.  58            |pop eax
00442C21  |.  8810          |mov byte ptr ds:[eax],dl
00442C23  |.  4E            |dec esi
00442C24  |.  85F6          |test esi,esi
00442C26  |.^ 75 D1         \jnz short aLoNg3x_.00442BF9
00442C28  |>  8B45 F4       mov eax,[local.3]                        ;  一個變化的字串
00442C2B  |.  8B55 FC       mov edx,[local.1]                        ;  使用者名稱
00442C2E  |.  E8 110FFCFF   call aLoNg3x_.00403B44
00442C33  |.  75 17         jnz short aLoNg3x_.00442C4C
00442C35  |.  8B45 FC       mov eax,[local.1]
00442C38  |.  8B55 F4       mov edx,[local.3]
00442C3B  |.  E8 040FFCFF   call aLoNg3x_.00403B44                   ;  關鍵call
00442C40  |.  75 04         jnz short aLoNg3x_.00442C46              ;  不能跳
00442C42  |.  B3 01         mov bl,0x1
00442C44  |.  EB 06         jmp short aLoNg3x_.00442C4C              ;  跳
00442C46  |>  33DB          xor ebx,ebx
00442C48  |.  EB 02         jmp short aLoNg3x_.00442C4C
00442C4A  |>  33DB          xor ebx,ebx
00442C4C  |>  33C0          xor eax,eax
00442C4E  |.  5A            pop edx
00442C4F  |.  59            pop ecx
00442C50  |.  59            pop ecx
00442C51  |.  64:8910       mov dword ptr fs:[eax],edx
00442C54  |.  68 6E2C4400   push aLoNg3x_.00442C6E
00442C59  |>  8D45 F4       lea eax,[local.3]
00442C5C  |.  BA 03000000   mov edx,0x3
00442C61  |.  E8 760BFCFF   call aLoNg3x_.004037DC
00442C66  \.  C3            retn
00442C67   .^ E9 0C06FCFF   jmp aLoNg3x_.00403278
00442C6C   .^ EB EB         jmp short aLoNg3x_.00442C59
00442C6E   .  8BC3          mov eax,ebx
00442C70   .  5E            pop esi
00442C71   .  5B            pop ebx
00442C72   .  8BE5          mov esp,ebp
00442C74   .  5D            pop ebp
00442C75   .  C3            retn


從這個程式碼裡可以看到,在後面有一個和某個字串對比的call,如果使用者名稱是這個字串就可以通過了,而這個字串是上面的迴圈中根據密碼字串計算得到,因此只要輸入的使用者名稱和密碼對應就可以計算出來。

註冊後的效果如下:


破解總結如下:

 1、先輸入一段使用者名稱與密碼,點選右側的按鈕,即可以使右側的按鈕消失,並且左側的按鈕啟用,用 戶名和密碼的匹配規則在程式碼中有,就是按鈕事件裡的關鍵call裡,不難。(如輸入 5555555與 235783)。

2、輸入一段使用者名稱與密碼,點選左側的按鈕即可以使左側的按鈕消失,破解成功,程式碼中先根據輸入的密碼計算得到一個字串,再與使用者名稱比較(計算的過程見程式碼,不難),如果一致則成功(如輸入ACCAFG 與 235783)