网络狂飙注册分析--时刻取时间进行反调试
【破解作者】 jsliyangsj
【作者邮箱】 sjcrack@yahoo.com.cn
【使用工具】 peid OllyDbg1.10
【破解平台】 Winxp
【软件名称】 网络狂飙
【软件地址】 http://www.superhsoft.com/Index.htm
【编写语言】 C++

第一次输入:
liyangsj
sjcrack@yahoo.com.cn
123456789012345678901234
查找字符串没有可用的信息,那用用暂停法,在堆栈中找到返回主程序的地址:返回到主程序中,切入关键点:
0044F38A    .  57 push edi                               ;  注册码
0044F38B    .  55 push ebp                               ;  邮箱
0044F38C    .  50 push eax                               ;  用户!
0044F38D    .  E8>call NetSpeed.00401CC1                 ;  这个就是关键点了!!
0044F392    .  83>add esp,0C
0044F395    .  84>test al,al
0044F397    .  0F>jnz NetSpeed.0044F48D                  ;  关键点,要跳
0044F39D    .  6A>push 0
0044F39F    .  8D>lea ecx,dword ptr ss:[esp+64]
………………………………………………………………………………………………………………
进入关键
………………………………………………………………………………………………………………
0044B914    .  F2>repne scas byte ptr es:[edi]
0044B916    .  F7>not ecx
0044B918    .  49 dec ecx                                ;  计算注册码的位数
0044B919    .  51 push ecx                               ;  个数!
0044B91A    .  53 push ebx                               ;  注册码
0044B91B    .  8D>lea ecx,dword ptr ss:[esp+30]
0044B91F    .  E8>call NetSpeed.00401AA5                 ;  只是注册码的转移给了ECX
0044B924    .  53 push ebx
0044B925    .  89>mov dword ptr ss:[esp+54],esi
0044B929    .  E8>call NetSpeed.00402086                 ;  关键
0044B92E    .  83>add esp,4
0044B931    .  84>test al,al
0044B933    .  75>jnz short NetSpeed.0044B95C            ;  关键点了!!!要跳
0044B935    .  6A>push 1

………………………………………………………………………………………………………………
再次进入关键
………………………………………………………………………………………………………………
0044C600    > \6A>push -1
0044C602    .  68>push NetSpeed.004E0DE0                 ;  SE handler installation
0044C607    .  64>mov eax,dword ptr fs:[0]
0044C60D    .  50 push eax
0044C60E    .  64>mov dword ptr fs:[0],esp
0044C615    .  83>sub esp,24
0044C618    .  53 push ebx                               ;  注册码
0044C619    .  55 push ebp                               ;  邮箱
0044C61A    .  56 push esi
0044C61B    .  8D>lea eax,dword ptr ss:[esp+1C]
0044C61F    .  57 push edi
0044C620    .  50 push eax
0044C621    .  E8>call NetSpeed.00494552                 ;  把年份计算出来的结果储存在00123548  425DDC3A
0044C626    .  8B>mov ecx,dword ptr ds:[5132A4]          ;  NetSpeed.005132B8
0044C62C    .  89>mov dword ptr ss:[esp+18],ecx
0044C630    .  8D>lea edx,dword ptr ss:[esp+24]
0044C634    .  68>push NetSpeed.005117B8                 ; /是整个日期的格式  星期,月份,日期,年份
0044C639    .  52 push edx                               ; |Arg1
0044C63A    .  8D>lea ecx,dword ptr ss:[esp+28]          ; |
0044C63E    .  C7>mov dword ptr ss:[esp+44],0            ; |
0044C646    .  E8>call NetSpeed.004947DF                 ; \得到整个日期

………………………………………………………………………………………………………………
上面这一段取出时间,精确到秒,用于下面检查是否在调试软件,下面也在不断取出时间。作比较。
………………………………………………………………………………………………………………
………………省略………………
0044C69F    .  BF>mov edi,64                             ;  次数
0044C6A4    >  8B>mov edx,dword ptr ss:[esp+20]          ;  出现用年份计算出来的值
0044C6A8    .  51 push ecx
0044C6A9    .  8B>mov eax,esp
0044C6AB    .  89>mov dword ptr ss:[esp+28],esp
0044C6AF    .  8D>lea ecx,dword ptr ss:[esp+30]
0044C6B3    .  89>mov dword ptr ds:[eax],edx
0044C6B5    .  8D>lea eax,dword ptr ss:[esp+48]
0044C6B9    .  50 push eax
0044C6BA    .  51 push ecx
0044C6BB    .  E8>call NetSpeed.00494552
0044C6C0    .  8B>mov ecx,eax
0044C6C2    .  E8>call NetSpeed.0040273E                 ;  把现在时间计算出来的值与,刚才运行是用时间计算出来的值进行相减
0044C6C7    .  83>cmp dword ptr ss:[esp+44],14           ;  我想应该小于20秒
0044C6CC    .  7C>jl short NetSpeed.0044C6D2
0044C6CE    .  6A>push 12
0044C6D0    .  FF>call ebp
0044C6D2    >  E8>call NetSpeed.00474D01
0044C6D7    .  89>mov dword ptr ss:[esp+24],eax
0044C6DB    .  DB>fild dword ptr ss:[esp+24]
0044C6DF    .  D8>fmul dword ptr ds:[4EC1B0]             ;  乘以固定值
0044C6E5    .  D8>fadd dword ptr ds:[4EC1AC]
0044C6EB    .  E8>call NetSpeed.00473FB8                 ;  变成整数的16进制数
0044C6F0    .  50 push eax
0044C6F1    .  8D>lea ecx,dword ptr ss:[esp+18]
0044C6F5    .  E8>call NetSpeed.004A4852
0044C6FA    .  4F dec edi                                ;  100减1
0044C6FB    .^ 75>jnz short NetSpeed.0044C6A4            ;  上面只是检测程序是否被调试
………………………………………………………………………………………………………………
上面这一段就检查是否被调试了!如果发现时间不对,程序会自动退出!,防止退出,直接运行跳过
………………………………………………………………………………………………………………
0044C713    .  E8>call NetSpeed.00402379
0044C718    .  8B>mov edi,esi
0044C71A    .  83>or ecx,FFFFFFFF
0044C71D    .  33>xor eax,eax
0044C71F    .  83>add esp,8
0044C722    .  F2>repne scas byte ptr es:[edi]
0044C724    .  F7>not ecx
0044C726    .  49 dec ecx                                ;  上面几行是得到注册码的位数
0044C727    .  83>cmp ecx,14                             ;  位数比较要大于14位20位
0044C72A    .  0F>jb NetSpeed.0044CA34                   ;  不能跳
0044C730    .  56 push esi
0044C731    .  8D>lea ecx,dword ptr ss:[esp+14]
0044C735    .  E8>call NetSpeed.004A44BD
0044C73A    .  BF>mov edi,14
0044C73F    .  8D>lea ecx,dword ptr ss:[esp+44]
0044C743    .  57 push edi
0044C744    .  B3>mov bl,3
0044C746    .  51 push ecx
0044C747    .  8D>lea ecx,dword ptr ss:[esp+18]
0044C74B    .  88>mov byte ptr ss:[esp+44],bl
0044C74F    .  E8>call NetSpeed.00493B33                 ;  得到前20位的注册码

………………………………………………………………………………………………………………
得到前20位的注册码,实际上输入的注册码是18位(重新启动时可以看到),这里只是取前20位作检查,
………………………………………………………………………………………………………………
0044C7D1    .  BE>mov esi,3E8
0044C7D6    >  51 push ecx
0044C7D7    .  8B>mov ecx,dword ptr ss:[esp+24]
0044C7DB    .  8B>mov eax,esp
0044C7DD    .  8D>lea edx,dword ptr ss:[esp+48]
0044C7E1    .  89>mov dword ptr ss:[esp+30],esp
0044C7E5    .  52 push edx
0044C7E6    .  89>mov dword ptr ds:[eax],ecx
0044C7E8    .  8D>lea eax,dword ptr ss:[esp+38]
0044C7EC    .  50 push eax
0044C7ED    .  E8>call NetSpeed.00494552
0044C7F2    .  8B>mov ecx,eax
0044C7F4    .  E8>call NetSpeed.0040273E
0044C7F9    .  39>cmp dword ptr ss:[esp+44],edi
0044C7FD    .  7C>jl short NetSpeed.0044C803
0044C7FF    .  6A>push 12
0044C801    .  FF>call ebp
0044C803    >  E8>call NetSpeed.00474D01
0044C808    .  89>mov dword ptr ss:[esp+24],eax
0044C80C    .  DB>fild dword ptr ss:[esp+24]
0044C810    .  D8>fmul dword ptr ds:[4EC1B0]
0044C816    .  D8>fadd dword ptr ds:[4EC1AC]
0044C81C    .  E8>call NetSpeed.00473FB8
0044C821    .  50 push eax
0044C822    .  8D>lea ecx,dword ptr ss:[esp+18]
0044C826    .  E8>call NetSpeed.004A4852
0044C82B    .  4E dec esi
0044C82C    .^ 75>jnz short NetSpeed.0044C7D6            ;  上面只是检测程序是否被调试

…………………………………………………………………………………………………………
再次循环检查是否被调试   真正检查前20位在这里:
…………………………………………………………………………………………………………
0044C84C    .  8B>mov ecx,esp
0044C84E    .  89>mov dword ptr ss:[esp+48],esp
0044C852    .  68>push NetSpeed.005117AC                 ;  ASCII "WD1wdp4$;"
0044C857    .  E8>call NetSpeed.004A44BD
0044C85C    .  8D>lea ecx,dword ptr ss:[esp+14]
0044C860    .  51 push ecx
0044C861    .  E8>call NetSpeed.00402419                 ;  将注册码的第1,6,11,17位与固定值的前4位WD1w进行比较如果不等将返回*号
0044C866    .  8B>mov edx,dword ptr ss:[esp+18]          ; |如果相等,返回值是前20位中去除第1、6、11、17位的16位
0044C86A    .  68>push NetSpeed.0050F6BC                 ; |20个“*”
0044C86F    .  52 push edx                               ; |Arg1
0044C870    .  E8>call NetSpeed.00474355                 ; \比较  如果上面相等的话,这里就不等返回EAX=0
0044C875    .  83>add esp,10
0044C878    .  85>test eax,eax
0044C87A    .  0F>je NetSpeed.0044CA26                   ;  不能跳  如果注册码的第1,6,11,17位与固定值的前4位WD1w相等就不跳
0044C880    .  68>push NetSpeed.005117A4                 ;  固定值“******”
0044C885    .  8D>lea ecx,dword ptr ss:[esp+14]
0044C889    .  E8>call NetSpeed.00493C23                 ;  检查16位的注册码中有没有“*”
0044C88E    .  85>test eax,eax
0044C890    .  0F>jge NetSpeed.0044CA26
0044C896    .  8B>mov eax,dword ptr ss:[esp+10]
0044C89A    .  8B>mov eax,dword ptr ds:[eax-8]
0044C89D    .  3D>cmp eax,80
0044C8A2    .  7D>jge short NetSpeed.0044C8BF
0044C8A4    >  68>push NetSpeed.0050F0CC
0044C8A9    .  8D>lea ecx,dword ptr ss:[esp+14]
0044C8AD    .  E8>call NetSpeed.004A482B
0044C8B2    .  8B>mov ecx,dword ptr ss:[esp+10]
0044C8B6    .  81>cmp dword ptr ds:[ecx-8],80
0044C8BD    .^ 7C>jl short NetSpeed.0044C8A4             ;  上面一段在16位注册码后面加了好多的0
0044C8BF    >  8D>lea edx,dword ptr ss:[esp+44]
0044C8C3    .  6A>push 10
0044C8C5    .  52 push edx
0044C8C6    .  8D>lea ecx,dword ptr ss:[esp+18]
0044C8CA    .  E8>call NetSpeed.00493B33
0044C8CF    .  50 push eax
0044C8D0    .  8D>lea ecx,dword ptr ss:[esp+14]
0044C8D4    .  C6>mov byte ptr ss:[esp+40],6
0044C8D9    .  E8>call NetSpeed.004A4588                 ;  又还原成原来的样子了
0044C8DE    .  8D>lea ecx,dword ptr ss:[esp+44]
0044C8E2    .  88>mov byte ptr ss:[esp+3C],bl
0044C8E6    .  E8>call NetSpeed.004A444F
0044C8EB    .  51 push ecx
0044C8EC    .  8B>mov ecx,esp
0044C8EE    .  89>mov dword ptr ss:[esp+48],esp
0044C8F2    .  68>push NetSpeed.005117AC                 ;  压入固定值“WD1wdp4$;”
0044C8F7    .  E8>call NetSpeed.004A44BD
0044C8FC    .  8D>lea eax,dword ptr ss:[esp+14]
0044C900    .  50 push eax
0044C901    .  E8>call NetSpeed.00402379                 ;  关键了  要进入了 用16位的前8位和后8位重新组合成新的前8位
0044C906    .  8B>mov ecx,dword ptr ss:[esp+18]
0044C90A    .  83>add esp,8
0044C90D    .  8B>mov eax,dword ptr ds:[ecx-8]
0044C910    .  85>test eax,eax
0044C912    .  0F>je NetSpeed.0044CA26
0044C918    .  83>cmp eax,8
0044C91B    .  0F>jnz NetSpeed.0044CA26
0044C921    .  BE>mov esi,3E8
………………………………………………………………………………………………………………………………
检查1:将注册码的第1,6,11,17位必须是WD1w
所以修正我的输入:W2345D7890123456w8901234

检查2:进入0044C901    .  E8>call NetSpeed.00402379
       把前20位注册码去掉上面的第1,6,11,17位还剩下16位,分成前8位和后8为
       分别依次取前8位的字符与后8位的字符重新组合成新的ASCII,作为新的字符,覆盖前8位
       而且组合后的第6、2、8位全部为0  就是输入正确
       组合部分:把每个输入字符当做16进制数,如果超过了F就作为0处理。
………………………………………………………………………………………………………………………………
0041D076    .  D1>sar eax,1                              ;  用到8
0041D078    .  50 push eax
0041D079    .  51 push ecx
0041D07A    .  8B>mov ecx,esi
0041D07C    .  E8>call NetSpeed.00493B33
0041D081    .  50 push eax
0041D082    .  8D>lea ecx,dword ptr ss:[esp+10]
0041D086    .  C6>mov byte ptr ss:[esp+2C],4
0041D08B    .  E8>call NetSpeed.004A4588                 ;  得到剩下16位注册码的前8位
0041D090    .  8D>lea ecx,dword ptr ss:[esp+30]
0041D094    .  C6>mov byte ptr ss:[esp+28],3
0041D099    .  E8>call NetSpeed.004A444F
0041D09E    .  8B>mov edx,dword ptr ds:[esi]             ;  16位注册码得到注册码
0041D0A0    .  8B>mov ecx,esi
0041D0A2    .  8B>mov eax,dword ptr ds:[edx-8]           ;  得到位数10
0041D0A5    .  99 cdq
0041D0A6    .  2B>sub eax,edx
0041D0A8    .  D1>sar eax,1                              ;  得到8位
0041D0AA    .  50 push eax
0041D0AB    .  8D>lea eax,dword ptr ss:[esp+34]
0041D0AF    .  50 push eax
0041D0B0    .  E8>call NetSpeed.00493AB7
0041D0B5    .  50 push eax
0041D0B6    .  8D>lea ecx,dword ptr ss:[esp+14]
0041D0BA    .  C6>mov byte ptr ss:[esp+2C],5
0041D0BF    .  E8>call NetSpeed.004A4588                 ;  得到剩下16位注册码的后8位
0041D0C4    .  8D>lea ecx,dword ptr ss:[esp+30]
0041D0C8    .  C6>mov byte ptr ss:[esp+28],3
0041D0CD    .  E8>call NetSpeed.004A444F
0041D0D2    .  68>push NetSpeed.00519468
0041D0D7    .  8B>mov ecx,esi
0041D0D9    .  E8>call NetSpeed.004A45D8
0041D0DE    .  8B>mov eax,dword ptr ss:[esp+C]           ;  得到16位注册码中的前8位
0041D0E2    .  39>cmp dword ptr ds:[eax-8],edi
0041D0E5    .  7E>jle short NetSpeed.0041D140
0041D0E7    >  8A>mov cl,byte ptr ds:[edi+eax]           ;  依次取出前8位的每个注册码的ASCII
0041D0EA    .  88>mov byte ptr ss:[esp+14],cl
0041D0EE    .  8D>lea ecx,dword ptr ss:[esp+8]
0041D0F2    .  8B>mov edx,dword ptr ss:[esp+14]
0041D0F6    .  52 push edx                               ;  压入得到的前8位的注册码的ASCII
0041D0F7    .  E8>call NetSpeed.004935A3
0041D0FC    .  8B>mov eax,dword ptr ss:[esp+10]          ;  得到后8位的注册码
0041D100    .  8A>mov cl,byte ptr ds:[edi+eax]           ;  依次取出后8位的每个注册码的ASCII
0041D103    .  88>mov byte ptr ss:[esp+18],cl
0041D107    .  8D>lea ecx,dword ptr ss:[esp+8]
0041D10B    .  8B>mov edx,dword ptr ss:[esp+18]
0041D10F    .  52 push edx
0041D110    .  E8>call NetSpeed.004A4852                 ;  把前8位与后8位对应的位的2个数组合起来
0041D115    .  51 push ecx
0041D116    .  8D>lea eax,dword ptr ss:[esp+C]
0041D11A    .  8B>mov ecx,esp
0041D11C    .  89>mov dword ptr ss:[esp+20],esp
0041D120    .  50 push eax
0041D121    .  E8>call NetSpeed.004A41C4
0041D126    .  E8>call NetSpeed.0040126C                 ;  组合   前8位和后8位以输入字符的形式重新组合为一个ASCII
0041D12B    .  83>add esp,4
0041D12E    .  8B>mov ecx,esi
0041D130    .  50 push eax
0041D131    .  E8>call NetSpeed.004A4852                 ;  储存了在00FB6550
0041D136    .  8B>mov eax,dword ptr ss:[esp+C]
0041D13A    .  47 inc edi
0041D13B    .  3B>cmp edi,dword ptr ds:[eax-8]
0041D13E    .^ 7C>jl short NetSpeed.0041D0E7
0041D140    >  51 push ecx
…………………………………………………………………………………………………………
把每个输入字符当做16进制数
……………………………………………………………………………………………………………………
0041E0C0    > \0F>movsx eax,byte ptr ss:[esp+4]
0041E0C5    .  83>add eax,-30                            ;  Switch (cases 30..66)
0041E0C8    .  83>cmp eax,36
0041E0CB    .  77>ja short NetSpeed.0041E139
0041E0CD    .  33>xor ecx,ecx
0041E0CF    .  8A>mov cl,byte ptr ds:[eax+41E18C]
0041E0D5    .  FF>jmp dword ptr ds:[ecx*4+41E148]
0041E0DC    >  B8>mov eax,0F                             ;  Cases 46 ('F'),66 ('f') of switch 0041E0C5
0041E0E1    .  C3 retn
0041E0E2    >  B8>mov eax,0E                             ;  Cases 45 ('E'),65 ('e') of switch 0041E0C5
0041E0E7    .  C3 retn
0041E0E8    >  B8>mov eax,0D                             ;  Cases 44 ('D'),64 ('d') of switch 0041E0C5
0041E0ED    .  C3 retn
0041E0EE    >  B8>mov eax,0C                             ;  Cases 43 ('C'),63 ('c') of switch 0041E0C5
0041E0F3    .  C3 retn
0041E0F4    >  B8>mov eax,0B                             ;  Cases 42 ('B'),62 ('b') of switch 0041E0C5
0041E0F9    .  C3 retn
0041E0FA    >  B8>mov eax,0A                             ;  Cases 41 ('A'),61 ('a') of switch 0041E0C5
0041E0FF    .  C3 retn
0041E100    >  33>xor eax,eax                            ;  Case 30 ('0') of switch 0041E0C5
0041E102    .  C3 retn
0041E103    >  B8>mov eax,1                              ;  Case 31 ('1') of switch 0041E0C5
0041E108    .  C3 retn
0041E109    >  B8>mov eax,2                              ;  Case 32 ('2') of switch 0041E0C5
0041E10E    .  C3 retn
0041E10F    >  B8>mov eax,3                              ;  Case 33 ('3') of switch 0041E0C5
0041E114    .  C3 retn
0041E115    >  B8>mov eax,4                              ;  Case 34 ('4') of switch 0041E0C5
0041E11A    .  C3 retn
0041E11B    >  B8>mov eax,5                              ;  Case 35 ('5') of switch 0041E0C5
0041E120    .  C3 retn
0041E121    >  B8>mov eax,6                              ;  Case 36 ('6') of switch 0041E0C5
0041E126    .  C3 retn
0041E127    >  B8>mov eax,7                              ;  Case 37 ('7') of switch 0041E0C5
0041E12C    .  C3 retn
0041E12D    >  B8>mov eax,8                              ;  Case 38 ('8') of switch 0041E0C5
0041E132    .  C3 retn
0041E133    >  B8>mov eax,9                              ;  Case 39 ('9') of switch 0041E0C5
0041E138    .  C3 retn
0041E139    >  8D>lea edx,dword ptr ss:[esp+4]           ;  Default case of switch 0041E0C5
0041E13D    .  52 push edx
0041E13E    .  E8>call NetSpeed.004746D0
0041E143    .  83>add esp,4
0041E146    .  C3 retn
………………………………………………………………………………………………………………………………
上面除了固定的4位,后,的16位的前8位和后8位中的第2、6、8位必须位0,或者是大于F的字符。
比较在下面:
……………………………………………………………………………………………………………………
0044C95B    .  8D>lea ecx,dword ptr ss:[esp+20]
0044C95F    .  E8>call NetSpeed.004A44BD
0044C964    .  8B>mov edx,dword ptr ss:[esp+10]
0044C968    .  6A>push 0
0044C96A    .  C6>mov byte ptr ss:[esp+40],7
0044C96F    .  8A>mov al,byte ptr ds:[edx+5]             ;  取出前面0044C901计算好的的第6位
0044C972    .  88>mov byte ptr ss:[esp+28],al
0044C976    .  8B>mov ecx,dword ptr ss:[esp+28]
0044C97A    .  51 push ecx
0044C97B    .  8D>lea ecx,dword ptr ss:[esp+24]
0044C97F    .  E8>call NetSpeed.004A497E                 ;  判断第6位是否为0
0044C984    .  85>test eax,eax
0044C986    .  0F>jl NetSpeed.0044CA19                   ;  不能跳
0044C98C    .  8B>mov edx,dword ptr ss:[esp+10]
0044C990    .  6A>push 0
0044C992    .  8A>mov al,byte ptr ds:[edx+1]             ;  取出前面0044C901计算好的的第2位
0044C995    .  88>mov byte ptr ss:[esp+28],al
0044C999    .  8B>mov ecx,dword ptr ss:[esp+28]
0044C99D    .  51 push ecx
0044C99E    .  8D>lea ecx,dword ptr ss:[esp+24]
0044C9A2    .  E8>call NetSpeed.004A497E                 ;  判断第2位是否为0
0044C9A7    .  85>test eax,eax
0044C9A9    .  7C>jl short NetSpeed.0044CA19             ;  不能跳
0044C9AB    .  8B>mov edx,dword ptr ss:[esp+10]
0044C9AF    .  6A>push 0
0044C9B1    .  8A>mov al,byte ptr ds:[edx+7]             ;  取出前面0044C901计算好的的第8位
0044C9B4    .  88>mov byte ptr ss:[esp+28],al
0044C9B8    .  8B>mov ecx,dword ptr ss:[esp+28]
0044C9BC    .  51 push ecx
0044C9BD    .  8D>lea ecx,dword ptr ss:[esp+24]
0044C9C1    .  E8>call NetSpeed.004A497E                 ;  判断第8为是否为0
0044C9C6    .  85>test eax,eax
0044C9C8    .  7C>jl short NetSpeed.0044CA19             ;  如果上面第6、2、8位全部为0  就是输入正确

…………………………………………………………………………………………………………………………
我输入码的(取出固定4位后)
前8位
23457890
后8位:
23456890

组合后的ASCII
22 33 44 55 76 88 99 00 

所以继续输入码的修正:W2045D7090120456w0901234
即可完成输入验证部分!

重新启动又要输入注册码,也就还要重启验证!暂停法!
(如果上面是爆破的,再次启动出现一个警告对话框,“这是盗版注册码,请使用正版……”正好用暂停。
…………………………………………………………………………………………………………
0042DA63    .  68>push NetSpeed.0050F730                 ;  ASCII "000000000000000000000000000000000"
0042DA68    .  8D>lea ecx,dword ptr ss:[esp+30]
0042DA6C    .  E8>call NetSpeed.004A45D8
0042DA71    .  8B>mov ecx,dword ptr ss:[esp+2C]
0042DA75    >  83>cmp dword ptr ds:[ecx-8],18            ;  一定要16进制18
0042DA79    .  7D>jge short NetSpeed.0042DA8B

………………………………………………………………………………………………
一定要输入24位!
…………………………………………………………………………………………………………
0042DA7B    .  68>push NetSpeed.0050F708                 ;  ASCII "00000000000000000000000000000000"
0042DA80    .  8D>lea ecx,dword ptr ss:[esp+28]
0042DA84    .  E8>call NetSpeed.004A45D8
0042DA89    .  EB>jmp short NetSpeed.0042DAA0
0042DA8B    >  8A>mov cl,byte ptr ds:[ecx+14]            ;  第21位
0042DA8E    .  88>mov byte ptr ss:[esp+10],cl
0042DA92    .  8B>mov edx,dword ptr ss:[esp+10]
0042DA96    .  52 push edx
0042DA97    .  8D>lea ecx,dword ptr ss:[esp+28]
0042DA9B    .  E8>call NetSpeed.004935A3                 ;  重新把第21位拷贝一下00FB5F10
0042DAA0    >  BB>mov ebx,2711
0042DAA5    >  8D>lea eax,dword ptr ss:[esp+24]
0042DAA9    .  8D>lea ecx,dword ptr ss:[esp+24]
0042DAAD    .  50 push eax
0042DAAE    .  E8>call NetSpeed.004A4588
0042DAB3    .  4B dec ebx
0042DAB4    .^ 75>jnz short NetSpeed.0042DAA5            ;  整个一个无意义的循环
0042DAB6    .  8B>mov ecx,dword ptr ss:[esp+24]          ;  得到第21位数据储存的地址
0042DABA    .  68>push NetSpeed.0050F0CC                 ; /固定值30
0042DABF    .  51 push ecx                               ; |得到第21位数据储存的地址
0042DAC0    .  E8>call NetSpeed.00474355                 ; \NetSpeed.00474355
0042DAC5    .  83>add esp,8
0042DAC8    .  85>test eax,eax
0042DACA    .  74>je short NetSpeed.0042DADD
0042DACC    .  8B>mov edx,dword ptr ss:[esp+24]
0042DAD0    .  52 push edx
0042DAD1    .  E8>call NetSpeed.004746D0                 ;  第21位如果是个-就说是盗版
0042DAD6    .  83>add esp,4
0042DAD9    .  85>test eax,eax
0042DADB    .  7E>jle short NetSpeed.0042DAF3
0042DADD    >  8B>mov eax,dword ptr ss:[esp+24]
0042DAE1    .  68>push NetSpeed.0050F704                 ; /是个2D就是-
0042DAE6    .  50 push eax                               ; |Arg1
0042DAE7    .  E8>call NetSpeed.00474355                 ; \返回是1EAX=1就是说不等于“-”
0042DAEC    .  83>add esp,8
0042DAEF    .  85>test eax,eax
0042DAF1    .  75>jnz short NetSpeed.0042DB53
0042DAF3    >  A1>mov eax,dword ptr ds:[5132A4]
0042DAF8    .  89>mov dword ptr ss:[esp+14],eax
0042DAFC    .  89>mov dword ptr ss:[esp+18],eax
0042DB00    .  68>push 804C                              ; /Arg1 = 0000804C
0042DB05    .  8D>lea ecx,dword ptr ss:[esp+18]          ; |
0042DB09    .  C6>mov byte ptr ss:[esp+B7C0],2B          ; |
0042DB11    .  E8>call NetSpeed.004A4B00                 ; \NetSpeed.004A4B00
0042DB16    .  6A>push 67                                ; /Arg1 = 00000067
0042DB18    .  8D>lea ecx,dword ptr ss:[esp+1C]          ; |
0042DB1C    .  E8>call NetSpeed.004A4B00                 ; \NetSpeed.004A4B00
0042DB21    .  8B>mov ecx,dword ptr ss:[esp+18]
0042DB25    .  8B>mov edx,dword ptr ss:[esp+14]
0042DB29    .  6A>push 10
0042DB2B    .  51 push ecx
0042DB2C    .  52 push edx
0042DB2D    .  6A>push 0
0042DB2F    .  FF>call edi                               ;  出现盗版对话框
0042DB31    .  8D>lea ecx,dword ptr ss:[esp+18]
……………………………………………………………………………………………………………………
检查第21位,如果第21位是”-“出现盗版对话框
……………………………………………………………………………………………………………………
0042DB53    > \51 push ecx
0042DB54    .  8B>mov ecx,dword ptr ss:[esp+68]          ;  得到上次取的时间值
0042DB58    .  8B>mov eax,esp
0042DB5A    .  89>mov dword ptr ss:[esp+14],esp
0042DB5E    .  8D>lea edx,dword ptr ss:[esp+20]
0042DB62    .  89>mov dword ptr ds:[eax],ecx
0042DB64    .  8D>lea eax,dword ptr ss:[esp+14]
0042DB68    .  52 push edx
0042DB69    .  50 push eax
0042DB6A    .  E8>call NetSpeed.00494552
0042DB6F    .  8B>mov ecx,eax
0042DB71    .  E8>call NetSpeed.0040273E
0042DB76    .  83>cmp dword ptr ss:[esp+1C],14
0042DB7B    .  7C>jl short NetSpeed.0042DB85             ;  如果小于14秒就出错
0042DB7D    .  6A>push 12                                ; /ExitCode = 12 (18.)
0042DB7F    .  FF>call dword ptr ds:[<&USER32.PostQuitMe>; \PostQuitMessage
0042DB85    >  8D>lea ecx,dword ptr ss:[esp+10]
0042DB89    .  51 push ecx
0042DB8A    .  E8>call NetSpeed.00494552
0042DB8F    .  8B>mov edx,dword ptr ds:[eax]             ;  又得到时间值
0042DB91    .  8B>mov eax,dword ptr ss:[esp+24]
0042DB95    .  50 push eax
0042DB96    .  89>mov dword ptr ss:[esp+68],edx
0042DB9A    .  E8>call NetSpeed.004746D0
0042DB9F    .  83>add esp,4
0042DBA2    .  25>and eax,80000001
0042DBA7    .  79>jns short NetSpeed.0042DBAE
0042DBA9    .  48 dec eax
0042DBAA    .  83>or eax,FFFFFFFE
0042DBAD    .  40 inc eax
0042DBAE    >  75>jnz short NetSpeed.0042DC16
0042DBB0    .  8B>mov ecx,dword ptr ss:[esp+2C]
0042DBB4    .  BB>mov ebx,3E9
0042DBB9    .  0F>movsx ebp,byte ptr ds:[ecx+5]
0042DBBD    >  8D>lea edx,dword ptr ss:[esp+24]
0042DBC1    .  8D>lea ecx,dword ptr ss:[esp+24]
0042DBC5    .  52 push edx
0042DBC6    .  E8>call NetSpeed.004A4588
0042DBCB    .  4B dec ebx
0042DBCC    .^ 75>jnz short NetSpeed.0042DBBD
0042DBCE    .  51 push ecx
0042DBCF    .  8B>mov ecx,dword ptr ss:[esp+68]
0042DBD3    .  8B>mov eax,esp
0042DBD5    .  89>mov dword ptr ss:[esp+14],esp
0042DBD9    .  8D>lea edx,dword ptr ss:[esp+14]
0042DBDD    .  89>mov dword ptr ds:[eax],ecx
0042DBDF    .  8D>lea eax,dword ptr ss:[esp+24]
0042DBE3    .  52 push edx
0042DBE4    .  50 push eax
0042DBE5    .  E8>call NetSpeed.00494552
0042DBEA    .  8B>mov ecx,eax
0042DBEC    .  E8>call NetSpeed.0040273E
0042DBF1    .  8B>mov eax,dword ptr ds:[eax]
0042DBF3    .  83>cmp eax,14
0042DBF6    .  89>mov dword ptr ss:[esp+1C],eax
0042DBFA    .  7C>jl short NetSpeed.0042DC04
0042DBFC    .  6A>push 12                                ; /ExitCode = 12 (18.)
0042DBFE    .  FF>call dword ptr ds:[<&USER32.PostQuitMe>; \PostQuitMessage
0042DC04    >  8B>mov eax,dword ptr ss:[esp+2C]
0042DC08    .  8A>mov cl,byte ptr ds:[eax+1]
0042DC0B    .  0F>movsx edx,byte ptr ds:[eax+8]
0042DC0F    .  0F>movsx eax,cl
0042DC12    .  03>add eax,ebp
0042DC14    .  EB>jmp short NetSpeed.0042DC82
0042DC16    >  8B>mov eax,dword ptr ss:[esp+2C]          ;  又得到注册码的全部
0042DC1A    .  BD>mov ebp,3E9                            ;  准备循环
0042DC1F    .  8A>mov cl,byte ptr ds:[eax+5]             ;  取注册码的第六位固定为D
0042DC22    .  0F>movsx ebx,byte ptr ds:[eax+9]          ;  取第10位
0042DC26    .  0F>movsx edx,cl
0042DC29    .  03>add ebx,edx                            ;  第6位加上第10位的ASCII
0042DC2B    >  8D>lea eax,dword ptr ss:[esp+24]
0042DC2F    .  8D>lea ecx,dword ptr ss:[esp+24]
0042DC33    .  50 push eax
0042DC34    .  E8>call NetSpeed.004A4588
0042DC39    .  4D dec ebp
0042DC3A    .^ 75>jnz short NetSpeed.0042DC2B            ;  和上一次一样无意义的循环
0042DC3C    .  51 push ecx
0042DC3D    .  8B>mov ecx,dword ptr ss:[esp+68]          ;  取时间计算值
0042DC41    .  8B>mov eax,esp
0042DC43    .  89>mov dword ptr ss:[esp+14],esp
0042DC47    .  8D>lea edx,dword ptr ss:[esp+14]
0042DC4B    .  89>mov dword ptr ds:[eax],ecx
0042DC4D    .  8D>lea eax,dword ptr ss:[esp+24]
0042DC51    .  52 push edx
0042DC52    .  50 push eax
0042DC53    .  E8>call NetSpeed.00494552
0042DC58    .  8B>mov ecx,eax
0042DC5A    .  E8>call NetSpeed.0040273E
0042DC5F    .  8B>mov eax,dword ptr ds:[eax]
0042DC61    .  83>cmp eax,14
0042DC64    .  89>mov dword ptr ss:[esp+1C],eax
0042DC68    .  7C>jl short NetSpeed.0042DC72             ;  如果小于14秒就出错
0042DC6A    .  6A>push 12                                ; /ExitCode = 12 (18.)
0042DC6C    .  FF>call dword ptr ds:[<&USER32.PostQuitMe>; \PostQuitMessage
0042DC72    >  8B>mov eax,dword ptr ss:[esp+2C]          ;  得到注册码
0042DC76    .  8A>mov cl,byte ptr ds:[eax+B]             ;  取值第12位
0042DC79    .  0F>movsx edx,byte ptr ds:[eax+8]          ;  取第九位
0042DC7D    .  0F>movsx eax,cl
0042DC80    .  03>add eax,ebx
0042DC82    >  03>add eax,edx                            ;  把第6位,第10位,第9位第12的ASCII加起来
0042DC84    .  8D>lea ecx,dword ptr ss:[esp+34]
0042DC88    .  50 push eax
0042DC89    .  68>push NetSpeed.0050F6B0                 ;  ASCII "%d"
0042DC8E    .  51 push ecx
0042DC8F    .  E8>call NetSpeed.00493FA9                 ;  转化位10进制
0042DC94    .  8B>mov edx,dword ptr ss:[esp+70]          ;  又得到时间值
0042DC98    .  83>add esp,0C
0042DC9B    .  51 push ecx
0042DC9C    .  8D>lea ecx,dword ptr ss:[esp+24]
0042DCA0    .  8B>mov eax,esp
0042DCA2    .  89>mov dword ptr ss:[esp+14],esp
0042DCA6    .  89>mov dword ptr ds:[eax],edx
0042DCA8    .  8D>lea eax,dword ptr ss:[esp+14]
0042DCAC    .  50 push eax
0042DCAD    .  51 push ecx
0042DCAE    .  E8>call NetSpeed.00494552
0042DCB3    .  8B>mov ecx,eax
0042DCB5    .  E8>call NetSpeed.0040273E
0042DCBA    .  8B>mov eax,dword ptr ds:[eax]
0042DCBC    .  83>cmp eax,14
0042DCBF    .  89>mov dword ptr ss:[esp+1C],eax
0042DCC3    .  7C>jl short NetSpeed.0042DCCD             ;  小于14秒错误
0042DCC5    .  6A>push 12                                ; /ExitCode = 12 (18.)
0042DCC7    .  FF>call dword ptr ds:[<&USER32.PostQuitMe>; \PostQuitMessage
0042DCCD    >  8B>mov edx,dword ptr ss:[esp+34]          ;  得到上面之和10进制字符
0042DCD1    .  BB>mov ebx,3
0042DCD6    .  8B>mov eax,dword ptr ds:[edx-8]
0042DCD9    .  3B>cmp eax,ebx                            ;  比较相加的和是否等于3位数
0042DCDB    .  7D>jge short NetSpeed.0042DCF6
0042DCDD    >  68>push NetSpeed.0050F0CC
0042DCE2    .  8D>lea ecx,dword ptr ss:[esp+38]
0042DCE6    .  E8>call NetSpeed.004A482B
0042DCEB    .  8B>mov eax,dword ptr ss:[esp+34]
0042DCEF    .  39>cmp dword ptr ds:[eax-8],ebx
0042DCF2    .^ 7C>jl short NetSpeed.0042DCDD
0042DCF4    .  EB>jmp short NetSpeed.0042DD28
0042DCF6    >  8D>lea ecx,dword ptr ss:[esp+10]
0042DCFA    .  53 push ebx
0042DCFB    .  51 push ecx
0042DCFC    .  8D>lea ecx,dword ptr ss:[esp+3C]
0042DD00    .  E8>call NetSpeed.00493AB7
0042DD05    .  50 push eax
0042DD06    .  8D>lea ecx,dword ptr ss:[esp+38]
0042DD0A    .  C6>mov byte ptr ss:[esp+B7C0],2C
0042DD12    .  E8>call NetSpeed.004A4588
0042DD17    .  8D>lea ecx,dword ptr ss:[esp+10]
0042DD1B    .  C6>mov byte ptr ss:[esp+B7BC],29
0042DD23    .  E8>call NetSpeed.004A444F
0042DD28    >  8B>mov edx,dword ptr ss:[esp+24]
0042DD2C    .  68>push NetSpeed.0050F704                 ; /Arg2 = 0050F704
0042DD31    .  52 push edx                               ; |Arg1
0042DD32    .  E8>call NetSpeed.00474355                 ; \比较第21位是否位“-”
0042DD37    .  83>add esp,8
0042DD3A    .  85>test eax,eax
0042DD3C    .  0F>je NetSpeed.0042DFA9
0042DD42    .  8D>lea eax,dword ptr ss:[esp+10]
0042DD46    .  6A>push 3
0042DD48    .  50 push eax
0042DD49    .  8D>lea ecx,dword ptr ss:[esp+34]
0042DD4D    .  E8>call NetSpeed.00493AB7                 ;  取最后3位
0042DD52    .  8B>mov eax,dword ptr ds:[eax]
0042DD54    .  8B>mov ecx,dword ptr ss:[esp+34]          ;  重要
0042DD58    .  50 push eax                               ; /Arg2
0042DD59    .  51 push ecx                               ; |Arg1
0042DD5A    .  E8>call NetSpeed.00474355                 ; \最后3位是否等于前面之和
0042DD5F    .  83>add esp,8
0042DD62    .  8D>lea ecx,dword ptr ss:[esp+10]
0042DD66    .  85>test eax,eax
0042DD68    .  0F>sete bl
0042DD6B    .  E8>call NetSpeed.004A444F
0042DD70    .  84>test bl,bl
0042DD72    .  0F>je NetSpeed.0042DFA9
0042DD78    .  E8>call NetSpeed.004023D8
0042DD7D    .  84>test al,al
0042DD7F    .  0F>je NetSpeed.0042DFA9
……………………………………………………………………………………………………………………
最后,把第6位,第10位,第9位第12的ASCII加起来,结果变成10进制数据。
如果你输入的最后3位等于上面的10进制之和,注册成功!
输入码与姓名与邮箱无关:

最终注册码:
W2045D7090120456w0901223
……………………………………………………………………………………………………………………