猜數記---BCWIPE註冊半破解 (25千字)

看雪資料發表於2001-04-02

猜數記---BCWIPE註冊半破解
作者:Fpc
目標:取得註冊碼

軟體名稱:BCWipe v2.34.2
主頁:www.jetico.com
簡介:外殼擴充套件程式,用於完全抹除磁碟上的敏感資訊,使它人無法恢復(當然自己也不能,所以要小心呀。)



  前幾天貼過暴破註冊的方法,但遇到有註冊碼輸入而沒追出,感覺實在是不舒服。今天又追了一次,沒有完全成功,但已經可以註冊了。‘猜數記’就來源於此,註冊碼是一點點試出來的,有點搞笑。
原因就在於,作者不是那麼笨。BW先判斷輸入的註冊碼(Irc)格式是否正確,接下來將Irc中各字元變為32進位制數,作變換與兩個給定的字串比較,若不等則註冊失敗。

它的格式是“WP-####-####-####-####”,“#”可以是數字或字母。

首先給出一個有效的註冊碼“WP-1234-&*^%-81VH-7F21”,最後的8位是關鍵,中間的“&*^%”可以用別的符號和數字‘0’以及字母‘I’、‘O’的任意組合來代替。


在本破解中,先看註冊碼計算的核心部分:
《1》
這個CALL對Irc作變換處理,如果出口是Eax=1,則表示需進一步處理;若出口是Eax=0,則表示不需要可以直接驗證Irc是否正確(這個很重要)。


* Referenced by a CALL at Address:
|:10012C95 
|
:10012CC0 8B442408                mov eax, dword ptr [esp+08]
:10012CC4 53                      push ebx
:10012CC5 8B5C2408                mov ebx, dword ptr [esp+08]
:10012CC9 56                      push esi
:10012CCA 57                      push edi
:10012CCB 33F6                    xor esi, esi
:10012CCD 8D7810                  lea edi, dword ptr [eax+10]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012CF5(C)
|
:10012CD0 8A4FFF                  mov cl, byte ptr [edi-01]    <- 從Irc最後一位開始取一個字元
:10012CD3 4F                      dec edi
:10012CD4 51                      push ecx            <- 將這個字元壓棧
:10012CD5 E8A6000000              call 10012D80            《2》 將它換成32進位制數,返回值在Eax中
:10012CDA 83C404                  add esp, 00000004
:10012CDD 83F8FF                  cmp eax, FFFFFFFF        <- Eax=-1表示Irc中含有不在碼錶中的字元
:10012CE0 741E                    je 10012D00            <- 向下跳,準備返回。這個跳轉在本破解中起到關鍵作用!!

:10012CE2 6A05                    push 00000005
:10012CE4 50                      push eax
:10012CE5 56                      push esi
:10012CE6 53                      push ebx
:10012CE7 E824000000              call 10012D10
:10012CEC 83C605                  add esi, 00000005
:10012CEF 83C410                  add esp, 00000010
:10012CF2 83FE50                  cmp esi, 00000050
:10012CF5 7CD9                    jl 10012CD0            <- 不到16次則繼續
:10012CF7 5F                      pop edi
:10012CF8 5E                      pop esi


:10012CF9 B801000000              mov eax, 00000001        <- 表示Irc中的字元均可轉換為32進位制數
:10012CFE 5B                      pop ebx
:10012CFF C3                      ret



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012CE0(C)
|
:10012D00 5F                      pop edi            <- 遇到“不正常”字元時跳到這裡
:10012D01 5E                      pop esi
:10012D02 33C0                    xor eax, eax
:10012D04 5B                      pop ebx
:10012D05 C3                      ret







《2》 這個CALL將呼叫前的最後一次壓棧字元換算為32進位制數,返回值在Eax中,注意32進位制數從0開始;
若所查的字元不在其中則 Eax=-1。
例如:1->0,3->2,9->8,W->A,K->17,M->1F,&->-1,0->-1。

* Referenced by a CALL at Address:
|:10012CD5 
|
:10012D80 8A0D5CC30210            mov cl, byte ptr [1002C35C]

這個地址是32進位制數的碼錶(很重要):
“12345678 9QWERTYU PASDFGHK LZXCVBNM”                <- 注意其中沒有0、I、O


:10012D86 33C0                    xor eax, eax
:10012D88 84C9                    test cl, cl
:10012D8A 7413                    je 10012D9F
:10012D8C 8A542404                mov dl, byte ptr [esp+04]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012D9D(C)
|
:10012D90 3ACA                    cmp cl, dl
:10012D92 740E                    je 10012DA2
:10012D94 8A885DC30210            mov cl, byte ptr [eax+1002C35D]
:10012D9A 40                      inc eax
:10012D9B 84C9                    test cl, cl
:10012D9D 75F1                    jne 10012D90

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012D8A(C)
|
:10012D9F 83C8FF                  or eax, FFFFFFFF        <- 如果字元不在其中則Eax=-1
                                <- 想不到這個也是有用的
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012D92(C)
|
:10012DA2 C3                      ret
:10012DA3 90                      nop





《3》這個CALL編寫的實在是精彩,其作用是將得到的32進位制數作移位變換,存放於目標地址。

* Referenced by a CALL at Address:
|:10012CE7 
|
:10012D10 8B442408                mov eax, dword ptr [esp+08]
:10012D14 53                      push ebx
:10012D15 56                      push esi
:10012D16 57                      push edi
:10012D17 8BF8                    mov edi, eax
:10012D19 81E707000080            and edi, 80000007        <- Edi值每次都在變,在下面用作移位的位數(很高明)
:10012D1F 7905                    jns 10012D26                <- Edi=0、5、2、7、4、1、8.....

:10012D21 4F                      dec edi            <-
:10012D22 83CFF8                  or edi, FFFFFFF8        <- 這三個好象不會被執行到
:10012D25 47                      inc edi            <-

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10012D1F(C)
|
:10012D26 8B74241C                mov esi, dword ptr [esp+1C]
:10012D2A 8B5C2410                mov ebx, dword ptr [esp+10]    <- 取得目標地址,內容一開始時為空
:10012D2E 99                      cdq

:10012D2F B908000000              mov ecx, 00000008
:10012D34 83E207                  and edx, 00000007
:10012D37 2BCE                    sub ecx, esi
:10012D39 BEFF000000              mov esi, 000000FF
:10012D3E 03C2                    add eax, edx
:10012D40 33D2                    xor edx, edx
:10012D42 D3FE                    sar esi, cl
:10012D44 C1F803                  sar eax, 03            <- 調整Eax的位置

Eax的改變方式是隨著這個CALL的呼叫Eax=0、0、1、1、2、3、3、4、4、.......



:10012D47 03C3                    add eax, ebx            <- Eax指向目標地址

:10012D49 8BCF                    mov ecx, edi
:10012D4B 8A7001                  mov dh, byte ptr [eax+01]
:10012D4E 8BDE                    mov ebx, esi
:10012D50 8A10                    mov dl, byte ptr [eax]
:10012D52 D3E3                    shl ebx, cl

:10012D54 8B4C2418                mov ecx, dword ptr [esp+18]    <- 取得一個32進位制數
:10012D58 23F1                    and esi, ecx            <- 相當於Esi=Ecx
:10012D5A 8BCF                    mov ecx, edi
:10012D5C D3E6                    shl esi, cl            <- Esi*2的N次方
:10012D5E F7D3                    not ebx
:10012D60 23D3                    and edx, ebx
:10012D62 5F                      pop edi
:10012D63 0BD6                    or edx, esi            <- 結果送Edx,注意它用Or的方式保留低位位元組的值

:10012D65 5E                      pop esi
:10012D66 8BCA                    mov ecx, edx
:10012D68 5B                      pop ebx

:10012D69 8808                    mov byte ptr [eax], cl
:10012D6B C1F908                  sar ecx, 08
:10012D6E 884801                  mov byte ptr [eax+01], cl
:10012D71 C3                      ret


小結:綜合《1》和《2》《3》,程式按從後到前的順序取得Irc,換成32進位制數,移位得到註冊碼1(Rc1)。
舉例如下(可能有錯誤,只是表明計算過程是這樣的):
假設Irc:WP-1234-2345-4567-6789,則(以下為16進位制)
  9->8,8*1=8;
  8->7,7*20=E0。  Rc1[0]=E0 OR 8=E8;
  7->6,6*4=18;
  6->5,5*80=280。 Rc1[1]=80 OR 18=98;Rc1[2]=2;
  7->6,6*10=60。  Rc1[2]=60 OR 2=62;(注意這個位只計算一次)
  6->5,5*2=A;
  5->4,4*40=100。 Rc1[3]=00 OR A=A;Rc1[4]=1;
  .........................
生成的Rc1:E8 98 62 0A 01

這個Rc1要與下面的字串作比較,因為我看不出演算法,無法反推,只能用計算器來算(這個過程很麻煩)

====================================================================

* Referenced by a CALL at Addresses:
|:1000728A  , :1000771C  , :10007BD4 
|
:10007620 83EC0C                  sub esp, 0000000C
:10007623 8B0D00420310            mov ecx, dword ptr [10034200]
:10007629 8B542410                mov edx, dword ptr [esp+10]
:1000762D 33C0                    xor eax, eax
:1000762F 53                      push ebx
:10007630 89442404                mov dword ptr [esp+04], eax
:10007634 56                      push esi
:10007635 8944240C                mov dword ptr [esp+0C], eax
:10007639 51                      push ecx
:1000763A 6689442414              mov word ptr [esp+14], ax
:1000763F 68CC410310              push 100341CC
:10007644 8D442410                lea eax, dword ptr [esp+10]
:10007648 52                      push edx
:10007649 50                      push eax
:1000764A E8119D0000              call 10011360            <= 詳細在下面

* Possible StringData Ref from Data Obj ->"$LS98"        <= 看是否為此
                                  |
:1000764F 8B35F8410310            mov esi, dword ptr [100341F8]
:10007655 83C410                  add esp, 00000010
:10007658 8D442408                lea eax, dword ptr [esp+08]    <= 由IRC求得的碼

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000767E(C)
|
:1000765C 8A10                    mov dl, byte ptr [eax]
:1000765E 8A1E                    mov bl, byte ptr [esi]
:10007660 8ACA                    mov cl, dl
:10007662 3AD3                    cmp dl, bl
:10007664 751E                    jne 10007684
:10007666 84C9                    test cl, cl
:10007668 7416                    je 10007680
:1000766A 8A5001                  mov dl, byte ptr [eax+01]
:1000766D 8A5E01                  mov bl, byte ptr [esi+01]
:10007670 8ACA                    mov cl, dl
:10007672 3AD3                    cmp dl, bl
:10007674 750E                    jne 10007684
:10007676 83C002                  add eax, 00000002
:10007679 83C602                  add esi, 00000002
:1000767C 84C9                    test cl, cl
:1000767E 75DC                    jne 1000765C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10007668(C)
|
:10007680 33C0                    xor eax, eax
:10007682 EB05                    jmp 10007689

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10007664(C), :10007674(C)
|
:10007684 1BC0                    sbb eax, eax
:10007686 83D8FF                  sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10007682(U)
|
:10007689 85C0                    test eax, eax                <- 此處改為CMP EAX,EAX就可暴破

:1000768B 7443                    je 100076D0

* Possible StringData Ref from Data Obj ->"$BCWP"
                                  |
:1000768D 8B35FC410310            mov esi, dword ptr [100341FC]        <- 另一次機會
:10007693 8D442408                lea eax, dword ptr [esp+08]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100076B9(C)
|
:10007697 8A10                    mov dl, byte ptr [eax]
:10007699 8A1E                    mov bl, byte ptr [esi]
:1000769B 8ACA                    mov cl, dl
:1000769D 3AD3                    cmp dl, bl
:1000769F 751E                    jne 100076BF                <-
:100076A1 84C9                    test cl, cl
:100076A3 7416                    je 100076BB
:100076A5 8A5001                  mov dl, byte ptr [eax+01]
:100076A8 8A5E01                  mov bl, byte ptr [esi+01]
:100076AB 8ACA                    mov cl, dl
:100076AD 3AD3                    cmp dl, bl
:100076AF 750E                    jne 100076BF
:100076B1 83C002                  add eax, 00000002
:100076B4 83C602                  add esi, 00000002
:100076B7 84C9                    test cl, cl
:100076B9 75DC                    jne 10007697

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100076A3(C)
|
:100076BB 33C0                    xor eax, eax
:100076BD EB05                    jmp 100076C4

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000769F(C), :100076AF(C)
|
:100076BF 1BC0                    sbb eax, eax
:100076C1 83D8FF                  sbb eax, FFFFFFFF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100076BD(U)
|
:100076C4 85C0                    test eax, eax
:100076C6 7408                    je 100076D0
:100076C8 5E                      pop esi
:100076C9 33C0                    xor eax, eax
:100076CB 5B                      pop ebx
:100076CC 83C40C                  add esp, 0000000C
:100076CF C3                      ret


* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000768B(C), :100076C6(C)
|
:100076D0 8B44241C                mov eax, dword ptr [esp+1C]
:100076D4 8B4C240E                mov ecx, dword ptr [esp+0E]
:100076D8 5E                      pop esi
:100076D9 5B                      pop ebx
:100076DA 8908                    mov dword ptr [eax], ecx

* Possible Reference to String Resource ID=00001: "%d Hours"
                                  |
:100076DC B801000000              mov eax, 00000001
:100076E1 83C40C                  add esp, 0000000C
:100076E4 C3                      ret

====================================================================

在:1000764A處的呼叫

* Referenced by a CALL at Addresses:
|:1000764A  , :1000788A 
|
:10011360 6AFF                    push FFFFFFFF
:10011362 6880A40210              push 1002A480
:10011367 64A100000000            mov eax, dword ptr fs:[00000000]
:1001136D 50                      push eax
:1001136E 64892500000000          mov dword ptr fs:[00000000], esp
:10011375 83EC14                  sub esp, 00000014
:10011378 8B442430                mov eax, dword ptr [esp+30]
:1001137C 8B4C2428                mov ecx, dword ptr [esp+28]
:10011380 56                      push esi
:10011381 8B742428                mov esi, dword ptr [esp+28]
:10011385 50                      push eax
:10011386 51                      push ecx
:10011387 56                      push esi
:10011388 C744241000000000        mov [esp+10], 00000000
:10011390 E89B180000              call 10012C30                <- 見下面
:10011395 83C40C                  add esp, 0000000C
:10011398 85C0                    test eax, eax                <- 不能讓Eax返回值為0
:1001139A 7412                    je 100113AE                <- 跳下去就有大麻煩了,因為它會按別的方式計算Rc,我實在是不想跟下去
:1001139C 33C0                    xor eax, eax                <- 大家不信可以跟一跟
:1001139E 5E                      pop esi
:1001139F 8B4C2414                mov ecx, dword ptr [esp+14]
:100113A3 64890D00000000          mov dword ptr fs:[00000000], ecx
:100113AA 83C420                  add esp, 00000020
:100113AD C3                      ret



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1001139A(C)
|
:100113AE 33D2                    xor edx, edx
:100113B0 89542410                mov dword ptr [esp+10], edx
:100113B4 89542414                mov dword ptr [esp+14], edx
:100113B8 33C0                    xor eax, eax
:100113BA 89542420                mov dword ptr [esp+20], edx
:100113BE 89442408                mov dword ptr [esp+08], eax
:100113C2 8944240C                mov dword ptr [esp+0C], eax
:100113C6 8B542430                mov edx, dword ptr [esp+30]
:100113CA 8D4C2434                lea ecx, dword ptr [esp+34]
:100113CE 51                      push ecx
:100113CF 8D44240C                lea eax, dword ptr [esp+0C]
:100113D3 52                      push edx
:100113D4 8D4C2418                lea ecx, dword ptr [esp+18]
:100113D8 50                      push eax
:100113D9 51                      push ecx
:100113DA C644243001              mov [esp+30], 01
:100113DF E83C140000              call 10012820
:100113E4 83C410                  add esp, 00000010
:100113E7 85C0                    test eax, eax
:100113E9 7434                    je 1001141F
:100113EB 8B44240C                mov eax, dword ptr [esp+0C]
:100113EF 85C0                    test eax, eax
:100113F1 7409                    je 100113FC
:100113F3 50                      push eax
:100113F4 E8AA340000              call 100148A3
:100113F9 83C404                  add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100113F1(C)
|
:100113FC 8B442414                mov eax, dword ptr [esp+14]
:10011400 85C0                    test eax, e

相關文章