【破文标题】王子网页转换小精灵(专业版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-------上面一大窜垃圾就是为了这个,主要是实现取机器码中间这段字符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,跟进又是一大堆垃圾,这里就不写,主要是将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、整个注册要面对一大堆垃圾,实在是烦人,最后却是明码。。。晕死,注册机有兴趣的人自己去写,我是没体了,呵呵,第一次写这么多,真累人。