• 标 题:用ollydbg破解就是爽,贴出超级屏捕的破解过程和算法分析,请大家多多指教!! (15千字)
  • 作 者:turkey99
  • 时 间:2001-12-20 20:43:27
  • 链 接:http://bbs.pediy.com

超级屏捕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+ECX-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

欢迎转载,请保持其完整性!