| 
 | 
 
【破文标题】*****小精灵(专业版V1.2.7)算法分析 
【破文作者】yzslly 
【软件名称】王子网页转换小精灵 
【下载地址】http://shareware.skycn.com/soft/5085.htm 
【破解工具】od,peid 
【注册方式】序列号 
【加壳方式】NsPack V1.4 -> LiuXingPing * 
【软件限制】功能限制 
【破解声明】初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教! 
 
---------------------------------------------------- 
软件介绍: 
  你喜欢制作chm电子书吗?想把文件批量转换为网页格式吗?想要一个漂亮的电子相册吗?...  
主要功能:网页制作,网页批量转换,电子书制作,文件分割合并,文件加密解密,其它省略,(一大堆我晕)  
 
【破解分析】 
1、    壳很简单,就不多说了,注意有大小校验就行了 
2、    注册过程:  
机器码:08613E22D36JMJQIORNOL684,输入a123456-bbbbb-ccccc-ddddd-eeeee-fffff-g7890123,不用输入“-”号 
根据系统的注册出错提示,找到这里: 
0063D0E6   > \8B0B         mov ecx,dword ptr ds:[ebx] 
0063D0E8   . 8D95 4CFFFFFF lea edx,dword ptr ss:[ebp-B4] 
0063D0EE   . 52         push edx 
0063D0EF   . 53         push ebx 
0063D0F0   . FF91 04070000   call dword ptr ds:[ecx+704]----------下断,算法所在,跟进 
0063D0F6   . 3BC7       cmp eax,edi 
0063D0F8   . 7D 12       jge short prince_e.0063D10C 
0063D0FA   . 68 04070000   push 704 
0063D0FF   . 68 F4274300   push prince_e.004327F4 
0063D104   . 53         push ebx 
0063D105   . 50         push eax 
0063D106 1590104000 call dword ptr ds:[<&MSVBVM60.__vbaHr>; MSVBVM60.__vbaHresultCheckObj 
0063D10C   > 66:39BD 4CFFFF>cmp word ptr ss:[ebp-B4],di 
0063D113   . 0F85 DD000000 jnz prince_e.0063D1F6           ; 没跳OVER,,出现失败提示。 
跟进后,一路F8来到这里: 
0063684E   > /66:8B45 DC   mov ax,word ptr ss:[ebp-24] 
00636852   . |66:0385 28FDFF>add ax,word ptr ss:[ebp-2D8] 
00636859   . |0F80 18270000 jo prince_e.00638F77 
。。。。。。。。。] 
0063696C   > \C785 A0FCFFFF >mov dword ptr ss:[ebp-360],0 
00636976   > 8B4D C0     mov ecx,dword ptr ss:[ebp-40] 
00636979   . 898D 04FDFFFF mov dword ptr ss:[ebp-2FC],ecx 
0063697F   . C745 C0 000000>mov dword ptr ss:[ebp-40],0 
00636986   . 8B95 04FDFFFF mov edx,dword ptr ss:[ebp-2FC] 
0063698C   . 8995 38FFFFFF mov dword ptr ss:[ebp-C8],edx 
00636992   . C785 30FFFFFF >mov dword ptr ss:[ebp-D0],8 
0063699C   . 8D85 30FFFFFF lea eax,dword ptr ss:[ebp-D0] 
006369A2   . 50         push eax 
006369A3   . 8D8D 20FFFFFF lea ecx,dword ptr ss:[ebp-E0] 
006369A9   . 51         push ecx 
006369AA   . FF15 04114000 call dword ptr ds:[<&MSVBVM60.rtcTrim>; MSVBVM60.rtcTrimVar 
006369B0   . C785 E8FDFFFF >mov dword ptr ss:[ebp-218],prince_e.0>; - 
。。。。。。 
00636A64   .^ E9 E5FDFFFF   jmp prince_e.0063684E 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
上面这个功能是将输入的注册码用“-”连接,下面还有一处也是用“-”把注册码相边,真是又臭又长。 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
上面这些没什么用,一路F8狂下,来到这里: 
00636F99   . 8BD0       mov edx,eax                   ; 中间部分相连完成 
00636F9B   . 8D4D D4     lea ecx,dword ptr ss:[ebp-2C] 
。。。。。。。 
00636FDD   . C745 FC 0D0000>mov dword ptr ss:[ebp-4],0D 
00636FE4   . BA 9C284300   mov edx,prince_e.0043289C         ; woyouyilianyoumeng1998 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
这窜字符窜不知是啥用,估计是计算机器码的,没有跟。 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
00636FE9   . 8D4D C0     lea ecx,dword ptr ss:[ebp-40] 
00636FEC   . FF15 90124000 call dword ptr ds:[<&MSVBVM60.__vbaSt>; MSVBVM60.__vbaStrCopy 
00636FF2   . 8D55 C0     lea edx,dword ptr ss:[ebp-40] 
00636FF5   . 52         push edx 
00636FF6   . E8 5500FDFF   call prince_e.00607050 -----不知啥用,没有跟,跟进走一断就出错,呵呵 
00636FFB   . 33C9       xor ecx,ecx 
00636FFD   . 66:3D FFFF   cmp ax,0FFFF 
00637001   . 0F94C1       sete cl 
00637004   . F7D9       neg ecx 
再一路F8狂下,来到 
00638774   > \C785 F8FBFFFF >mov dword ptr ss:[ebp-408],0 
0063877E   > C785 98FEFFFF >mov dword ptr ss:[ebp-168],3 
00638788   . C785 90FEFFFF >mov dword ptr ss:[ebp-170],2 
00638792   . 8B55 A0     mov edx,dword ptr ss:[ebp-60] 
00638795   . 8995 BCFCFFFF mov dword ptr ss:[ebp-344],edx 
0063879B   . C745 A0 000000>mov dword ptr ss:[ebp-60],0 
006387A2   . 8B85 BCFCFFFF mov eax,dword ptr ss:[ebp-344] 
006387A8   . 8985 A8FEFFFF mov dword ptr ss:[ebp-158],eax 
006387AE   . C785 A0FEFFFF >mov dword ptr ss:[ebp-160],8 
006387B8   . 8D8D 90FEFFFF lea ecx,dword ptr ss:[ebp-170] 
006387BE   . 51         push ecx 
006387BF   . 6A 02       push 2 
006387C1   . 8D95 A0FEFFFF lea edx,dword ptr ss:[ebp-160] 
006387C7   . 52         push edx 
006387C8   . 8D85 80FEFFFF lea eax,dword ptr ss:[ebp-180] 
006387CE   . 50         push eax 
006387CF   . FF15 38114000 call dword ptr ds:[<&MSVBVM60.rtcMidC>; MSVBVM60.rtcMidCharVar 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
上面这段是实现取注册码第一段第2个位字符开始的3个字符,即“123” 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
006387D5   . C785 68FEFFFF >mov dword ptr ss:[ebp-198],80020004 
006387DF   . C785 60FEFFFF >mov dword ptr ss:[ebp-1A0],0A 
006387E9   . 8B4D 9C     mov ecx,dword ptr ss:[ebp-64]------最后一段注册码 
006387EC   . 898D B8FCFFFF mov dword ptr ss:[ebp-348],ecx 
006387F2   . C745 9C 000000>mov dword ptr ss:[ebp-64],0 
006387F9   . 8B95 B8FCFFFF mov edx,dword ptr ss:[ebp-348] 
006387FF   . 8995 78FEFFFF mov dword ptr ss:[ebp-188],edx 
00638805   . C785 70FEFFFF >mov dword ptr ss:[ebp-190],8 
0063880F   . 8D85 60FEFFFF lea eax,dword ptr ss:[ebp-1A0] 
00638815   . 50         push eax 
00638816   . 6A 02       push 2 
00638818   . 8D8D 70FEFFFF lea ecx,dword ptr ss:[ebp-190] 
0063881E   . 51         push ecx 
0063881F   . 8D95 50FEFFFF lea edx,dword ptr ss:[ebp-1B0] 
00638825   . 52         push edx 
00638826   . FF15 38114000 call dword ptr ds:[<&MSVBVM60.rtcMidC>; MSVBVM60.rtcMidCharVar 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
这一段是取最后一段注册码从第2位开始的注册码,即“7890123” 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
0063882C   . 8D85 50FEFFFF lea eax,dword ptr ss:[ebp-1B0] 
。。。。。。。。。。。。。。。。。。 
0063885C   . FF15 30104000 call dword ptr ds:[<&MSVBVM60.__vbaSt>; MSVBVM60.__vbaStrVarMove--------这里完成对上述两窜字符窜的联接,即1237890123 
00638862   . 8BD0       mov edx,eax 
00638864   . 8D4D 98     lea ecx,dword ptr ss:[ebp-68] 
00638867   . FF15 24134000 call dword ptr ds:[<&MSVBVM60.__vbaSt>; MSVBVM60.__vbaStrMove 
0063886D   . 8D55 98     lea edx,dword ptr ss:[ebp-68] 
00638870   . 52         push edx 
00638871   . E8 2A5A0000   call prince_e.0063E2A0-----对所得字符窜每位+1,变成2348901234,记为a,关键的数值之一。 
再往下, 
。。。。。。。。。。。。。。。 
00638BAB   . 8BD0       mov edx,eax-------上面一大窜LJ就是为了这个,主要是实现取机器码中间这段字符JMJQIORNOL 
00638BAD   . 8D4D 8C     lea ecx,dword ptr ss:[ebp-74] 
00638BB0   . FF15 24134000 call dword ptr ds:[<&MSVBVM60.__vbaSt>; MSVBVM60.__vbaStrMove 
00638BB6   . 8D45 8C     lea eax,dword ptr ss:[ebp-74] 
00638BB9   . 50         push eax 
00638BBA   . E8 315C0000   call prince_e.0063E7F0           ; 算法1,跟进又是一大堆LJ,这里就不写,主要是将JMJQIORNOL每位的ASC减去19后得到一窜数字,记为b,像这里b= 1418069563 
。。。。。。。。。。。. 
00638BF1   . E8 6A630000   call prince_e.0063EF60 
。。。。。。。。。。。。。。 
00638C09   . E8 52630000   call prince_e.0063EF60 
.。。。。。。。。。。。。 
00638C21   . E8 3A630000   call prince_e.0063EF60 
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
这里有3个比较,第一个比较是比较注册码第一位a是否等于机器码的第6位“E”,第二个是比较注册码的最后一段的第一位”g”即是否等于机器码的最后一位”4”。上面这2个比较是怎么来,具体就不分析,自己跟一下,最后一个比较是比较上述字符窜a是否等于b 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
。。。。。。。。如果上面三个比较相符,下面这个跳转就不会实现,否则OVER。 
00638D86   . /74 11       je short prince_e.00638D99 
00638D88   . |C745 FC 1B0000>mov dword ptr ss:[ebp-4],1B 
00638D8F   . |66:C745 D8 000>mov word ptr ss:[ebp-28],0 
00638D95   . |EB 35       jmp short prince_e.00638DCC 
00638D97   . |EB 33       jmp short prince_e.00638DCC 
00638D99   > \C745 FC 1E0000>mov dword ptr ss:[ebp-4],1E 
00638DA0   . 8B4D D4     mov ecx,dword ptr ss:[ebp-2C]-----中间部分的注册码 
00638DA3   . 51         push ecx 
00638DA4   . E8 E7640000   call prince_e.0063F290-------算法2,跟进 
00638DA9   . 0FBFD0       movsx edx,ax 
00638DAC   . 85D2       test edx,edx 
00638DAE   . 75 0F       jnz short prince_e.00638DBF----没跳OVER 
跟进来到: 
。。。。。。。 
0063F30B   . 8B45 A8     mov eax,dword ptr ss:[ebp-58] 
0063F30E   . 50         push eax 
0063F30F   . FF15 2C104000 call dword ptr ds:[<&MSVBVM60.__vbaLe>; MSVBVM60.__vbaLenBstr 
0063F315   . 83F8 1D     cmp eax,1D       ; 比较长度是否等于29,含“-” 
0063F318   . 74 0D       je short prince_e.0063F327         ; 不跳OVER 
。。。。。。。。。。 
0063F32F   . 68 50AA4200   push prince_e.0042AA50           ; 0 
0063F334   . 68 7C284300   push prince_e.0043287C           ; - 
0063F339   . 51         push ecx 
0063F33A   . FF15 F8114000 call dword ptr ds:[<&MSVBVM60.rtcRepl>; MSVBVM60.rtcReplace 
0063F340   . 8B35 24134000 mov esi,dword ptr ds:[<&MSVBVM60.__vb>; MSVBVM60.__vbaStrMove 
0063F346   . 8BD0       mov edx,eax                   ; "-"替换成0 
。。。。。 
0063F367   . FF15 70114000 call dword ptr ds:[<&MSVBVM60.rtcIsNu>; MSVBVM60.rtcIsNumeric 
0063F36D   . 66:85C0     test ax,ax---注册码如果是纯数字,就OVER 
0063F370   . 74 0D       je short prince_e.0063F37F         ; 不跳OVER 
。。。。。。。。 
0063F466   . 66:8BD0     mov dx,ax                 ; 字符窜的最后一位ASC,为a 
0063F469   . 8D8D 74FFFFFF lea ecx,dword ptr ss:[ebp-8C] 
0063F46F   . 8D45 9C     lea eax,dword ptr ss:[ebp-64] 
0063F472   . 51         push ecx 
0063F473   . 50         push eax 
0063F474   . 66:8995 0EFFFF>mov word ptr ss:[ebp-F2],dx 
0063F47B   . FFD3       call ebx                 ; <&MSVBVM60.__vbaStrVarVal> 
0063F47D   . 50         push eax 
0063F47E   . FF15 5C104000 call dword ptr ds:[<&MSVBVM60.rtcAnsi>;  
0063F484   . 66:8B95 0EFFFF>mov dx,word ptr ss:[ebp-F2] 
0063F48B   . 66:8BC8     mov cx,ax                   ; ax是第21位ASC码, 为b 
0063F48E   . 66:2BCA     sub cx,dx ------b-a 
0063F491   . 0F80 DE1A0000 jo prince_e.00640F75 
0063F497   . FF15 6C104000 call dword ptr ds:[<&MSVBVM60.__vbaI2>; MSVBVM60.__vbaI2Abs 
0063F49D   . 66:8BC8     mov cx,ax-------------ax为差值的绝对值 
0063F4A0   . 66:83C1 30   add cx,30--------------再加上30 
0063F4A4   . 0F80 CB1A0000 jo prince_e.00640F75 
。。。。。。。。。。。。。下面有10几个循环是用来对注册码进行调位,跟的我半死,但是最后却出个明码,晕死我也,具体如何调位,我这里不分析了,太长了,自己跟吧,最后来到。。。。。。。 
00640EE5   . 8B4D A8     mov ecx,dword ptr ss:[ebp-58] 
00640EE8   . 50         push eax 
00640EE9   . 51         push ecx 
00640EEA   . FF15 5C114000 call dword ptr ds:[<&MSVBVM60.__vbaSt>; 关键比较 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
如果经过调位后所得的注册码=原始输入的注册码,注册成功。通过对比和跟踪,你会发现中间这段注册码每个注册段的头尾是用来调位运算的,因此调整前后是不变的,只要把系统调整后的注册码作为我们的注册码,注册就OK了,不然具体去分析如何调位,估计累死,我分析了一半多,实在没耐心了。有兴趣的可以自己去分析。  
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
【总结】 
1、    将注册码第一段的2-4位和最后一段的2-8位窜接,每位加上1得到A 
2、    将机器码的第12-21位的ASC减去19得到一窜数字,记为B 
3、    判断注册码的第一位=机器码的第6位 
判断注册码最后一段的第一位=机器码的最后一位 
判断A=B 
三者都相等,进入中间段比较 
4、中间注册码的比较,中间的数位必须是25位,即每段5位(不含“-“),而且不能全为数字,是根据每段注册码的头尾ASC码这差,作为调位的依据,在整个调位过程中,头尾注册码是保持不变的,调位后的注册码记为C,如果C等于原始输入注册码的中间段时注册成功。 
5、整个注册要面对一大堆LJ,实在是烦人,最后却是明码。。。晕死,注册机有兴趣的人自己去写,我是没体了,呵呵,第一次写这么多,真累人。 
 
[ 本帖最后由 yzslly 于 2006-11-29 15:51 编辑 ] |   
 
 
 
 |