用ollydbg破解就是爽,貼出超級屏捕的破解過程和演算法分析,請大家多多指教!! (15千字)

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

超級屏捕3.0
    一個很方便的螢幕捕捉軟體,功能比較強大。雖然12月10號才釋出3.0版,可是網上關於它的序號產生器已經是滿天飛了,呵呵,有點恐怖,那些共享軟體的作者沒的活了。別人都已經寫出序號產生器了,我還破它幹什麼啊,沒關係,我只是為了練習使用ollybdg這個特棒的除錯軟體而已。想像一下,一遍聽著mp3,一遍破著軟體,什麼紙啊,筆啊都不需要,那種感覺有多奇妙啊,一個字,爽!!!
    好了,廢話少說,開始動手了,come on。
    執行ollydbg,load超級屏捕3.0 ,裝載完畢後,ollydbg自己就中斷下來了,此時,螢幕共分四個視窗,左上角是彙編區,右上角是暫存器區,左下角是記憶體區,右下角是什麼呢,我也不太清楚,不知道誰能告訴我。
哦,忘了說了,超級屏捕是用vc++寫的,沒有加殼,呵呵,作者好大方啊!!
    好了,破解開始了,在左上角點滑鼠右鍵,在彈出的選單中選擇查詢->所有參考文字字串。ollydbg開啟一個新視窗,哇哈,滿板的英文,眼睛都看花了。沒關係,點滑鼠右鍵,選擇search for text,彈出一個對話方塊,在對話方塊中輸入Incomplete or incorrect Registration-Number. Please input again!  當然,你可以不用輸這麼多,一部分就可以了。對話方塊中還有兩個選項,一個是區分大小寫,一個是全範圍查詢,自己看著辦拉。然後點確定,找到後,程式會將游標停在那一行上,如果不是你想要的那句話,就安ctrl+l繼續查詢,知道找到為止。好了,找到那句話後,在那一行上面點滑鼠右鍵,選擇toggle breakpoint或這按F2設定斷點。現在關閉這個視窗,回到ollydbg的主介面,點選除錯選單,選擇執行,或者直接按F9執行程式。
    現在出現超級屏捕的註冊畫面,隨便填入一些註冊碼,然後點選確定,程式被ollydbg中斷,游標停留在我門設的那個斷點上,如下:
004200D0    .>SUB ESP,8D4
004200D6    .>XOR EAX,EAX
004200D8    .>PUSH EBX
004200D9    .>MOV EBX,ECX
004200DB    .>PUSH EDI
004200DC    .>MOV ECX,8
004200E1    .>LEA EDI,DWORD PTR SS:[ESP+8]
004200E5    .>PUSH 20
004200E7    .>REP STOS DWORD PTR ES:[EDI]
004200E9    .>LEA EAX,DWORD PTR SS:[ESP+C]
004200ED    .>MOV ECX,EBX
004200EF    .>PUSH EAX
004200F0    .>PUSH 48D
004200F5    .>CALL SUPERCAP.004934BE
004200FA    .>TEST EAX,EAX
004200FC    .>JE SUPERCAP.00420188
00420102    .>PUSH SUPERCAP.004DFBCC  //ASCII "SC30"
00420107    .>LEA ECX,DWORD PTR SS:[ESP+C]
0042010B    .>PUSH 1
0042010D    .>PUSH ECX
0042010E    .>LEA EDX,DWORD PTR DS:[EBX+248]
00420114    .>PUSH 1
00420116    .>PUSH EDX
00420117    .>CALL SUPERCAP.0041EE30  //這個就是關鍵計算對比call了,決定你的命運如何,進去看看
0042011C    .>ADD ESP,14
0042011F    .>TEST EAX,EAX            //看註冊成功與否
00420121    .>JE SHORT SUPERCAP.00420188  //發現是這個跳,讓我們voer了,呵呵,不跳就註冊成功,當然程式在後面還會有一個校驗,不管它了,向上看
00420123    .>LEA EAX,DWORD PTR SS:[ESP+28]
00420127    .>PUSH ESI
00420128    .>PUSH EAX
00420129    .>CALL SUPERCAP.0041A880
0042012E    .>LEA EDI,DWORD PTR SS:[ESP+10]
00420132    .>OR ECX,FFFFFFFF
00420135    .>XOR EAX,EAX
00420137    .>LEA EDX,DWORD PTR SS:[ESP+1CC]
0042013E    .>REPNE SCAS BYTE PTR ES:[EDI]
00420140    .>NOT ECX
00420142    .>SUB EDI,ECX
00420144    .>MOV EAX,ECX
00420146    .>MOV ESI,EDI
00420148    .>MOV EDI,EDX
0042014A    .>SHR ECX,2
0042014D    .>REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
0042014F    .>MOV ECX,EAX
00420151    .>AND ECX,3
00420154    .>REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
00420156    .>LEA ECX,DWORD PTR SS:[ESP+30]
0042015A    .>PUSH ECX
0042015B    .>CALL SUPERCAP.0041A8C0
00420160    .>MOV ECX,DWORD PTR DS:[EBX+268]
00420166    .>ADD ESP,8
00420169    .>PUSH 0
0042016B    .>PUSH 40
0042016D    .>PUSH SUPERCAP.004E28BC  //ASCII "Registe Ok!"發現這裡有句註冊成功的話,向下看看
00420172    .>CALL SUPERCAP.0041C660
00420177    .>MOV ECX,EBX
00420179    .>CALL SUPERCAP.0048FFC4
0042017E    .>POP ESI
0042017F    .>POP EDI
00420180    .>POP EBX
00420181    .>ADD ESP,8D4
00420187    .>RETN                //這裡程式就返回上一級了,所以再向上找,看是那個跳轉跳過了此斷程式碼
00420188    >>MOV ECX,DWORD PTR DS:[EBX+268]
0042018E    .>PUSH 0
00420190    .>PUSH 10
00420192    .>PUSH SUPERCAP.004E2878    //ASCII "Incomplete or incorrect Registration-Number. Please input again!" 第一次被ollydbg中斷時,游標停留在這裡,下面的call就是秀出註冊失敗的畫面,所以向上看,尋找可跳過這些程式碼的跳轉
00420197    .>CALL SUPERCAP.0041C660
0042019C    .>POP EDI
0042019D    .>POP EBX
0042019E    .>ADD ESP,8D4
004201A4    .>RETN

好了,我們00420117  CALL SUPERCAP.0041EE30這個call上下斷,重新執行一遍程式,程式被中斷下來,此時看看右上角的視窗,看到了什麼,呵呵,你的假碼和你的註冊碼,好,按F7跟進去,來到如下地方:
0041EE30  /$>SUB ESP,80
0041EE36  |.>MOV ECX,8
0041EE3B  |.>XOR EAX,EAX
0041EE3D  |.>PUSH EBX
0041EE3E  |.>PUSH ESI
0041EE3F  |.>PUSH EDI
0041EE40  |.>LEA EDI,DWORD PTR SS:[ESP+6C]
0041EE44  |.>REP STOS DWORD PTR ES:[EDI]
0041EE46  |.>MOV ECX,8
0041EE4B  |.>LEA EDI,DWORD PTR SS:[ESP+2C]
0041EE4F  |.>REP STOS DWORD PTR ES:[EDI]
0041EE51  |.>MOV ECX,8
0041EE56  |.>LEA EDI,DWORD PTR SS:[ESP+4C]
0041EE5A  |.>REP STOS DWORD PTR ES:[EDI]
0041EE5C  |.>MOV ECX,8
0041EE61  |.>LEA EDI,DWORD PTR SS:[ESP+C]
0041EE65  |.>REP STOS DWORD PTR ES:[EDI]
0041EE67  |.>MOV EAX,DWORD PTR SS:[ESP+94]
0041EE6E  |.>TEST EAX,EAX
0041EE70  |.>JE SHORT SUPERCAP.0041EE89
0041EE72  |.>MOV ECX,DWORD PTR SS:[ESP+90]
0041EE79  |.>LEA EAX,DWORD PTR SS:[ESP+C]
0041EE7D  |.>PUSH EAX
0041EE7E  |.>PUSH ECX
0041EE7F  |.>CALL SUPERCAP.0041EC20  //此call是將機器ID中的“-”去掉
0041EE84  |.>ADD ESP,8
0041EE87  |.>JMP SHORT SUPERCAP.0041EEB1
上面這一段程式碼就是將你的機器碼中的“-”去掉,沒必要關心它是怎麼做到的,繼續往下走,程式跳到這裡:
0041EEB1  |>>MOV EAX,DWORD PTR SS:[ESP+9C]
0041EEB8  |.>TEST EAX,EAX
0041EEBA  |.>JE SHORT SUPERCAP.0041EED3
0041EEBC  |.>MOV EDX,DWORD PTR SS:[ESP+98] //取輸入的註冊碼放到edx
0041EEC3  |.>LEA ECX,DWORD PTR SS:[ESP+2C]
0041EEC7  |.>PUSH ECX
0041EEC8  |.>PUSH EDX
0041EEC9  |.>CALL SUPERCAP.0041EC20  //此call跟上面一樣,去掉輸入註冊碼中的“-” ,所以到這裡我們就知道,註冊碼的形式為XXXX-XXXX-XXXX-XXXX
0041EECE  |.>ADD ESP,8
0041EED1  |.>JMP SHORT SUPERCAP.0041EEFB
這段程式碼告訴我們註冊碼的形式為XXXX-XXXX-XXXX-XXXX ,沒什麼有價值的資訊,繼續往下走,跳到這裡:
0041EEFB  |>>MOV EDI,DWORD PTR SS:[ESP+A0] //SUPERCAP.004DFBCC
0041EF02  |.>OR ECX,FFFFFFFF
0041EF05  |.>XOR EAX,EAX
0041EF07  |.>LEA EDX,DWORD PTR SS:[ESP+4C]
0041EF0B  |.>REPNE SCAS BYTE PTR ES:[EDI]
0041EF0D  |.>NOT ECX
0041EF0F  |.>SUB EDI,ECX
0041EF11  |.>MOV EAX,ECX
0041EF13  |.>MOV ESI,EDI
0041EF15  |.>MOV EDI,EDX
0041EF17  |.>LEA EDX,DWORD PTR SS:[ESP+6C]
0041EF1B  |.>SHR ECX,2
0041EF1E  |.>REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
0041EF20  |.>MOV ECX,EAX
0041EF22  |.>LEA EAX,DWORD PTR SS:[ESP+C] //將去掉-的機器ID放到eax
0041EF26  |.>AND ECX,3
0041EF29  |.>REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0041EF2B  |.>LEA ECX,DWORD PTR SS:[ESP+4C] //將“SC30”放到ecx
0041EF2F  |.>PUSH ECX
0041EF30  |.>PUSH 0
0041EF32  |.>PUSH EDX
0041EF33  |.>PUSH 0
0041EF35  |.>PUSH EAX
0041EF36  |.>CALL SUPERCAP.0041ED50  //此call將機器ID作一些變換,然後據此計算註冊碼,要寫序號產生器就跟進去!!!
0041EF3B  |.>ADD ESP,14
0041EF3E  |.>LEA ESI,DWORD PTR SS:[ESP+2C]//esi中放有錯誤的註冊碼,已經去掉“-”
0041EF42  |.>LEA EAX,DWORD PTR SS:[ESP+6C]//eax中放有正確的註冊碼,已經去掉“-”
0041EF46  |>>MOV DL,BYTE PTR DS:[EAX]//正確註冊碼第一位放到dl
0041EF48  |.>MOV BL,BYTE PTR DS:[ESI]//錯誤註冊碼第一位放到bl
0041EF4A  |.>MOV CL,DL    //正確註冊碼第一位放到cl
0041EF4C  |.>CMP DL,BL    //比較註冊碼的第一位
0041EF4E  |.>JNZ SHORT SUPERCAP.0041EF7F  //不對就去死
0041EF50  |.>TEST CL,CL  //看cl是不是為空
0041EF52  |.>JE SHORT SUPERCAP.0041EF6A  //cl為空,對比結束,否則繼續
0041EF54  |.>MOV DL,BYTE PTR DS:[EAX+1]  //正確註冊碼的eax+1位放到
0041EF57  |.>MOV BL,BYTE PTR DS:[ESI+1]  //錯誤註冊碼的esi+1位放到
0041EF5A  |.>MOV CL,DL    //dl的值放到cl
0041EF5C  |.>CMP DL,BL    //對比註冊碼,BL
0041EF5E  |.>JNZ SHORT SUPERCAP.0041EF7F //不相等就去死
0041EF60  |.>ADD EAX,2    //eax加2
0041EF63  |.>ADD ESI,2    //esi加2
0041EF66  |.>TEST CL,CL  //看cl是不是空
0041EF68  |.>JNZ SHORT SUPERCAP.0041EF46 //cl不為空就跳,否則對比結束
0041EF6A  |>>XOR EAX,EAX
0041EF6C  |.>XOR ECX,ECX
0041EF6E  |.>TEST EAX,EAX
0041EF70  |.>SETE CL
0041EF73  |.>POP EDI
0041EF74  |.>POP ESI
0041EF75  |.>MOV EAX,ECX
0041EF77  |.>POP EBX
0041EF78  |.>ADD ESP,80
0041EF7E  |.>RETN
只要註冊碼的話,到這裡就達到目的了,不過我還想看看它的演算法,進入
0041EF36  |.>CALL SUPERCAP.0041ED50這個call,
來到這裡:
0041ED50  /$>SUB ESP,28
0041ED53  |.>XOR EAX,EAX
0041ED55  |.>XOR ECX,ECX
0041ED57  |.>MOV DWORD PTR SS:[ESP+14],EAX
0041ED5B  |.>MOV DWORD PTR SS:[ESP],ECX
0041ED5F  |.>MOV DWORD PTR SS:[ESP+18],EAX
0041ED63  |.>MOV DWORD PTR SS:[ESP+4],ECX
0041ED67  |.>MOV DWORD PTR SS:[ESP+1C],EAX
0041ED6B  |.>MOV DWORD PTR SS:[ESP+8],ECX
0041ED6F  |.>MOV DWORD PTR SS:[ESP+20],EAX
0041ED73  |.>MOV DWORD PTR SS:[ESP+C],ECX
0041ED77  |.>MOV BYTE PTR SS:[ESP+24],AL
0041ED7B  |.>MOV EAX,DWORD PTR SS:[ESP+30]
0041ED7F  |.>PUSH ESI
0041ED80  |.>PUSH EDI
0041ED81  |.>TEST EAX,EAX
0041ED83  |.>MOV BYTE PTR SS:[ESP+18],CL
0041ED87  |.>LEA EDX,DWORD PTR SS:[ESP+8]
0041ED8B  |.>JE SHORT SUPERCAP.0041ED9D
0041ED8D  |.>MOV EAX,DWORD PTR SS:[ESP+34]
0041ED91  |.>PUSH EDX
0041ED92  |.>PUSH EAX
0041ED93  |.>CALL SUPERCAP.0041EC20
0041ED98  |.>ADD ESP,8
0041ED9B  |.>JMP SHORT SUPERCAP.0041EDBE
0041ED9D  |>>MOV EDI,DWORD PTR SS:[ESP+34]
0041EDA1  |.>OR ECX,FFFFFFFF
0041EDA4  |.>XOR EAX,EAX
0041EDA6  |.>REPNE SCAS BYTE PTR ES:[EDI]
0041EDA8  |.>NOT ECX
0041EDAA  |.>SUB EDI,ECX
0041EDAC  |.>MOV EAX,ECX
0041EDAE  |.>MOV ESI,EDI
0041EDB0  |.>MOV EDI,EDX
0041EDB2  |.>SHR ECX,2
0041EDB5  |.>REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
0041EDB7  |.>MOV ECX,EAX
0041EDB9  |.>AND ECX,3
0041EDBC  |.>REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0041EDBE  |>>MOV EAX,DWORD PTR SS:[ESP+44]  //eax中存放這“SC30”
0041EDC2  |.>LEA ECX,DWORD PTR SS:[ESP+1C]
0041EDC6  |.>LEA EDX,DWORD PTR SS:[ESP+8]  //edx中存放著去掉“-”的機器碼0041EDCA  |.>PUSH ECX
0041EDCB  |.>PUSH EDX
0041EDCC  |.>PUSH EAX
0041EDCD  |.>CALL SUPERCAP.0041EAE0 //此call就是計算註冊碼的演算法call了
0041EDD2  |.>MOV EAX,DWORD PTR SS:[ESP+4C]
0041EDD6  |.>ADD ESP,C
0041EDD9  |.>TEST EAX,EAX
0041EDDB  |.>JE SHORT SUPERCAP.0041EDFA
0041EDDD  |.>MOV ECX,DWORD PTR SS:[ESP+3C]
0041EDE1  |.>LEA EDX,DWORD PTR SS:[ESP+1C]
0041EDE5  |.>PUSH ECX
0041EDE6  |.>PUSH EDX
0041EDE7  |.>CALL SUPERCAP.0041EBF0
0041EDEC  |.>ADD ESP,8
0041EDEF  |.>MOV EAX,1
0041EDF4  |.>POP EDI
0041EDF5  |.>POP ESI
0041EDF6  |.>ADD ESP,28
0041EDF9  |.>RETN
好,快要到核心了,繼續,進入到0041EDCD  |.>CALL SUPERCAP.0041EAE0這個call,如下:
0041EAE0  /$>SUB ESP,84
0041EAE6  |.>PUSH EBP
0041EAE7  |.>PUSH ESI
0041EAE8  |.>MOV ESI,DWORD PTR SS:[ESP+90]//SS:[ESP+90]存放著“SC30”
0041EAEF  |.>TEST ESI,ESI
0041EAF1  |.>JE SUPERCAP.0041EBE5
0041EAF7  |.>MOV EBP,DWORD PTR SS:[ESP+94]//SS:[ESP+94]存放著機器碼
0041EAFE  |.>TEST EBP,EBP
0041EB00  |.>JE SUPERCAP.0041EBE5
0041EB06  |.>MOV EAX,DWORD PTR SS:[ESP+98]//SS:[ESP+98]存放著什麼啊,不知道,全是00
0041EB0D  |.>TEST EAX,EAX
0041EB0F  |.>JE SUPERCAP.0041EBE5
0041EB15  |.>PUSH EBX
0041EB16  |.>PUSH EDI
0041EB17  |.>MOV EAX,2
0041EB1C  |.>LEA EDX,DWORD PTR SS:[ESP+54]
0041EB20  |.>MOV ECX,F24
0041EB25  |>>LEA EDI,DWORD PTR DS:[EAX+2]
0041EB28  |.>ADD EDX,4
0041EB2B  |.>IMUL EDI,EAX
0041EB2E  |.>ADD EDI,ECX
0041EB30  |.>ADD ECX,E4
0041EB36  |.>INC EAX
0041EB37  |.>MOV DWORD PTR DS:[EDX-4],EDI
0041EB3A  |.>LEA EDI,DWORD PTR DS:[EAX-2]
0041EB3D  |.>CMP EDI,10
0041EB40  |.>JB SHORT SUPERCAP.0041EB25//從0041eb25處到這裡的迴圈不知道是幹什麼的,誰跟我說說,謝謝!!
0041EB42  |.>XOR EBX,EBX
0041EB44  |.>XOR EDX,EDX
0041EB46  |.>MOV EDI,ESI
0041EB48  |.>SUB ESI,EBP 
0041EB4A  |.>LEA ECX,DWORD PTR SS:[ESP+14]
0041EB4E  |.>LEA EAX,DWORD PTR SS:[EBP+1]
0041EB51  |.>MOV DWORD PTR SS:[ESP+10],ESI
0041EB55  |>>MOVSX ESI,BYTE PTR DS:[EAX-1] //此處向下開始將機器ID做變換,此時,DS:[EAX-1]中存放的是機器碼的第一個字元,將它送到ESI
0041EB59  |.>MOVSX EBP,BYTE PTR DS:[EDI]//DS:[EDI]中存放著“SC30”的第一個字元,將它送到EBP
0041EB5C  |.>ADD ESI,EBP //“S”加上機器碼的第DS:[EAX-1]個字元,結果送到ESI
0041EB5E  |.>ADD EDI,2 //EDI加2,EDI中存放著“SC30”
0041EB61  |.>MOVSX EBP,BYTE PTR DS:[EAX]//機器碼的第DS:[eax]字元送到EBP,第一遍經過此行是,是機器碼的第二個字元
0041EB64  |.>MOV DWORD PTR DS:[ECX],ESI//ESI的值送到DWORD PTR DS:[ECX]
0041EB66  |.>MOV ESI,DWORD PTR SS:[ESP+10]//將SS:[ESP+10]的值即8C送到ESI
0041EB6A  |.>ADD ECX,4 //ECX加4
0041EB6D  |.>MOVSX ESI,BYTE PTR DS:[ESI+EAX]//將EAX暫存器中的值加上ESI即加上8C,和送到ESI,執行完此命令後,ESI的值為43,即字元“C”
0041EB71  |.>ADD ESI,EBP //EBP的值即機器碼第DS:[eax]字元的16進位制數加上43,和存放到ESI
0041EB73  |.>ADD EAX,2 //EAX加2
0041EB76  |.>MOV DWORD PTR DS:[ECX+1C],ESI //ESI的值送到DS:[ECX+1C]
0041EB79  |.>MOV EBP,DWORD PTR DS:[ECX-4] //DS:[ECX+4]的值,即機器碼第DS:[EAX-1]個字元加“SC30”的第DS:[EDI]個字元的和,送到EBP
0041EB7C  |.>ADD ESI,EDX //EDX的值加上ESI,和送到ESI
0041EB7E  |.>ADD ESI,EBP //EPD的值加上ESI,和送到ESI
0041EB80  |.>MOV EBP,ESI //ESI的值送到EBP
0041EB82  |.>IMUL EBP,ESI //EBP*ESI,積放在EBP
0041EB85  |.>ADD EBX,EBP //EBX+EBP,和放在EBX
0041EB87  |.>INC EDX  //EDX加1
0041EB88  |.>CMP EDX,8  //EDX與8作比較
0041EB8B  |.>JB SHORT SUPERCAP.0041EB55 //EDX小於8就跳,從0041eb55處到此是將機器ID做變換的程式碼。總結一下它的演算法,設機器碼為J,暫且將它從高到低的每一位設為J0,J1,J2,J3,J4,J5,J6,J7,J8,J9,Ja,Jb,Jc,Jd,Je,Jf,將他們作如下計算:
((J1+C)+(J0+S))^2+((J3+0+1)+(J2+3))^2+((J5+2)+J4)^2+((J7+3)+J6)^2+((J9+4)+J8)^2
+((Jb+5)+Ja)^2+((Jd+6)+Jc)^2+((Jf+7)+Je)^2
最後的結果存放到EBX,後面會用到!!
0041EB8D  |.>MOV EDI,DWORD PTR SS:[ESP+A0]
0041EB94  |.>MOV ECX,1 //用1初始化ECX
0041EB99  |.>XOR ESI,ESI //ESI清零
0041EB9B  |>>MOV EAX,ECX //ECX的值送到EAX,這裡向下開始計算正確註冊碼
0041EB9D  |.>MOV EBP,DWORD PTR SS:[ESP+ESI+14]//SS:[ESP+ESI+14]的值送到EBP,此處SS:[ESP+ESI+14]裡放的是什麼東東,誰能告訴我???
0041EBA1  |.>IMUL EAX,ECX //EAX*ECX,實際上就是求ECX的平方,積送到EAX
0041EBA4  |.>ADD EAX,EBP //EAX加EBP,和送到EAX
0041EBA6  |.>MOV EBP,DWORD PTR SS:[ESP+ESI+54]//SS:[ESP+ESI+54]的值送到EBP,此處SS:[ESP+ESI+54]裡放的是什麼東東,誰能告訴我???
0041EBAA  |.>IMUL EAX,EBX //EAX*EBX,此處的EBX就是上面根據機器碼計算出來的數
0041EBAD  |.>AND EAX,FF //EAX加FF,實際上就是保留EAX的低8位,其它位清零
0041EBB2  |.>XOR EDX,EDX //EDX清零
0041EBB4  |.>ADD EAX,EBP //EAX加EBP,和送到EAX
0041EBB6  |.>MOV EBP,1A //將1A送到EBP
0041EBBB  |.>DIV EBP //EAX整除EBP,餘數送到EDX
0041EBBD  |.>ADD ESI,4 //ESI加4
0041EBC0  |.>MOV AL,DL //將DL的值送到AL,實際上就是將餘數送到EAX
0041EBC2  |.>MOV DWORD PTR SS:[ESP+ESI+10],EDX//EDX的值送到
SS:[ESP+ESI+10]
0041EBC6  |.>ADD AL,41 //AL加41,這就是我們的註冊碼
0041EBC8  |.>MOV BYTE PTR DS:[EDI+ECX-1],AL//AL的值送到DS:[EDI+ECU-1]
0041EBCC  |.>INC ECX //ECX加1
0041EBCD  |.>LEA EDX,DWORD PTR DS:[ECX-1]//DS:[ECX-1]的值送到EDX
0041EBD0  |.>CMP EDX,10 //EDX與10作比較
0041EBD3  |.>JB SHORT SUPERCAP.0041EB9B //EDX小於16就繼續迴圈,從0041eb9b到此處是根據上面換後的機器ID計算正確註冊碼的程式碼。
上面這段程式碼迴圈16次後,就完全計算出了正確的註冊碼,註冊碼放在EDI中,由於有兩個東東不知到是什麼東西,所以呢,演算法就不好總結了,相信大家一看就明白了,很簡單的演算法。不知哪位大哥能告訴我那兩個東西是什麼。
  講了這麼多廢話,終於將它的註冊演算法說完了,還請大家指出其中的錯誤,讓小弟我更上一層樓,在此謝謝了!!           


最後還要說一點廢話:
如果你還想註冊一遍的話,請用ultraedit開啟軟體目錄下的scconfig30.cfg這個檔案,在偏移量為00000190h附近,存放著你的註冊碼,將它全部改為0就又可以註冊了,如果你嫌太麻煩,乾脆就將這個檔案刪了,不過這樣你的個性設定也沒有了!
唉,破這個軟體只費了10分鐘還不到,寫它的破解過程卻花了我一下午的時間,累死我了,希望大家喜歡我寫的文章。 :)

                                    Cracker:Turkey/滅害靈
                                        2001.12.20@20:37

歡迎轉載,請保持其完整性!

相關文章