【文章标题】: 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