【破文标题】Mpeg Joiner算法分析
【破文作者】小娃崽[DFCG]
【作者邮箱】wanzailuan@yahoo.com.cn
【作者主页】
【破解工具】OllyDbg
【破解平台】xp+sp2
【软件名称】Mpeg Joiner
【软件大小】244KB
【原版下载】http://www.skycn.com/soft/17764.html
【保护方式】时间限制+功能限制
【软件简介】MPEG影片合并的工具软件 - MPEG Joiner,是一款很容易操作的软件,它能够将多个 MPEG 影片档案加以合并成一个单一档案,如此对观看、烧录、传送给他人都更加的方便,您只要选择所要合并的MPEG 档案,再按下Joiner,一切就大功告成了。
------------------------------------------------------------------------
00403D13    .  55                    push ebp
00403D14    .  56                    push esi
00403D15    .  57                    push edi
00403D16    .  BF 01000000           mov edi,1
00403D1B    .  57                    push edi
00403D1C    .  8BF1                  mov esi,ecx
00403D1E    .  E8 C8A30100           call MpegJoin.0041E0EB
00403D23    .  8B46 70               mov eax,dword ptr ds:[esi+70]             ;  用户名到EAX
00403D26    .  8B68 F4               mov ebp,dword ptr ds:[eax-C]              ;  用户名长度到EBP
00403D29    .  83FD 02               cmp ebp,2
00403D2C    .  7D 15                 jge short MpegJoin.00403D43               ;  用户名长度要≥2
00403D2E    .  6A 00                 push 0
00403D30    .  6A 00                 push 0
00403D32    .  68 FCAE4200           push MpegJoin.0042AEFC                    ;  ASCII "Please input correct User Name!"
00403D37    .  E8 B9FE0100           call MpegJoin.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,dword ptr ds:[esi+74]             ;  注册码到ECX
00403D46    .  8379 F4 08            cmp dword ptr ds:[ecx-C],8
00403D4A    .  7D 15                 jge short MpegJoin.00403D61               ;  注册码长度要≥8
00403D4C    .  6A 00                 push 0
00403D4E    .  6A 00                 push 0
00403D50    .  68 D4AE4200           push MpegJoin.0042AED4                    ;  ASCII "Please input correct Registration Code!"
00403D55    .  E8 9BFE0100           call MpegJoin.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,dword ptr ds:[esi+70]             ;  用户名到EAX
00403D64    .  8B48 F4               mov ecx,dword ptr ds:[eax-C]              ;  注册码到ECX
00403D67    .  85C9                  test ecx,ecx
00403D69       7D 0A                 jge short MpegJoin.00403D75
00403D6B    .  68 57000780           push 80070057
00403D70    .  E8 BBD6FFFF           call MpegJoin.00401430
00403D75    >  8A10                  mov dl,byte ptr ds:[eax]
00403D77    .  8B46 70               mov eax,dword ptr ds:[esi+70]
00403D7A    .  3978 F4               cmp dword ptr ds:[eax-C],edi
00403D7D    .  7D 0A                 jge short MpegJoin.00403D89
00403D7F    .  68 57000780           push 80070057
00403D84    .  E8 A7D6FFFF           call MpegJoin.00401430
00403D89    >  8A40 01               mov al,byte ptr ds:[eax+1]
00403D8C    .  884424 0E             mov byte ptr ss:[esp+E],al
00403D90    .  8B46 70               mov eax,dword ptr ds:[esi+70]
00403D93    .  8B48 F4               mov ecx,dword ptr ds:[eax-C]
00403D96    .  85C9                  test ecx,ecx
00403D98    .  7D 0A                 jge short MpegJoin.00403DA4
00403D9A    .  68 57000780           push 80070057
00403D9F    .  E8 8CD6FFFF           call MpegJoin.00401430
00403DA4    >  8B4E 70               mov ecx,dword ptr ds:[esi+70]
00403DA7    .  53                    push ebx
00403DA8    .  8A18                  mov bl,byte ptr ds:[eax]
00403DAA    .  3979 F4               cmp dword ptr ds:[ecx-C],edi
00403DAD    .  7D 0A                 jge short MpegJoin.00403DB9
00403DAF    .  68 57000780           push 80070057
00403DB4    .  E8 77D6FFFF           call MpegJoin.00401430
00403DB9    >  0FB6C2                movzx eax,dl                              ;  用户名第1位到EAX
00403DBC    .  83C8 44               or eax,44                                 ;  or 44
00403DBF    .  99                    cdq
00403DC0    .  BF 0A000000           mov edi,0A
00403DC5    .  F7FF                  idiv edi                                  ;  除以A
00403DC7    .  0FB64424 12           movzx eax,byte ptr ss:[esp+12]            ;  用户名第2位到EAX
00403DCC    .  83C8 43               or eax,43                                 ;  or 43
00403DCF    .  885424 16             mov byte ptr ss:[esp+16],dl               ;  上面的得到的余数到[ESP+16]
00403DD3    .  99                    cdq
00403DD4    .  F7FF                  idiv edi                                  ;  除以A
00403DD6    .  0FB6C3                movzx eax,bl                              ;  用户名第1位到EAX
00403DD9    .  83C8 43               or eax,43                                 ;  OR 43
00403DDC    .  885424 12             mov byte ptr ss:[esp+12],dl               ;  上面得到的余数到[EBP+12]
00403DE0    .  99                    cdq
00403DE1    .  F7FF                  idiv edi                                  ;  除以A
00403DE3    .  0FB641 01             movzx eax,byte ptr ds:[ecx+1]             ;  用户名第2位到EAX
00403DE7    .  83C8 44               or eax,44                                 ;  or 44
00403DEA    .  8BCF                  mov ecx,edi                               ;  ECX=EDI=A
00403DEC    .  885424 17             mov byte ptr ss:[esp+17],dl               ;  上面得到的余数到[ESP+17]
00403DF0    .  99                    cdq
00403DF1    .  F7F9                  idiv ecx                                  ;  除以A
00403DF3    .  33C0                  xor eax,eax                               ;  EAX清零
00403DF5    .  33C9                  xor ecx,ecx                               ;  ECX清零
00403DF7    .  85ED                  test ebp,ebp
00403DF9    .  885424 18             mov byte ptr ss:[esp+18],dl               ;  上面得到的余数到[ESP+18]
00403DFD    .  7E 20                 jle short MpegJoin.00403E1F
00403DFF    .  90                    nop
00403E00    >  85C9                  test ecx,ecx                              ;  ECX清零,做计数器
00403E02    .  0F8C D2000000         jl MpegJoin.00403EDA
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00403E08    .  8B7E 70               mov edi,dword ptr ds:[esi+70]             ;  用户名到EDI
00403E0B    .  3B4F F4               cmp ecx,dword ptr ds:[edi-C]
00403E0E    .  0F8F C6000000         jg MpegJoin.00403EDA
00403E14    .  0FB6140F              movzx edx,byte ptr ds:[edi+ecx]           ;  EDX依次等于用户名的各个位
00403E18    .  03C2                  add eax,edx                               ;  EAX=EAX+EDX
00403E1A    .  41                    inc ecx                                   ;  计数器+1
00403E1B    .  3BCD                  cmp ecx,ebp                               ;  小于继续循环
00403E1D    .^ 7C E1                 jl short MpegJoin.00403E00
~~~~~~~~~~~~~~~~~~~~~~~~~~~循环的结果是累加用户名各位累加~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00403E1F    >  8B4E 74               mov ecx,dword ptr ds:[esi+74]             ;  注册码到ECX
00403E22    .  8B51 F4               mov edx,dword ptr ds:[ecx-C]              ;  注册码长度到EDX
00403E25    .  85D2                  test edx,edx
00403E27    .  7D 0A                 jge short MpegJoin.00403E33
00403E29    .  68 57000780           push 80070057
00403E2E    .  E8 FDD5FFFF           call MpegJoin.00401430
00403E33    >  8A11                  mov dl,byte ptr ds:[ecx]
00403E35    .  8B4E 74               mov ecx,dword ptr ds:[esi+74]
00403E38    .  8379 F4 01            cmp dword ptr ds:[ecx-C],1
00403E3C    .  885424 19             mov byte ptr ss:[esp+19],dl               ;  注册码第1位到[ESP+19]
00403E40    .  7D 0A                 jge short MpegJoin.00403E4C
00403E42    .  68 57000780           push 80070057
00403E47    .  E8 E4D5FFFF           call MpegJoin.00401430
00403E4C    >  8A49 01               mov cl,byte ptr ds:[ecx+1]
00403E4F    .  8B7E 74               mov edi,dword ptr ds:[esi+74]
00403E52    .  884C24 13             mov byte ptr ss:[esp+13],cl               ;  注册码第2位到[ESP+13]
00403E56    .  837F F4 02            cmp dword ptr ds:[edi-C],2
00403E5A    .  7D 0A                 jge short MpegJoin.00403E66
00403E5C    .  68 57000780           push 80070057
00403E61    .  E8 CAD5FFFF           call MpegJoin.00401430
00403E66    >  8A4F 02               mov cl,byte ptr ds:[edi+2]
00403E69    .  8B7E 74               mov edi,dword ptr ds:[esi+74]
00403E6C    .  884C24 14             mov byte ptr ss:[esp+14],cl               ;  注册码第3位到[ESP+14]
00403E70    .  837F F4 03            cmp dword ptr ds:[edi-C],3
00403E74    .  7D 0A                 jge short MpegJoin.00403E80
00403E76    .  68 57000780           push 80070057
00403E7B    .  E8 B0D5FFFF           call MpegJoin.00401430
00403E80    >  8A4F 03               mov cl,byte ptr ds:[edi+3]
00403E83    .  8B7E 74               mov edi,dword ptr ds:[esi+74]
00403E86    .  884C24 15             mov byte ptr ss:[esp+15],cl               ;  注册码第4位到ESP+15
00403E8A    .  837F F4 04            cmp dword ptr ds:[edi-C],4
00403E8E    .  7D 0A                 jge short MpegJoin.00403E9A
00403E90    .  68 57000780           push 80070057
00403E95    .  E8 96D5FFFF           call MpegJoin.00401430
00403E9A    >  8A4F 04               mov cl,byte ptr ds:[edi+4]                ;  注册码第5位到cl
00403E9D    .  8B7E 74               mov edi,dword ptr ds:[esi+74]
00403EA0    .  837F F4 05            cmp dword ptr ds:[edi-C],5
00403EA4    .  7D 0A                 jge short MpegJoin.00403EB0
00403EA6    .  68 57000780           push 80070057
00403EAB    .  E8 80D5FFFF           call MpegJoin.00401430
00403EB0    >  8A5F 05               mov bl,byte ptr ds:[edi+5]
00403EB3    .  8B7E 74               mov edi,dword ptr ds:[esi+74]
00403EB6    .  885C24 1A             mov byte ptr ss:[esp+1A],bl               ;  注册码第6位到[ESP=1A]
00403EBA    .  837F F4 06            cmp dword ptr ds:[edi-C],6
00403EBE    .  7D 0A                 jge short MpegJoin.00403ECA
00403EC0    .  68 57000780           push 80070057
00403EC5    .  E8 66D5FFFF           call MpegJoin.00401430
00403ECA    >  8A5F 06               mov bl,byte ptr ds:[edi+6]
00403ECD    .  8B7E 74               mov edi,dword ptr ds:[esi+74]
00403ED0    .  885C24 1B             mov byte ptr ss:[esp+1B],bl               ;  注册码第7位到[ESP+1B]
00403ED4    .  837F F4 07            cmp dword ptr ds:[edi-C],7
00403ED8    .  7D 0A                 jge short MpegJoin.00403EE4
00403EDA    >  68 57000780           push 80070057
00403EDF    .  E8 4CD5FFFF           call MpegJoin.00401430
00403EE4    >  8A5F 07               mov bl,byte ptr ds:[edi+7]
00403EE7    .  0FB67C24 16           movzx edi,byte ptr ss:[esp+16]            ;  用户名第1位经过运算后的值到EDI
00403EEC    .  0FB6D2                movzx edx,dl
00403EEF    .  83EA 30               sub edx,30                                ;  取数值本身
00403EF2    .  3BFA                  cmp edi,edx                               ;  比较注册码第一位
00403EF4       75 48                 jnz short MpegJoin.00403F3E
00403EF6    .  0FB65424 13           movzx edx,byte ptr ss:[esp+13]
00403EFB    .  0FB67C24 12           movzx edi,byte ptr ss:[esp+12]            ;  用户名第2位经过运算后的值到EDI
00403F00    .  83EA 30               sub edx,30
00403F03    .  3BFA                  cmp edi,edx                               ;  比较注册码第2位
00403F05       75 37                 jnz short MpegJoin.00403F3E
00403F07    .  0FB65424 14           movzx edx,byte ptr ss:[esp+14]
00403F0C    .  0FB67C24 17           movzx edi,byte ptr ss:[esp+17]
00403F11    .  83EA 30               sub edx,30
00403F14    .  3BFA                  cmp edi,edx                               ;  比较注册码第3位
00403F16    .  75 26                 jnz short MpegJoin.00403F3E
00403F18    .  0FB65424 15           movzx edx,byte ptr ss:[esp+15]
00403F1D    .  0FB67C24 18           movzx edi,byte ptr ss:[esp+18]
00403F22    .  83EA 30               sub edx,30
00403F25    .  3BFA                  cmp edi,edx                               ;  比较注册码第4位
00403F27       75 15                 jnz short MpegJoin.00403F3E
00403F29    .  99                    cdq
00403F2A    .  BF 0A000000           mov edi,0A
00403F2F    .  F7FF                  idiv edi                                  ;  用户名累加值除以A
00403F31    .  0FB6C2                movzx eax,dl                              ;  余数到EAX
00403F34    .  0FB6D1                movzx edx,cl                              ;  注册码第5位到EDX
00403F37    .  83EA 30               sub edx,30
00403F3A    .  3BC2                  cmp eax,edx                               ;  比较注册码第5位
00403F3C    .  74 3A                 je short MpegJoin.00403F78
//////////////////////////////////////////////////////////////////////////////
根据以上分析可以得出以下结论:
注册码第1位=(用户名第1位ASCII码 or 44) mod 0A
注册码第2位=(用户名第2位ASCII码 or 43) mod 0A
注册码第3位=(用户名第1位ASCII码 or 43) mod 0A
注册码第4位=(用户名第1位ASCII码 or 44) mod 0A
注册码第5位=(用户名各位ASCII码的值累加) mod 0A
用户名必须大于等于2位
注册码必须大于等于8位,但是只比较前5位
////////////////////////////////////////////////////////////////
00403F3E    >  807C24 19 39          cmp byte ptr ss:[esp+19],39                  ;注册码第一位是9吗?
00403F43       0F85 85000000         jnz MpegJoin.00403FCE
00403F49    .  807C24 13 33          cmp byte ptr ss:[esp+13],33                  ;注册码第2位是3吗?
00403F4E       75 7E                 jnz short MpegJoin.00403FCE
00403F50    .  807C24 14 30          cmp byte ptr ss:[esp+14],30                   ;注册码第3位是0吗?
00403F55       75 77                 jnz short MpegJoin.00403FCE
00403F57    .  8A5424 15             mov dl,byte ptr ss:[esp+15]
00403F5B    .  B0 31                 mov al,31 
00403F5D    .  3AD0                  cmp dl,al                                     ;注册码第4位是1吗 
00403F5F       75 6D                 jnz short MpegJoin.00403FCE                          
00403F61    .  80F9 33               cmp cl,33                                     ;注册码第5位是3吗
00403F64       75 68                 jnz short MpegJoin.00403FCE
00403F66    .  384424 1A             cmp byte ptr ss:[esp+1A],al                    ;注册码第6位是1吗  
00403F6A       75 62                 jnz short MpegJoin.00403FCE
00403F6C    .  807C24 1B 34          cmp byte ptr ss:[esp+1B],34                    ;注册码第7位是4吗 
00403F71       75 5B                 jnz short MpegJoin.00403FCE
00403F73    .  80FB 37               cmp bl,37                                       ;注册码第8位是7吗 
00403F76       75 56                 jnz short MpegJoin.00403FCE
///////////////////////////////////////////////////////////////////////////////////////////////
根据以上分析我们可以得到一个万能注册码:
用户名:随意填写(大于两位即可)
注册码:93013147
///////////////////////////////////////////////////////////////////////////////////////////////
00403F78    >  6A 00                 push 0
00403F7A    .  6A 00                 push 0
00403F7C    .  68 B8AE4200           push MpegJoin.0042AEB8                    ;  ASCII "Registration has succeeded!"
00403F81    .  E8 6FFC0100           call MpegJoin.00423BF5
00403F86    .  8B7E 70               mov edi,dword ptr ds:[esi+70]
00403F89    .  E8 D2210200           call MpegJoin.00426160
00403F8E    .  8B40 04               mov eax,dword ptr ds:[eax+4]
00403F91    .  57                    push edi                                  ; /Arg3
00403F92    .  68 D8AA4200           push MpegJoin.0042AAD8                    ; |Arg2 = 0042AAD8 ASCII "username"
00403F97    .  68 D0AA4200           push MpegJoin.0042AAD0                    ; |Arg1 = 0042AAD0 ASCII "Option"
00403F9C    .  8BC8                  mov ecx,eax                               ; |
00403F9E    .  E8 8EFD0100           call MpegJoin.00423D31                    ; \MpegJoin.00423D31
00403FA3    .  8B7E 74               mov edi,dword ptr ds:[esi+74]
00403FA6    .  E8 B5210200           call MpegJoin.00426160
00403FAB    .  8B40 04               mov eax,dword ptr ds:[eax+4]
00403FAE    .  57                    push edi                                  ; /Arg3
00403FAF    .  68 BCAA4200           push MpegJoin.0042AABC                    ; |Arg2 = 0042AABC ASCII "registration_code"
00403FB4    .  68 D0AA4200           push MpegJoin.0042AAD0                    ; |Arg1 = 0042AAD0 ASCII "Option"
00403FB9    .  8BC8                  mov ecx,eax                               ; |
00403FBB    .  E8 71FD0100           call MpegJoin.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 MpegJoin.0041CADF
00403FCE    >  6A 00                 push 0
00403FD0    .  6A 00                 push 0
00403FD2    .  68 A0AE4200           push MpegJoin.0042AEA0                    ;  ASCII "Registration failed!"
00403FD7    .  E8 19FC0100           call MpegJoin.00423BF5
00403FDC    .  5B                    pop ebx
00403FDD    .  5F                    pop edi
00403FDE    .  5E                    pop esi
00403FDF    .  5D                    pop ebp
00403FE0    .  83C4 0C               add esp,0C
00403FE3    .  C3                    retn
###########################################################################################
算法注册机如下:
Dim serial1, serial2, serial3, serial4, serial5, serial6 As Integer
Dim sum As Integer
Dim i As Integer


Private Sub Command1_Click()
If Len(Text1.Text) < 2 Then
 PROMPT = MsgBox("用户名至少两位以上!", vbOKOnly, "ERROR")
End If

serial1 = (Asc(Mid(Text1.Text, 1, 1)) Or &H44) Mod &HA
Rem 计算注册码第1位
serial2 = (Asc(Mid(Text1.Text, 2, 1)) Or &H43) Mod &HA
Rem 计算注册码第2位
serial3 = (Asc(Mid(Text1.Text, 1, 1)) Or &H43) Mod &HA
Rem 计算注册码第3位
serial4 = (Asc(Mid(Text1.Text, 2, 1)) Or &H44) Mod &HA
Rem 计算注册码第4位
   sum = 0
    For i = 1 To Len(Text1.Text)
       sum = sum + Asc(Mid(Text1.Text, i, 1))
    Next i
serial5 = sum Mod &HA
Rem 计算注册码第5位
serial6 = Fix(Rnd * 900) + 100
Rem 随机产生三位数
Text2.Text = Trim(Str(serial1)) + Trim(Str(serial2)) + Trim(Str(serial3)) + Trim(Str(serial4)) + Trim(Str(serial5)) _
             + Trim(Str(serial6))
Rem text2显示的就是注册码
End Sub
###########################################################################################



------------------------------------------------------------------------
国内的软件比较难破,这个软件可能和open Viedo Converter软件作者是同一个人,算法一模一样!!
------------------------------------------------------------------------
【版权声明】"破"文一篇,请随意转载,但请保持文章的完整性

  • 标 题: 答复
  • 作 者:小娃崽
  • 时 间:2006-06-24 20:30

引用: 最初由 老头 发布
哈哈,又坐上了沙发,学习!学习!
只是楼主有点笔误,在写注册机是出现一点小的笔误,如果,小于两位就会出现“实时错误5” 


谢谢指点,改成如下结构应该没问题了:
If Len(Text1.Text) < 2 Then
 PROMPT = MsgBox("用户名至少两位以上!", vbOKOnly, "ERROR")
Else
............
  计算注册码
 ...........
END IF