高手請進!幫手指出這個演算法裡面的錯誤 (12千字)

看雪資料發表於2001-12-17

PauYyoung大哥你還記得這句話嗎??
                ↓↓↓↓↓
            【有信心,凡事有可能】
                 
            【請各位大哥幫小弟找一下這個註冊演算法有什麼錯誤】

      作者:隨風而去[CNCG]
      所用時間:一週
      軟體名:Dance Dance Revlution for winamp                     
      軟體介紹: 
      此乃winamp的一個外掛,可以讓winamp實現跳舞毯的功能,
      沒有註冊前,不能使用跳舞毯,還有一個特殊效果也用不上。註冊之後就沒有這些限制了。

*************************************************************************************** 
 
      先執行winamp,招到此外掛的配置視窗,然後點選註冊,標準的註冊視窗,使用者名稱加註冊碼。
      先隨便試了一下,有錯誤提示,,用trw追。
        下中斷bpx
        hmemcpy,
        不要下pmodule,
        直接按F12,按了11下就回到程式了
        重新來一次,按10下F12後。
        按一下F10,來到如下的程式段:

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10003740(C)
  |

  * Reference To: USER32.GetDlgItemTextA, Ord:0104h
                                    |
  :10003769 8B35D0B10010            mov esi, dword ptr [1000B1D0]//F10來到這裡
  :1000376F 53                      push ebx
  :10003770 8B5C2430                mov ebx, dword ptr [esp+30]
  :10003774 6A64                    push 00000064
  :10003776 6830F40010              push 1000F430
  :1000377B 68FB030000              push 000003FB
  :10003780 53                      push ebx
  :10003781 FFD6                    call esi  <--取註冊碼長度放入EAX中
  :10003783 8D4C240C                lea ecx, dword ptr [esp+0C] <--D EDX可看假碼
  :10003787 6A20                    push 00000020
  :10003789 51                      push ecx
  :1000378A 68FA030000              push 000003FA
  :1000378F 53                      push ebx
  :10003790 FFD6                    call esi
  :10003792 8D54240C                lea edx, dword ptr [esp+0C]
  :10003796 52                      push edx
  :10003797 6830F40010              push 1000F430  <--此處D 0287F430可看使用者名稱
  :1000379C E8EFF7FFFF              call 10002F90 //這裡有一個經典的對比,
                                                    所以這個CALL嫌疑非常大,
                                                    F8跟進到看看。
  :100037A1 83C408                  add esp, 00000008
  :100037A4 85C0                    test eax, eax
  :100037A6 0F84A3000000            je 1000384F
  :100037AC 8D442430                lea eax, dword ptr [esp+30]
  :100037B0 50                      push eax


  F8來到這裡
  * Referenced by a CALL at Addresses:
  |:100010D8  , :1000379C 
  |
  :10002F90 83EC28                  sub esp, 00000028
  :10002F93 55                      push ebp
  :10002F94 8B6C2430                mov ebp, dword ptr [esp+30]
  :10002F98 85ED                    test ebp, ebp  <--看使用者名稱是否為空   
  :10002F9A 57                      push edi
  :10002F9B 0F8429010000            je 100030CA
  :10002FA1 8B542438                mov edx, dword ptr [esp+38]
  :10002FA5 85D2                    test edx, edx  <--看註冊碼是否為空
  :10002FA7 0F841D010000            je 100030CA
  :10002FAD 8BFD                    mov edi, ebp
  :10002FAF 83C9FF                  or ecx, FFFFFFFF
  :10002FB2 33C0                    xor eax, eax
  :10002FB4 F2                      repnz
  :10002FB5 AE                      scasb
  :10002FB6 F7D1                    not ecx
  :10002FB8 49                      dec ecx
  :10002FB9 0F840B010000            je 100030CA
  :10002FBF 8BFA                    mov edi, edx
  :10002FC1 83C9FF                  or ecx, FFFFFFFF
  :10002FC4 F2                      repnz
  :10002FC5 AE                      scasb
  :10002FC6 F7D1                    not ecx
  :10002FC8 49                      dec ecx
  :10002FC9 0F84FB000000            je 100030CA
  :10002FCF 53                      push ebx
  :10002FD0 32DB                    xor bl, bl
  :10002FD2 B908000000              mov ecx, 00000008
  :10002FD7 8D7C2411                lea edi, dword ptr [esp+11]
  :10002FDB 885C2410                mov byte ptr [esp+10], bl
  :10002FDF 33D2                    xor edx, edx
  :10002FE1 F3                      repz
  :10002FE2 AB                      stosd
  :10002FE3 8BFD                    mov edi, ebp
  :10002FE5 83C9FF                  or ecx, FFFFFFFF
  :10002FE8 F2                      repnz
  :10002FE9 AE                      scasb
  :10002FEA F7D1                    not ecx
  :10002FEC 49                      dec ecx
  :10002FED 56                      push esi
  :10002FEE 85C9                    test ecx, ecx
  :10002FF0 894C243C                mov dword ptr [esp+3C], ecx
  :10002FF4 7E0A                    jle 10003000

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10002FFE(C)
  |
  :10002FF6 8A042A                  mov al, byte ptr [edx+ebp] --| |註冊名用十六進位制放入al
  :10002FF9 32D8                    xor bl, al                  |    |    和BL異或後,
  :10002FFB 42                      inc edx                      |-----|BL再和第二位異或……
  :10002FFC 3BD1                    cmp edx, ecx                |    |到最後一位,得出BL
  :10002FFE 7CF6                    jl 10002FF6 -----------------|    |

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10002FF4(C)
  |
  :10003000 33F6                    xor esi, esi

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10003073(U)
  |
  :10003002 83FE08                  cmp esi, 00000008 //註冊碼不小於8個<1>    
  :10003005 7C07                    jl 1000300E//小於就跳
  :10003007 8D0409                  lea eax, dword ptr [ecx+ecx]//註冊碼是註冊名*2
  :1000300A 3BF0                    cmp esi, eax //比較
  :1000300C 7D67                    jge 10003075 //大於或等於跳,跳到註冊碼比較

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10003005(C)
  |
  :1000300E 8BFD                    mov edi, ebp
  :10003010 83C9FF                  or ecx, FFFFFFFF
  :10003013 33C0                    xor eax, eax
  :10003015 F2                      repnz
  :10003016 AE                      scasb
  :10003017 8BC6                    mov eax, esi
  :10003019 99                      cdq
  :1000301A F7D1                    not ecx
  :1000301C 2BC2                    sub eax, edx
  :1000301E 49                      dec ecx
  :1000301F D1F8                    sar eax, 1
  :10003021 33D2                    xor edx, edx
  :10003023 F7F1                    div ecx
  :10003025 83FE01                  cmp esi, 00000001
  :10003028 8BFA                    mov edi, edx
  :1000302A 7E05                    jle 10003031
  :1000302C 8D46FF                  lea eax, dword ptr [esi-01]
  :1000302F EB02                    jmp 10003033

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:1000302A(C)
  |
  :10003031 33C0                    xor eax, eax

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:1000302F(U)
  |
  :10003033 8A4C0414            |---mov cl, byte ptr [esp+eax+14]//正確的註冊碼從0位開始放入cl
  :10003037 32CB          <B>==|  xor cl, bl <---------------- //與上面得出的bl異或                   
  :10003039 80F18D              |  xor cl, 8D <---------------- //與8d異或                     
  :1000303C 8AD9                |---mov bl, cl <---------------- //放入bl, 保留著下次再計算                   
  :1000303E 885C2410                mov byte ptr [esp+10], bl   
  :10003042 8B542410                mov edx, dword ptr [esp+10]  //得出的結果放入<1>計算
  :10003046 52                      push edx
  :10003047 E8F4FEFFFF              call 10002F40 <------------- //-----------<1>
  :1000304C 8B4C2440                mov ecx, dword ptr [esp+40]
  :10003050 88443418                mov byte ptr [esp+esi+18], al //放入<1>計算的註冊碼
  :10003054 2BCF                    sub ecx, edi
  :10003056 8A5429FF            |---mov dl, byte ptr [ecx+ebp-01]----|  |註冊名的最後一位和註冊
  :1000305A 32D0          <C>==|  xor dl, al                      |===|碼第二位異或,再與D8異
  :1000305C 80F2D8              |---xor dl, D8-----------------------|  |或。得出dl放入<1>計算
  :1000305F 52                      push edx                   
  :10003060 E8DBFEFFFF              call 10002F40 <------------- //-------------<1>
  :10003065 8B4C2444                mov ecx, dword ptr [esp+44]
  :10003069 83C408                  add esp, 00000008
  :1000306C 88443415                mov byte ptr [esp+esi+15], al //放入<1>計算的註冊碼 
  :10003070 83C602                  add esi, 00000002
  :10003073 EB8D                    jmp 10003002  <------------- //向上跳,跳到<1>
 
  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:1000300C(C)
  |
  :10003075 8B742440                mov esi, dword ptr [esp+40] //這裡是假碼,下d esp+40
  :10003079 8D442414                lea eax, dword ptr [esp+14] //這裡是真碼,下d esp+14

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:1000309F(C)




跟進<1> *
*************************************
  * Referenced by a CALL at Addresses:
  |:10003047  , :10003060 
  |
  :10002F40 8B442404                mov eax, dword ptr [esp+04] //將結果放入EAX
  :10002F44 B93E000000              mov ecx, 0000003E <---------//ECX=3e
  :10002F49 25FF000000              and eax, 000000FF <---------//取EAX最後兩位    
  :10002F4E 99                      cdq
  :10002F4F F7F9                    idiv ecx <------------------//eax/ecx  al=商 dl=餘    
  :10002F51 B03D                    mov al, 3D <----------------//al=3d
  :10002F53 2AC2                    sub al, dl <----------------//al=al-dl
  :10002F55 3C09                    cmp al, 09 <----------------//比較
  :10002F57 88442404                mov byte ptr [esp+04], al  //al放入[esp+04]
  :10002F5B 761A                    jbe 10002F77 <--------------//不低於或等於
  :10002F5D 3C23                    cmp al, 23  <---------------//比較
  :10002F5F 8B442404                mov eax, dword ptr [esp+04] //[esp+04]放入eax
  :10002F63 7609                    jbe 10002F6E <--------------//不低於或等於
  :10002F65 25FF000000              and eax, 000000FF <---------//取EAX最後兩位    
  :10002F6A 83C03D                  add eax, 0000003D <---------//eax=eax+3d
  :10002F6D C3                      ret

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10002F63(C)
  |
  :10002F6E 25FF000000              and eax, 000000FF <---------//取EAX最後兩位    
  :10002F73 83C037                  add eax, 00000037 <---------//eax=eax+37
  :10002F76 C3                      ret

  * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  |:10002F5B(C)
  |
  :10002F77 8B442404                mov eax, dword ptr [esp+04] //[esp+04]放入eax
  :10002F7B 25FF000000              and eax, 000000FF <---------//取EAX最後兩位    
  :10002F80 83C030                  add eax, 00000030 <---------//eax=eax+30
  :10002F83 C3                      ret

  都不知道那些XOR是怎麼計算的,現在寫出過程!

  我的註冊名:black

  整理:b與bl異或,bl再和第二位註冊名異或得出bl再和第三位異或……到最後一位得出bl。
     
裡異或的第一次過進
      bl與b(62)得bl=62   
      bl與l(6c)得bl=e
      bl與a(61)得bl=6f
      bl與c(63)得bl=c
      bl與k(6b)得bl=67
  <B>整理:正註冊碼的0位開始放入cl與上面的bl異或得出bl,bl與8d異或得出bl,bl保留下次現計。
      <B>裡異或的第一次過進
  第一次 cl(0)與bl(67)得cl=67
          cl與8d得cl=ea       
          cl保留到bl=ea
  第二次 cl(30)與bl得cl=da
          cl與8d得cl=57
          cl保留到bl=57
  第三次 cl(54)與bl得cl=3
          cl與8d得cl=8e       
          cl保留到bl=8e
  第四次 cl(63)與bl得cl=ed
          cl與8d得cl=60       
          cl保留到bl=60
  第五次 cl(48)與bl得cl=28
          cl與8d得cl=a5       
          cl保留到bl=a5
  <C>整理:註冊名的最後一位dl和註冊碼第一位al異或,得出dl位異或,再與D8異或……得出dl
      <C>裡異或的第一次過進
  第一次  dl(67)與al(44)得dl=2f
          dl與D8得dl=f7
  第二次  dl(63)與al(61)得dl=2
          dl與D8得dl=da
  第三次  dl(61)與al(68)得dl=9
          dl與D8得dl=d1
  第四次  dl(6c)與al(52)得dl=32
          dl與D8得dl=e6
  第五次  dl(62)與al(4d)得dl=29
          dl與D8得dl=f1
        【請大哥級的高手幫一下小弟,講解一下
<B><C>xor的計算過程】

    最後得出
    註冊名:black
    註冊碼:D0aTHcRHK6 (注意大小寫)
     
                  要各位大哥們幫我寫個序號產生器來
                          先謝謝大哥們了
                           

相關文章