环球卫星网络电视9.8注册算法分析+C注册机
【文章标题】: 环球卫星网络电视9.8注册算法分析+C注册机【文章作者】: anan
【作者邮箱】: [email protected]
【软件名称】: 环球卫星网络电视9.8
【下载地址】: http://www.lwdown.com
【保护方式】: S/N
【使用工具】: peid,od
【软件介绍】: 可以收看国内外上百个精彩电视频道(包括中央电视台
【作者声明】: 9.5版本有人分析过了但是未写算法分析直接给结果 所以我也拿了 9.8版的分析和9.5算法一样,无聊写了C注册机 冒下泡
--------------------------------------------------------------------------------
【详细过程】
破解: 无壳 字符串住能查到 注册成功 不过一般注册失败的CALL就在 成功附近 为求精确 用XP万能断点
004F4443 .55 push ebp ;断在此处
004F4444 .68 58474F00 push 004F4758
004F4449 .64:FF30 push dword ptr fs:
004F444C .64:8920 mov dword ptr fs:, esp
004F444F .A1 9C4F5000 mov eax, dword ptr
==================================================================
004F4454 .8038 00 cmp byte ptr , 0
004F4457 .74 1A je short 004F4473
004F4459 .6A 00 push 0 ; /Arg1 = 00000000
004F445B .66:8B0D 68474>mov cx, word ptr ; |
004F4462 .B2 02 mov dl, 2 ; |
004F4464 .B8 74474F00 mov eax, 004F4774 ; |
004F4469 .E8 BAD5F3FF call 00431A28 ; \环球卫星.00431A28
004F446E .E9 88020000 jmp 004F46FB
004F4473 >8D55 F0 lea edx, dword ptr
004F4476 .8B45 FC mov eax, dword ptr
004F4479 .8B80 00030000 mov eax, dword ptr
004F447F .E8 CC1AF5FF call 00445F50
004F4484 .837D F0 00 cmp dword ptr , 0 ;检验N是否为空
004F4488 .74 1E je short 004F44A8
004F448A .8D55 EC lea edx, dword ptr
004F448D .8B45 FC mov eax, dword ptr
004F4490 .8B80 00030000 mov eax, dword ptr
004F4496 .E8 B51AF5FF call 00445F50 ;计算注册码N的位数
004F449B .8B45 EC mov eax, dword ptr ;N送EAX
004F449E .E8 F900F1FF call 0040459C
004F44A3 .83F8 08 cmp eax, 8 ;N要小于等于8位否则失败
004F44A6 .7E 30 jle short 004F44D8
004F44A8 >B8 A0474F00 mov eax, 004F47A0
004F44AD .E8 6ED6F3FF call 00431B20 ;注册失败CALL
004F44B2 .8B45 FC mov eax, dword ptr
004F44B5 .8B80 00030000 mov eax, dword ptr
004F44BB .33D2 xor edx, edx
004F44BD .E8 BE1AF5FF call 00445F80
004F44C2 .8B45 FC mov eax, dword ptr
004F44C5 .8B80 00030000 mov eax, dword ptr
004F44CB .8B10 mov edx, dword ptr
004F44CD .FF92 C4000000 call dword ptr
004F44D3 .E9 23020000 jmp 004F46FB
004F44D8 >8D45 E4 lea eax, dword ptr
004F44DB .50 push eax
004F44DC .8D55 E0 lea edx, dword ptr
004F44DF .8B45 FC mov eax, dword ptr
004F44E2 .8B80 08030000 mov eax, dword ptr
004F44E8 .E8 631AF5FF call 00445F50 ;计算机器码J的位数
004F44ED .8B45 E0 mov eax, dword ptr ;J送EAX
004F44F0 .B9 06000000 mov ecx, 6 ;机器码需要保留的位数是6位
004F44F5 .BA 01000000 mov edx, 1
004F44FA .E8 FD02F1FF call 004047FC ;保留机器码前6位=J1
004F44FF .8B4D E4 mov ecx, dword ptr
004F4502 .8D45 E8 lea eax, dword ptr
004F4505 .BA B8474F00 mov edx, 004F47B8 ;0x
004F450A .E8 D900F1FF call 004045E8 ;0x与J1相连=J2(如果J2是个实数 其实就是16进制的表示方法)
004F450F .8B45 E8 mov eax, dword ptr
004F4512 .E8 214EF1FF call 00409338 ;关键CALL(算法过程中0x实际上未参与运算)
004F4517 .8BF0 mov esi, eax ;上面CALL出来后得到J3
004F4519 .33C0 xor eax, eax
004F451B .55 push ebp
004F451C .68 B2464F00 push 004F46B2
004F4521 .64:FF30 push dword ptr fs:
004F4524 .64:8920 mov dword ptr fs:, esp
004F4527 .8D55 DC lea edx, dword ptr
004F452A .8B45 FC mov eax, dword ptr
004F452D .8B80 00030000 mov eax, dword ptr
004F4533 .E8 181AF5FF call 00445F50
004F4538 .8B45 DC mov eax, dword ptr
004F453B .E8 F84DF1FF call 00409338 ;N转化为16进制=N1
004F4540 .8BD8 mov ebx, eax
004F4542 .8BC3 mov eax, ebx
004F4544 .2BC6 sub eax, esi ;N1-J3
004F4546 .3B05 14485000 cmp eax, dword ptr ;比较N1-J3,C0F1E(十进制790302)
004F454C .74 59 je short 004F45A7 ;相等注册成功(爆破点)
004F454E .68 C4474F00 push 004F47C4
004F4553 .8D55 D4 lea edx, dword ptr
004F4556 .8B45 FC mov eax, dword ptr
004F4559 .8B80 00030000 mov eax, dword ptr
004F455F .E8 EC19F5FF call 00445F50
004F4564 .FF75 D4 push dword ptr
004F4567 .68 E0474F00 push 004F47E0
004F456C .8D45 D8 lea eax, dword ptr
004F456F .BA 03000000 mov edx, 3
004F4574 .E8 E300F1FF call 0040465C
004F4579 .8B45 D8 mov eax, dword ptr
004F457C .E8 9FD5F3FF call 00431B20
004F4581 .8B45 FC mov eax, dword ptr
004F4584 .8B80 00030000 mov eax, dword ptr
004F458A .33D2 xor edx, edx
004F458C .E8 EF19F5FF call 00445F80
004F4591 .8B45 FC mov eax, dword ptr
004F4594 .8B80 00030000 mov eax, dword ptr
004F459A .8B10 mov edx, dword ptr
004F459C .FF92 C4000000 call dword ptr
004F45A2 .E9 01010000 jmp 004F46A8
004F45A7 >8D55 F4 lea edx, dword ptr
004F45AA .A1 18485000 mov eax, dword ptr
004F45AF .03C3 add eax, ebx
004F45B1 .E8 624BF1FF call 00409118
004F45B6 .8D55 C8 lea edx, dword ptr
004F45B9 .A1 3C4E5000 mov eax, dword ptr
004F45BE .8B00 mov eax, dword ptr
004F45C0 .E8 4720F7FF call 0046660C
004F45C5 .8B45 C8 mov eax, dword ptr
004F45C8 .8D55 CC lea edx, dword ptr
004F45CB .E8 5852F1FF call 00409828
004F45D0 .FF75 CC push dword ptr
004F45D3 .68 F4474F00 push 004F47F4 ;ASCII "set"
004F45D8 .FF75 F4 push dword ptr
004F45DB .68 00484F00 push 004F4800 ;.ini
004F45E0 .8D45 D0 lea eax, dword ptr
004F45E3 .BA 04000000 mov edx, 4
004F45E8 .E8 6F00F1FF call 0040465C
004F45ED .8B4D D0 mov ecx, dword ptr
004F45F0 .B2 01 mov dl, 1
004F45F2 .A1 2C914300 mov eax, dword ptr
004F45F7 .E8 E04BF4FF call 004391DC
004F45FC .8945 F8 mov dword ptr , eax
004F45FF .33C0 xor eax, eax
004F4601 .55 push ebp
004F4602 .68 37464F00 push 004F4637
004F4607 .64:FF30 push dword ptr fs:
004F460A .64:8920 mov dword ptr fs:, esp
004F460D .6A 01 push 1
004F460F .B9 10484F00 mov ecx, 004F4810 ;ASCII "Reg"
004F4614 .BA 1C484F00 mov edx, 004F481C ;option
004F4619 .8B45 F8 mov eax, dword ptr
004F461C .8B18 mov ebx, dword ptr
004F461E .FF53 14 call dword ptr
004F4621 .33C0 xor eax, eax
004F4623 .5A pop edx
004F4624 .59 pop ecx
004F4625 .59 pop ecx
004F4626 .64:8910 mov dword ptr fs:, edx
004F4629 .68 3E464F00 push 004F463E
004F462E >8B45 F8 mov eax, dword ptr
004F4631 .E8 D2EDF0FF call 00403408
004F4636 .C3 retn
004F4637 .^ E9 20F5F0FF jmp 00403B5C
004F463C .^ EB F0 jmp short 004F462E
004F463E .6A 00 push 0 ; /Arg1 = 00000000
004F4640 .66:8B0D 68474>mov cx, word ptr ; |
004F4647 .B2 02 mov dl, 2 ; |
004F4649 .B8 2C484F00 mov eax, 004F482C ; |注册成功。谢谢你支持我们!
004F464E .E8 D5D3F3FF call 00431A28 ; \环球卫星.00431A28
======================================================================================================
跟进关键CALL后 发现里面有2个CALL 其中第1个为算法CALL
算法CALL:
00402E30/$53 push ebx
00402E31|.56 push esi
00402E32|.57 push edi
00402E33|.89C6 mov esi, eax
00402E35|.50 push eax
00402E36|.85C0 test eax, eax
00402E38|.74 6C je short 00402EA6
00402E3A|.31C0 xor eax, eax
00402E3C|.31DB xor ebx, ebx
00402E3E|.BF CCCCCC0C mov edi, 0CCCCCCC
00402E43|>8A1E /mov bl, byte ptr ;J2首位0送BL
00402E45|.46 |inc esi
00402E46|.80FB 20 |cmp bl, 20
00402E49|.^ 74 F8 \je short 00402E43
00402E4B|.B5 00 mov ch, 0
00402E4D|.80FB 2D cmp bl, 2D ;与 -比较
00402E50|.74 62 je short 00402EB4
00402E52|.80FB 2B cmp bl, 2B
00402E55|.74 5F je short 00402EB6 ;与+比较
00402E57|>80FB 24 cmp bl, 24 ;Switch (cases 0..78)
00402E5A|.74 5F je short 00402EBB
00402E5C|.80FB 78 cmp bl, 78
00402E5F|.74 5A je short 00402EBB
00402E61|.80FB 58 cmp bl, 58
00402E64|.74 55 je short 00402EBB
00402E66|.80FB 30 cmp bl, 30
00402E69|.75 13 jnz short 00402E7E
00402E6B|.8A1E mov bl, byte ptr ;Case 30 ('0') of switch 00402E57
00402E6D|.46 inc esi ;J2第2位送BLESI移到J2第3位
00402E6E|.80FB 78 cmp bl, 78
00402E71|.74 48 je short 00402EBB
00402E73|.80FB 58 cmp bl, 58
00402E76|.74 43 je short 00402EBB
00402E78|.84DB test bl, bl
00402E7A|.74 20 je short 00402E9C
00402E7C|.EB 04 jmp short 00402E82
00402E7E|>84DB test bl, bl
00402E80|.74 2D je short 00402EAF
00402E82|>80EB 30 /sub bl, 30 ;Default case of switch 00402E57
00402E85|.80FB 09 |cmp bl, 9
00402E88|.77 25 |ja short 00402EAF
00402E8A|.39F8 |cmp eax, edi
00402E8C|.77 21 |ja short 00402EAF
00402E8E|.8D0480 |lea eax, dword ptr
00402E91|.01C0 |add eax, eax
00402E93|.01D8 |add eax, ebx
00402E95|.8A1E |mov bl, byte ptr
00402E97|.46 |inc esi
00402E98|.84DB |test bl, bl
00402E9A|.^ 75 E6 \jnz short 00402E82
00402E9C|>FECD dec ch
00402E9E|.74 09 je short 00402EA9
00402EA0|.85C0 test eax, eax
00402EA2|.7D 54 jge short 00402EF8
00402EA4|.EB 09 jmp short 00402EAF
00402EA6|>46 inc esi
00402EA7|.EB 06 jmp short 00402EAF
00402EA9|>F7D8 neg eax
00402EAB|.7E 4B jle short 00402EF8
00402EAD|.78 49 js short 00402EF8
00402EAF|>5B pop ebx ;Default case of switch 00402ECF
00402EB0|.29DE sub esi, ebx
00402EB2|.EB 47 jmp short 00402EFB
00402EB4|>FEC5 inc ch
00402EB6|>8A1E mov bl, byte ptr
00402EB8|.46 inc esi
00402EB9|.^ EB 9C jmp short 00402E57
00402EBB|>BF FFFFFF0F mov edi, 0FFFFFFF ;Cases 24 ('$'),58 ('X'),78 ('x') of switch
上面一段在算法里不具实际意义只是检验J2前2位是否为0x
=============================================================================
00402EC0|.8A1E mov bl, byte ptr ;J2第3位J2送BL
00402EC2|.46 inc esi ;ESI移到第4位
00402EC3|.84DB test bl, bl
00402EC5|.^ 74 DF je short 00402EA6 ;检验J2是否为0
00402EC7|>80FB 61 /cmp bl, 61 ;与a比较
00402ECA|.72 03 |jb short 00402ECF
00402ECC|.80EB 20 |sub bl, 20
00402ECF|>80EB 30 |sub bl, 30 ;Switch (cases 30..46)
00402ED2|.80FB 09 |cmp bl, 9 ;与9做比较
00402ED5|.76 0B |jbe short 00402EE2
00402ED7|.80EB 11 |sub bl, 11 ;这里是分辨J2是数字还是字符
00402EDA|.80FB 05 |cmp bl, 5
00402EDD|.^ 77 D0 |ja short 00402EAF
00402EDF|.80C3 0A |add bl, 0A ;Cases 41 ('A'),42 ('B'),43 ('C'),44 ('D'),45 ('E'),46 ('F') of switch 00402ECF
00402EE2|>39F8 |cmp eax, edi ;Cases 30 ('0'),31 ('1'),32 ('2'),33 ('3'),34 ('4'),35 ('5'),36 ('6'),37 ('7'),38 ('8'),39 ('9') of switch 00402ECF
00402EE4|.^ 77 C9 |ja short 00402EAF
00402EE6|.C1E0 04 |shl eax, 4 ;EAX左移4位即扩大16倍
00402EE9|.01D8 |add eax, ebx ;EAX+J2(I>=3)
00402EEB|.8A1E |mov bl, byte ptr ;J2
00402EED|.46 |inc esi
00402EEE|.84DB |test bl, bl
00402EF0|.^ 75 D5 \jnz short 00402EC7 ;循环结束J3出现
00402EF2|.FECD dec ch
00402EF4|.75 02 jnz short 00402EF8
00402EF6|.F7D8 neg eax
00402EF8|>59 pop ecx
00402EF9|.31F6 xor esi, esi
00402EFB|>8932 mov dword ptr , esi
00402EFD|.5F pop edi
00402EFE|.5E pop esi
00402EFF|.5B pop ebx
00402F00\.C3 retn
========================================================================
算法主要的实现过程:将0x与机器码相连产生一个字符串(为了方便以J2代替)
实际运算是从J2开始的(即从机器码的第1位到第6位)
如果J2是字符的话运算{J2-41H+0AH}*16的次方
如果J2是数字的话运算J2*16的次方
将J2通过上面的运算所得值再累加得J3
如果你计算一下的话发现所得值J3用16进制来表示实际上就是
机器码的前6位
注册码: 只需要把机器码的前6位转化成10进制数再加上790302就可以了或者
将机器码前6位先与C0F1E相加再将结果转为10进制就可以了
C语言注册机 VC 6++编译通过#include <stdio.h>
main()
{char name;
int i=0,j;
long sum1=0,a;
loop: printf("请输入机器码:");
scanf("%s",name);
while(name!='\0')i++;
if(i<6)
{printf("机器码至少需要6位\n");
goto loop;}
for(i=0;i<6;i++)
{if(name>0x39)a=name-55;
else a=name-0x30;
}
sum1=a*0x100000+a*0x10000+a*0x1000+a*0x100+a*0x10+a+0xc0f1e;
printf("你的注册码为:%ld\n",sum1);
goto loop;}本机:机器码BD0550CA
注册码13177966
--------------------------------------------------------------------------------
2007年08月26日 16:10:09
[ 本帖最后由 xhn1002 于 2007-10-5 16:15 编辑 ] 支持一下,学习了 /:good 支持原创,很详细的爆破~学习了 写的真是很详细啊。。。学习 原帖由 binliao 于 2007-8-31 15:24 发表 https://www.chinapyg.com/images/common/back.gif
好文章,我何时才有这水平?
很快的我才学 2个月.... 厉害 分析的很好 学习一下 我是菜鸟,请问如何得到本机机器码/:013 写得真的是好详细阿!!!!!!!! 写的真是很详细啊。。。学习 看看,学习一下,请各位多多关照
页:
[1]
2