【文章标题】: MPEG Joiner V2.0.196算法分析(菜鸟级,高手勿进)
【文章作者】: vacant
【作者邮箱】: lok0155@163.com
【软件名称】: 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, [esi+70] ; eax=name地址
00403D26 . 8B68 F4 mov ebp, [eax-C] ; [eax-c]=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, [esi+74] ; ecx=code地址
00403D46 . 8379 F4 08 cmp dword ptr [ecx-C], 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, [esi+70] ; name地址送eax
00403D64 . 8B48 F4 mov ecx, [eax-C] ; 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, [eax] ; name第1位送dl
00403D77 . 8B46 70 mov eax, [esi+70] ; name地址送eax
00403D7A . 3978 F4 cmp [eax-C], edi ; name长度大于1,就跳
00403D7D . 7D 0A jge short 00403D89
00403D7F . 68 57000780 push 80070057
00403D84 . E8 A7D6FFFF call 00401430
00403D89 > 8A40 01 mov al, [eax+1] ; name第2位送al
00403D8C . 884424 0E mov [esp+E], al ; name第2位送[esp+e]
00403D90 . 8B46 70 mov eax, [esi+70] ; name地址送eax
00403D93 . 8B48 F4 mov ecx, [eax-C] ; 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, [esi+70] ; name地址送ecx
00403DA7 . 53 push ebx
00403DA8 . 8A18 mov bl, [eax] ; name第1位送bl
00403DAA . 3979 F4 cmp [ecx-C], 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 [esp+12] ; eax2=name第2位
00403DCC . 83C8 43 or eax, 43 ; eax2=eax2 or 0x43
00403DCF . 885424 16 mov [esp+16], dl ; eax1 余数送[esp+16]
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 [esp+12], dl ; eax2 余数送[esp+12]
00403DE0 . 99 cdq
00403DE1 . F7FF idiv edi
00403DE3 . 0FB641 01 movzx eax, byte ptr [ecx+1] ; eax4=name第2位
00403DE7 . 83C8 44 or eax, 44 ; eax4=eax4 or 44
00403DEA . 8BCF mov ecx, edi ; ecx=0A
00403DEC . 885424 17 mov [esp+17], dl ; eax3 余数送[esp+17]
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 [esp+18], dl ; eax4 余数 送[esp+18]
00403DFD . 7E 20 jle short 00403E1F
00403DFF . 90 nop
00403E00 > 85C9 test ecx, ecx
00403E02 . 0F8C D2000000 jl 00403EDA
00403E08 . 8B7E 70 mov edi, [esi+70]
00403E0B . 3B4F F4 cmp ecx, [edi-C]
00403E0E . 0F8F C6000000 jg 00403EDA
00403E14 . 0FB6140F movzx edx, byte ptr [edi+ecx]
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, [esi+74] ; code地址送ecx
00403E22 . 8B51 F4 mov edx, [ecx-C] ; [ecx-c]是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, [ecx] ; code第1位送dl
00403E35 . 8B4E 74 mov ecx, [esi+74] ; code地址送ecx
00403E38 . 8379 F4 01 cmp dword ptr [ecx-C], 1 ; code长度与1比较
00403E3C . 885424 19 mov [esp+19], dl ; code第1位送[esp+19]
00403E40 . 7D 0A jge short 00403E4C
00403E42 . 68 57000780 push 80070057
00403E47 . E8 E4D5FFFF call 00401430
00403E4C > 8A49 01 mov cl, [ecx+1] ; code第2位送cl
00403E4F . 8B7E 74 mov edi, [esi+74] ; code地址送edi
00403E52 . 884C24 13 mov [esp+13], cl ; code第2位送[esp+13]
00403E56 . 837F F4 02 cmp dword ptr [edi-C], 2 ; code长度大于2,就跳
00403E5A . 7D 0A jge short 00403E66
00403E5C . 68 57000780 push 80070057
00403E61 . E8 CAD5FFFF call 00401430
00403E66 > 8A4F 02 mov cl, [edi+2]
00403E69 . 8B7E 74 mov edi, [esi+74]
00403E6C . 884C24 14 mov [esp+14], cl ; code第3位送[esp+14]
00403E70 . 837F F4 03 cmp dword ptr [edi-C], 3
00403E74 . 7D 0A jge short 00403E80
00403E76 . 68 57000780 push 80070057
00403E7B . E8 B0D5FFFF call 00401430
00403E80 > 8A4F 03 mov cl, [edi+3]
00403E83 . 8B7E 74 mov edi, [esi+74]
00403E86 . 884C24 15 mov [esp+15], cl ; code第4位送[esp+15]
00403E8A . 837F F4 04 cmp dword ptr [edi-C], 4
00403E8E . 7D 0A jge short 00403E9A
00403E90 . 68 57000780 push 80070057
00403E95 . E8 96D5FFFF call 00401430
00403E9A > 8A4F 04 mov cl, [edi+4] ; code第5位送cl
00403E9D . 8B7E 74 mov edi, [esi+74]
00403EA0 . 837F F4 05 cmp dword ptr [edi-C], 5
00403EA4 . 7D 0A jge short 00403EB0
00403EA6 . 68 57000780 push 80070057
00403EAB . E8 80D5FFFF call 00401430
00403EB0 > 8A5F 05 mov bl, [edi+5] ; code第6位送bl
00403EB3 . 8B7E 74 mov edi, [esi+74]
00403EB6 . 885C24 1A mov [esp+1A], bl ; code第6位送[esp+1A]
00403EBA . 837F F4 06 cmp dword ptr [edi-C], 6
00403EBE . 7D 0A jge short 00403ECA
00403EC0 . 68 57000780 push 80070057
00403EC5 . E8 66D5FFFF call 00401430
00403ECA > 8A5F 06 mov bl, [edi+6] ; code第7位送bl
00403ECD . 8B7E 74 mov edi, [esi+74]
00403ED0 . 885C24 1B mov [esp+1B], bl ; code第7位送[esp+1b]
00403ED4 . 837F F4 07 cmp dword ptr [edi-C], 7
00403ED8 . 7D 0A jge short 00403EE4
00403EDA > 68 57000780 push 80070057
00403EDF . E8 4CD5FFFF call 00401430
00403EE4 > 8A5F 07 mov bl, [edi+7] ; code第8位送bl
00403EE7 . 0FB67C24 16 movzx edi, byte ptr [esp+16] ; 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 [esp+13]
00403EFB . 0FB67C24 12 movzx edi, byte ptr [esp+12]
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 [esp+14]
00403F0C . 0FB67C24 17 movzx edi, byte ptr [esp+17]
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 [esp+15]
00403F1D . 0FB67C24 18 movzx edi, byte ptr [esp+18]
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 39 cmp byte ptr [esp+19], 39 ; name第1位是否为0x39='9'
00403F43 0F85 85000000 jnz 00403FCE ; 不等就出错
00403F49 . 807C24 13 33 cmp byte ptr [esp+13], 33 ; name第2位是否为0x33='3'
00403F4E 75 7E jnz short 00403FCE ; 不等就出错
00403F50 . 807C24 14 30 cmp byte ptr [esp+14], 30 ; name第3位是否为0x30='0'
00403F55 75 77 jnz short 00403FCE ; 不等就出错
00403F57 . 8A5424 15 mov dl, [esp+15]
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 [esp+1A], al ; name第6位是否为0x31='1'
00403F6A 75 62 jnz short 00403FCE ; 不等就出错
00403F6C . 807C24 1B 34 cmp byte ptr [esp+1B], 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, [esi+70]
00403F89 . E8 D2210200 call 00426160
00403F8E . 8B40 04 mov eax, [eax+4]
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, [esi+74]
00403FA6 . E8 B5210200 call 00426160
00403FAB . 8B40 04 mov eax, [eax+4]
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[50]={0};
char code[50]={0};
printf("Name:");
scanf("%s",name);
len=strlen(name);
for(i=0;i<len;i++)
{
eax+=name[i];
}
code[0]=(name[0]|0x44)%0xA;
code[1]=(name[1]|0x43)%0xA;
code[2]=(name[0]|0x43)%0xA;
code[3]=(name[1]|0x44)%0xA;
code[4]=eax%0xA;
printf("Code:");
for(i=0;i<8;i++)
{
printf("%d",code[i]);
}
getch();
}
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年06月30日 1:20:03
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)