【破文标题】*****小精灵(专业版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、整个注册要面对一大堆垃圾,实在是烦人,最后却是明码。。。晕死,注册机有兴趣的人自己去写,我是没体了,呵呵,第一次写这么多,真累人。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)