网络狂飙注册分析--时刻取时间进行反调试
【破解作者】 jsliyangsj
【作者邮箱】 sjcrack@yahoo.com.cn
【使用工具】 peid OllyDbg1.10
【破解平台】 Winxp
【软件名称】 网络狂飙
【软件地址】 http://www.superhsoft.com/Index.htm
【编写语言】 C++
说明 : NetSpeeder 是一个网络加速软件,可以用于Modem,ADSL等上网的加速,经过实测,
加速效果相当好,765KB的ADSL,加速前下载速度上80KB/S 是已经很快了,加速后速
度可以上到1xx甚至2xxKB/S,其速度可以提高1―3倍。软件拥有超酷的介面,?且提
供了向导和手工网络优化功能,使你加起速?得心应手,还拥有DNS加速功能,而且还
能自己实现类似3721的功能,如自己定义好: hunter----www.superhunter.net, 那你
在IE里只要输入hunter就可以到达http://www.superhunter.net, 它可以让你随心所欲
的定制,这么好的软件,还不赶快来下载,体验体验网络狂飙的感觉...
不知此软件是否真的有管用,我们只关心他用的注册算法。
第一次输入:
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
……………………………………………………………………………………………………………………
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)