MPEG Joiner V2.0.196算法分析
【文章标题】: MPEG Joiner V2.0.196算法分析(菜鸟级,高手勿进)【文章作者】: vacant
【作者邮箱】: [email protected]
【软件名称】: MPEG Joiner V2.0.196
【软件大小】: 389 KB
【下载地址】: http://www.skycn.com/soft/17764.html
【加壳方式】: 无壳
【保护方式】: 用户名+序列号
【编写语言】: Microsoft Visual C++ 7.0
【使用工具】: OD,windows计算器
【操作平台】: Win9x/NT/2000/XP/2003
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
1.PEID侦测主程序,无壳,Microsoft Visual C++ 7.0
2.OD载入主程序,输入试炼码
name:vacant
code:87654321
点注册,有错误提示.
3.重新OD装载,字符串参考,找到错误提示,"registration failed!",在00403D13 F2下断点.
4.重新OD装载,输入试炼码,点注册,中断
5.分析过程如下:
00403D13 .55 push ebp
00403D14 .56 push esi
00403D15 .57 push edi
00403D16 .BF 01000000 mov edi, 1 ;edi=1
00403D1B .57 push edi
00403D1C .8BF1 mov esi, ecx
00403D1E .E8 C8A30100 call 0041E0EB
00403D23 .8B46 70 mov eax, ;eax=name地址
00403D26 .8B68 F4 mov ebp, ;=name长度,送ebp
00403D29 .83FD 02 cmp ebp, 2 ;name 长度要大于2
00403D2C .7D 15 jge short 00403D43
00403D2E .6A 00 push 0
00403D30 .6A 00 push 0
00403D32 .68 FCAE4200 push 0042AEFC ;please input correct user name!
00403D37 .E8 B9FE0100 call 00423BF5
00403D3C .5F pop edi
00403D3D .5E pop esi
00403D3E .5D pop ebp
00403D3F .83C4 0C add esp, 0C
00403D42 .C3 retn
00403D43 >8B4E 74 mov ecx, ;ecx=code地址
00403D46 .8379 F4 08 cmp dword ptr , 8 ;code长度要大于8
00403D4A .7D 15 jge short 00403D61
00403D4C .6A 00 push 0
00403D4E .6A 00 push 0
00403D50 .68 D4AE4200 push 0042AED4 ;please input correct registration code!
00403D55 .E8 9BFE0100 call 00423BF5
00403D5A .5F pop edi
00403D5B .5E pop esi
00403D5C .5D pop ebp
00403D5D .83C4 0C add esp, 0C
00403D60 .C3 retn
00403D61 >8B46 70 mov eax, ;name地址送eax
00403D64 .8B48 F4 mov ecx, ;code长度送ecx
00403D67 .85C9 test ecx, ecx ;code长度不为0,就跳
00403D69 .7D 0A jge short 00403D75
00403D6B .68 57000780 push 80070057
00403D70 .E8 BBD6FFFF call 00401430
00403D75 >8A10 mov dl, ;name第1位送dl
00403D77 .8B46 70 mov eax, ;name地址送eax
00403D7A .3978 F4 cmp , edi ;name长度大于1,就跳
00403D7D .7D 0A jge short 00403D89
00403D7F .68 57000780 push 80070057
00403D84 .E8 A7D6FFFF call 00401430
00403D89 >8A40 01 mov al, ;name第2位送al
00403D8C .884424 0E mov , al ;name第2位送
00403D90 .8B46 70 mov eax, ;name地址送eax
00403D93 .8B48 F4 mov ecx, ;name长度送ecx
00403D96 .85C9 test ecx, ecx ;ecx不为0,就跳
00403D98 .7D 0A jge short 00403DA4
00403D9A .68 57000780 push 80070057
00403D9F .E8 8CD6FFFF call 00401430
00403DA4 >8B4E 70 mov ecx, ;name地址送ecx
00403DA7 .53 push ebx
00403DA8 .8A18 mov bl, ;name第1位送bl
00403DAA .3979 F4 cmp , edi ;name长度大于1,就跳
00403DAD .7D 0A jge short 00403DB9
00403DAF .68 57000780 push 80070057
00403DB4 .E8 77D6FFFF call 00401430
00403DB9 >0FB6C2 movzx eax, dl ;eax1=name第1位 零扩展
00403DBC .83C8 44 or eax, 44 ;eax1=eax1 or ox44
00403DBF .99 cdq ;双字扩展,edx=00000000
00403DC0 .BF 0A000000 mov edi, 0A ;edi=0xa
00403DC5 .F7FF idiv edi
00403DC7 .0FB64424 12 movzx eax, byte ptr ;eax2=name第2位
00403DCC .83C8 43 or eax, 43 ;eax2=eax2 or 0x43
00403DCF .885424 16 mov , dl ;eax1 余数送
00403DD3 .99 cdq
00403DD4 .F7FF idiv edi
00403DD6 .0FB6C3 movzx eax, bl ;eax3=name第1位
00403DD9 .83C8 43 or eax, 43 ;eax3=eax3 or 43
00403DDC .885424 12 mov , dl ;eax2 余数送
00403DE0 .99 cdq
00403DE1 .F7FF idiv edi
00403DE3 .0FB641 01 movzx eax, byte ptr ;eax4=name第2位
00403DE7 .83C8 44 or eax, 44 ;eax4=eax4 or 44
00403DEA .8BCF mov ecx, edi ;ecx=0A
00403DEC .885424 17 mov , dl ;eax3 余数送
00403DF0 .99 cdq
00403DF1 .F7F9 idiv ecx
00403DF3 .33C0 xor eax, eax ;eax=0
00403DF5 .33C9 xor ecx, ecx ;ecx=0
00403DF7 .85ED test ebp, ebp ;name长度是否为0
00403DF9 .885424 18 mov , dl ;eax4 余数 送
00403DFD .7E 20 jle short 00403E1F
00403DFF .90 nop
00403E00 >85C9 test ecx, ecx
00403E02 .0F8C D2000000 jl 00403EDA
00403E08 .8B7E 70 mov edi,
00403E0B .3B4F F4 cmp ecx,
00403E0E .0F8F C6000000 jg 00403EDA
00403E14 .0FB6140F movzx edx, byte ptr
00403E18 .03C2 add eax, edx
00403E1A .41 inc ecx
00403E1B .3BCD cmp ecx, ebp
00403E1D .^ 7C E1 jl short 00403E00 ;这个循环是把name的ASCII码相加,结果送eax
00403E1F >8B4E 74 mov ecx, ;code地址送ecx
00403E22 .8B51 F4 mov edx, ;是code长度
00403E25 .85D2 test edx, edx
00403E27 .7D 0A jge short 00403E33 ;长度大于0,就跳
00403E29 .68 57000780 push 80070057
00403E2E .E8 FDD5FFFF call 00401430
00403E33 >8A11 mov dl, ;code第1位送dl
00403E35 .8B4E 74 mov ecx, ;code地址送ecx
00403E38 .8379 F4 01 cmp dword ptr , 1 ;code长度与1比较
00403E3C .885424 19 mov , dl ;code第1位送
00403E40 .7D 0A jge short 00403E4C
00403E42 .68 57000780 push 80070057
00403E47 .E8 E4D5FFFF call 00401430
00403E4C >8A49 01 mov cl, ;code第2位送cl
00403E4F .8B7E 74 mov edi, ;code地址送edi
00403E52 .884C24 13 mov , cl ;code第2位送
00403E56 .837F F4 02 cmp dword ptr , 2 ;code长度大于2,就跳
00403E5A .7D 0A jge short 00403E66
00403E5C .68 57000780 push 80070057
00403E61 .E8 CAD5FFFF call 00401430
00403E66 >8A4F 02 mov cl,
00403E69 .8B7E 74 mov edi,
00403E6C .884C24 14 mov , cl ;code第3位送
00403E70 .837F F4 03 cmp dword ptr , 3
00403E74 .7D 0A jge short 00403E80
00403E76 .68 57000780 push 80070057
00403E7B .E8 B0D5FFFF call 00401430
00403E80 >8A4F 03 mov cl,
00403E83 .8B7E 74 mov edi,
00403E86 .884C24 15 mov , cl ;code第4位送
00403E8A .837F F4 04 cmp dword ptr , 4
00403E8E .7D 0A jge short 00403E9A
00403E90 .68 57000780 push 80070057
00403E95 .E8 96D5FFFF call 00401430
00403E9A >8A4F 04 mov cl, ;code第5位送cl
00403E9D .8B7E 74 mov edi,
00403EA0 .837F F4 05 cmp dword ptr , 5
00403EA4 .7D 0A jge short 00403EB0
00403EA6 .68 57000780 push 80070057
00403EAB .E8 80D5FFFF call 00401430
00403EB0 >8A5F 05 mov bl, ;code第6位送bl
00403EB3 .8B7E 74 mov edi,
00403EB6 .885C24 1A mov , bl ;code第6位送
00403EBA .837F F4 06 cmp dword ptr , 6
00403EBE .7D 0A jge short 00403ECA
00403EC0 .68 57000780 push 80070057
00403EC5 .E8 66D5FFFF call 00401430
00403ECA >8A5F 06 mov bl, ;code第7位送bl
00403ECD .8B7E 74 mov edi,
00403ED0 .885C24 1B mov , bl ;code第7位送
00403ED4 .837F F4 07 cmp dword ptr , 7
00403ED8 .7D 0A jge short 00403EE4
00403EDA >68 57000780 push 80070057
00403EDF .E8 4CD5FFFF call 00401430
00403EE4 >8A5F 07 mov bl, ;code第8位送bl
00403EE7 .0FB67C24 16 movzx edi, byte ptr ;name运算部分结果
00403EEC .0FB6D2 movzx edx, dl ;code第1位 零符号扩展到edx
00403EEF .83EA 30 sub edx, 30
00403EF2 .3BFA cmp edi, edx ;edi=09,eax1运算余数
00403EF4 .75 48 jnz short 00403F3E
00403EF6 .0FB65424 13 movzx edx, byte ptr
00403EFB .0FB67C24 12 movzx edi, byte ptr
00403F00 .83EA 30 sub edx, 30
00403F03 .3BFA cmp edi, edx ;edi=eax2 运算余数
00403F05 74 37 je short 00403F3E
00403F07 .0FB65424 14 movzx edx, byte ptr
00403F0C .0FB67C24 17 movzx edi, byte ptr
00403F11 .83EA 30 sub edx, 30
00403F14 .3BFA cmp edi, edx ;edi=eax3 运算余数
00403F16 74 26 je short 00403F3E
00403F18 .0FB65424 15 movzx edx, byte ptr
00403F1D .0FB67C24 18 movzx edi, byte ptr
00403F22 .83EA 30 sub edx, 30
00403F25 .3BFA cmp edi, edx ;edi=eax4 运算余数
00403F27 74 15 je short 00403F3E
00403F29 .99 cdq
00403F2A .BF 0A000000 mov edi, 0A ;eax=上面name的ASCII码相加结果
00403F2F .F7FF idiv edi
00403F31 .0FB6C2 movzx eax, dl ;余数送eax=7
00403F34 .0FB6D1 movzx edx, cl ;code第5位送edx
00403F37 .83EA 30 sub edx, 30
00403F3A .3BC2 cmp eax, edx
00403F3C .74 3A je short 00403F78
00403F3E >807C24 19 39cmp byte ptr , 39 ;name第1位是否为0x39='9'
00403F43 0F85 85000000 jnz 00403FCE ;不等就出错
00403F49 .807C24 13 33cmp byte ptr , 33 ;name第2位是否为0x33='3'
00403F4E 75 7E jnz short 00403FCE ;不等就出错
00403F50 .807C24 14 30cmp byte ptr , 30 ;name第3位是否为0x30='0'
00403F55 75 77 jnz short 00403FCE ;不等就出错
00403F57 .8A5424 15 mov dl,
00403F5B .B0 31 mov al, 31
00403F5D .3AD0 cmp dl, al ;name第4位是否为0x31='1'
00403F5F 75 6D jnz short 00403FCE ;不等就出错
00403F61 .80F9 33 cmp cl, 33 ;name第5位是否为0x33='3'
00403F64 75 68 jnz short 00403FCE ;不等就出错
00403F66 .384424 1A cmp , al ;name第6位是否为0x31='1'
00403F6A 75 62 jnz short 00403FCE ;不等就出错
00403F6C .807C24 1B 34cmp byte ptr , 34 ;name第7位是否为0x34='4'
00403F71 75 5B jnz short 00403FCE ;不等就出错
00403F73 .80FB 37 cmp bl, 37 ;name第8位是否为0x37='7'
00403F76 75 56 jnz short 00403FCE ;不等就出错
00403F78 >6A 00 push 0
00403F7A .6A 00 push 0
00403F7C .68 B8AE4200 push 0042AEB8 ;registration has succeeded!
00403F81 .E8 6FFC0100 call 00423BF5
00403F86 .8B7E 70 mov edi,
00403F89 .E8 D2210200 call 00426160
00403F8E .8B40 04 mov eax,
00403F91 .57 push edi ; /Arg3
00403F92 .68 D8AA4200 push 0042AAD8 ; |username
00403F97 .68 D0AA4200 push 0042AAD0 ; |option
00403F9C .8BC8 mov ecx, eax ; |
00403F9E .E8 8EFD0100 call 00423D31 ; \MpegJoin.00423D31
00403FA3 .8B7E 74 mov edi,
00403FA6 .E8 B5210200 call 00426160
00403FAB .8B40 04 mov eax,
00403FAE .57 push edi ; /Arg3
00403FAF .68 BCAA4200 push 0042AABC ; |registration_code
00403FB4 .68 D0AA4200 push 0042AAD0 ; |option
00403FB9 .8BC8 mov ecx, eax ; |
00403FBB .E8 71FD0100 call 00423D31 ; \MpegJoin.00423D31
00403FC0 .5B pop ebx
00403FC1 .5F pop edi
00403FC2 .8BCE mov ecx, esi
00403FC4 .5E pop esi
00403FC5 .5D pop ebp
00403FC6 .83C4 0C add esp, 0C
00403FC9 .E9 118B0100 jmp 0041CADF
00403FCE >6A 00 push 0
00403FD0 .6A 00 push 0
00403FD2 .68 A0AE4200 push 0042AEA0 ;registration failed!
00403FD7 .E8 19FC0100 call 00423BF5
--------------------------------------------------------------------------------
【经验总结】
比较简单的一个软件,明码比较.
要求:用户名大于2, 注册码长度大于8
可用的一组注册信息:
Name:vacant
Code:89917xxx(xxx代表任意字符)
万能注册码:93013147
附上C算法注册机,初学者程序写得很烂,勿见怪,请指出错误.
#include "stdio.h"
#include "conio.h"
void main()
{
int len,i,eax;
char name={0};
char code={0};
printf("Name:");
scanf("%s",name);
len=strlen(name);
for(i=0;i<len;i++)
{
eax+=name;
}
code=(name|0x44)%0xA;
code=(name|0x43)%0xA;
code=(name|0x43)%0xA;
code=(name|0x44)%0xA;
code=eax%0xA;
printf("Code:");
for(i=0;i<8;i++)
{
printf("%d",code);
}
getch();
}
--------------------------------------------------------------------------------
【版权声明】:转载请注明作者并保持文章的完整, 谢谢!
2006年06月30日 1:20:03 呵呵~~学习咯!
兄弟有时间教教咱们编C++ KeyGen! 支持一下.写的很不错.适合我们新手! 学习!~~~~`
页:
[1]