又來敲CCG的大門了,Sorbet V1.1演算法破解。電神魔鬼兄來看啊! (7千字)

看雪資料發表於2000-10-01

呵呵,我又來敲門了,真心希望SUN BIRD[CCG]及各位大客多多指教。
JMV Sorbet 1.1
就這個軟體本身來說,編寫的比較有創意,可以直接將圖形檔案的圖示改為該檔案的縮圖。另外,其配置/註冊檔案寫成sorbet.cpl而放在控制皮膚的裡面,很有些與眾不同。
下載: URL ftp://ftp.bj.software.chinese.com/software/soft_photosee/JMV%20Sorbet%20Installer.exe
工具: TRW2k 1.22 W32DSM 8.93

隨意輸入密碼:78787878787878-->load trw2k-->bpx hmemcpy-->F5-->確定-->攔住-->F12多次-->來到Sorbet領空。

F10來到這個Call:
:66002745 FF5028                  call [eax+28]
進入,很快就找到這裡(下面比較註冊碼的前幾位,非常簡單):

:6601045F 8A08                    mov cl, byte ptr [eax]      //eax中存放著註冊碼的位置,取第一個位元組'7'
:66010461 8A15C1A40166            mov dl, byte ptr [6601A4C1]

//66014C1中存放的內容為: "R7UK9AY34QHE"  ,這句取出'R'(Ox52),所以我們把al中的內容改為52
                                                                
:66010467 3ACA                    cmp cl, dl       
:66010469 751A                    jne 66010485        //繼續
:6601046B 8A5001                  mov dl, byte ptr [eax+01]    //註冊碼的第二個位元組'8'
:6601046E 8A0DC4A40166            mov cl, byte ptr [6601A4C4]  //應當為'K',所以我們把cl中的內容改為'K'(0x4B)
:66010474 3AD1                    cmp dl, cl
:66010476 750D                    jne 66010485            //繼續
:66010478 50                      push eax
:66010479 E862000000              call 660104E0        //進這Call看看
......

:660104E0 8B542404                mov edx, dword ptr [esp+04]  //註冊碼地址給edx
.....
來到這裡,這段多次在程式中出現,目的是為了過濾掉2D,20,5c,2f之類的無用符號:
:6601050E 8954241C                mov dword ptr [esp+1C], edx
:66010512 8A02                    mov al, byte ptr [edx]
:66010514 3C2D                    cmp al, 2D
:66010516 7410                    je 66010528
:66010518 3C20                    cmp al, 20
:6601051A 740C                    je 66010528
:6601051C 3C5C                    cmp al, 5C
:6601051E 7408                    je 66010528
:66010520 3C2F                    cmp al, 2F
:66010522 7404                    je 66010528
:66010524 3C5F                    cmp al, 5F
:66010526 7503                    jne 6601052B
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:66010516(C), :6601051A(C), :6601051E(C), :66010522(C)
|
:66010528 42                      inc edx
:66010529 EBE3                    jmp 6601050E        //如果等於那些無效字元,跳回去重新比較。
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:66010526(C)
|
:6601052B 8A02                    mov al, byte ptr [edx]        //取出第3個字元(非無效字元)
:6601052D 8A0DBDA40166            mov cl, byte ptr [6601A4BD]    
//66014BC後的內容是:56JWR7UK9AY34QHE
:66010533 42                      inc edx                        
:66010534 3AC1                    cmp al, cl                    //所以註冊碼中第3個字元為'6'
:66010536 8954241C                mov dword ptr [esp+1C], edx
:6601053A 753C                    jne 66010578

又經過一段判別無效字元的程式,來到這裡:

:66010559 8A02                    mov al, byte ptr [edx]        //取出第4個字元(非無效字元)
:6601055B 42                      inc edx
:6601055C 33C9                    xor ecx, ecx                    //ecx == 0
:6601055E 8954241C                mov dword ptr [esp+1C], edx
:66010562 894C2410                mov dword ptr [esp+10], ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:66010572(C)
|
:66010566 3A81BCA40166            cmp al, byte ptr [ecx+6601A4BC] //所以註冊碼中第4個字元為'5'
:6601056C 7414                    je 66010582                      //跳到下面
......

從這裡開始註冊碼的計算變得複雜起來了,我也是分析了一下演算法才得到註冊碼的:
:66010582 83F911                  cmp ecx, 00000011                
:66010585 894C2410                mov dword ptr [esp+10], ecx
:66010589 7DED                    jge 66010578                  //不跳
:6601058B 83F905                  cmp ecx, 00000005
:6601058E 77E8                    ja 66010578                     //不跳
:66010590 83F902                  cmp ecx, 00000002           

* Possible Reference to String Resource ID=00002: "will end in a few minutes"
                                  |
:66010593 BF02000000              mov edi, 00000002            //注意:這裡edi==2了,這在後面是個標誌
:66010598 7602                    jbe 6601059C                  //跳
:6601059A 8BF9                    mov edi, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:66010598(C)
|
:6601059C 897C2414                mov dword ptr [esp+14], edi  //注意:[esp+14]==2,這在後面也會用到
....
又經過一段判別無效字元的程式,來到這裡

:660105BD 8A0A                    mov cl, byte ptr [edx]      //取出第六個字元
:660105BF 42                      inc edx                                
:660105C0 8954241C                mov dword ptr [esp+1C], edx
:660105C4 33C0                    xor eax, eax                    //eax -> 0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:660105D2(C)
|
:660105C6 3A88BCA40166            cmp cl, byte ptr [eax+6601A4BC] //-------------->
:660105CC 7410                    je 660105DE                      //這個小迴圈的作用是在“56JWR7UK9AY34QHE”這個字串中
:660105CE 40                      inc eax                          //中查詢和你輸入的第5個字元相等的字元在這個字串中的位置,
:660105CF 83F811                  cmp eax, 00000011                  //結果記錄在eax中。相當於Delphi/BCB中的StrPos()
:660105D2 7CF2                    jl 660105C6                    //<---------------

如果找到,就跳來這裡:
:660105DE 83F811                  cmp eax, 00000011
:660105E1 7D95                    jge 66010578
:660105E3 83F810                  cmp eax, 00000010
:660105E6 7790                    ja 66010578

:660105DE 83F811                  cmp eax, 00000011      //------〉
:660105E1 7D95                    jge 66010578          //如果同最後一個字元相同或是沒找到,註冊失敗
:660105E3 83F810                  cmp eax, 00000010
:660105E6 7790                    ja 66010578            //<-----

又經過一段判別無效字元的程式,再找出第6,7個字元在“56JWR7UK9AY34QHE”這個串中的位置。分別記錄在ebp,ebx之中,
當然,如果ebp<11||ebx<11,註冊失敗,同上面一樣,下面也是如此。
。。。。
:66010688 33F6                    xor esi, esi          //esi-->0
:6601068A 85FF                    test edi, edi          //然後這裡檢查edi的值了,記得嗎,是2
:6601068C 765C                    jbe 660106EA
。。。。
又經過一段判別無效字元的程式,再找出第8個字元在“56JWR7UK9AY34QHE”這個串中的位置。記錄在eax中,如果eax<11,執行下面一段程式。
.....
:660106DF 8B442414                mov eax, dword ptr [esp+14]  //記得嗎,上面也說過,[esp+14] = 2,
:660106E3 46                      inc esi                      //這句話在一個迴圈體內,加兩次後esi==eax==2
:660106E4 3BF0                    cmp esi, eax                
:660106E6 7306                    jnb 660106EE                    //不跳。但從下一行開始迴圈,知道在此行跳出為止
:660106E8 EBA4                    jmp 6601068E                    //跳,如此迴圈,直到自上面一行跳出。
。。。
又經過一段判別無效字元的程式,再找出第10個字元在“56JWR7UK9AY34QHE”這個串中的位置,記錄在eax中,如果eax<11,執行下面一段程式。
:6601072C B910000000              mov ecx, 00000010  //-->
:66010731 2BCB                    sub ecx, ebx        //檢查EBX+EAX是否等於16,不等則註冊失敗。
:66010733 3BC1                    cmp eax, ecx        //其中EBX為第7個字元在“56JWR7UK9AY34QHE”這個串中的位置
:66010735 0F853DFEFFFF            jne 66010578        //<---

到此為止,雖然註冊碼的檢查還沒有完,但其所有的檢查方式都已經出現,羅嗦了這麼多,也不想再說了,如果有哪位朋友還有什麼問題或者什麼不同的意見,歡迎交流。
公佈一下找到的註冊號:
                    Sorbet V1.1
                sn:    RK65KKKKKKKK
                        
                        國慶快樂!                
                                                    傲世男兒
                                                          2000/09/30

相關文章