【文章标题】: OpenVedioJoiner V3.02算法分析
【作    者】: elance
【邮    箱】: liupengnpu@163.com
【主    页】: elance.ys168.com
【QQ    号】: 275199621
【软件名称】: OpenVedioJoiner V3.02
【大    小】: 500K
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 用户名加序列号
【编写语言】: C++
【工    具】: OLLYDBG
【操作平台】: WinXP
【软件介绍】: 视频合成与压缩
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  首次运行输入用户名:elance注册码:841021,呵呵,当然会报错啦。错误提示:"Please input correct......"
  用PEID检查,没有加壳,爽啊!
  用OD载入程序,字符串参考,搜索“Please input.....",来到:
  00422E6A  |.  68 F4CF4500   push    0045CFF4                         ;  please input correct registration code!
  00422E6F  |.  E8 47AE0200   call    0044DCBB
  00422E74  |.  E9 86020000   jmp     004230FF
  00422E79  |>  6A 00         push    0                                ; /Arg1 = 00000000
  00422E7B  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422E7E  |.  83C1 70       add     ecx, 70                          ; |
  00422E81  |.  E8 EAF4FFFF   call    00422370                         ; \VideoJoi.00422370
  。。。。。。。。
  往上看:
  
  00422E20  /.  55            push    ebp                          //定义堆栈帧
  00422E21  |.  8BEC          mov     ebp, esp
  00422E23  |.  83EC 20       sub     esp, 20
  00422E26  |.  894D E0       mov     [ebp-20], ecx
  00422E29  |.  6A 01         push    1
  00422E2B  |.  8B4D E0       mov     ecx, [ebp-20]
  00422E2E  |.  E8 FC130200   call    0044422F
  00422E33  |.  8B4D E0       mov     ecx, [ebp-20]
  00422E36  |.  83C1 70       add     ecx, 70
  00422E39  |.  E8 A28CFEFF   call    0040BAE0
  00422E3E  |.  83F8 02       cmp     eax, 2                          //用户名小于两位则出错
  00422E41  |.  7D 13         jge     short 00422E56
  00422E43  |.  6A 00         push    0
  00422E45  |.  6A 00         push    0
  00422E47  |.  68 D4CF4500   push    0045CFD4                         ;  please input correct user name!
  00422E4C  |.  E8 6AAE0200   call    0044DCBB
  00422E51  |.  E9 A9020000   jmp     004230FF
  00422E56  |>  8B4D E0       mov     ecx, [ebp-20]
  。。。。。。。。
  好,有点明白了,在00422E20出F2下断。
  F9运行,输入用户名:elance,注册码:841021,确定,程序中断在00422E20处
  单步跟踪,
  00422E59  |.  83C1 74       add     ecx, 74
  00422E5C  |.  E8 7F8CFEFF   call    0040BAE0
  00422E61  |.  83F8 08       cmp     eax, 8                          
  00422E64  |.  7D 13         jge     short 00422E79                    //注册码长度小于八位则出现错误信息
  00422E66  |.  6A 00         push    0
  00422E68  |.  6A 00         push    0
  00422E6A  |.  68 F4CF4500   push    0045CFF4                         ;  please input correct registration code!
  00422E6F  |.  E8 47AE0200   call    0044DCBB
  00422E74  |.  E9 86020000   jmp     004230FF
  
  Ctrl+F2重新载入程序,输入用户名:elance,注册码:01234567,来到:
  
  00422E79  |>  6A 00         push    0                                ; /Arg1 = 00000000
  00422E7B  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422E7E  |.  83C1 70       add     ecx, 70                          ; |
  00422E81  |.  E8 EAF4FFFF   call    00422370                         ; \VideoJoi.00422370
  00422E86  |.  8845 EF       mov     [ebp-11], al                     ;                        //取用户名第一位 e 送到ebp-11
  00422E89  |.  6A 01         push    1                                ; /Arg1 = 00000001
  00422E8B  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422E8E  |.  83C1 70       add     ecx, 70                          ; |
  00422E91  |.  E8 DAF4FFFF   call    00422370                         ; \VideoJoi.00422370
  00422E96  |.  8845 F8       mov     [ebp-8], al                      ;                        // 取用户名第二位 l 送到ebp-8
  00422E99  |.  6A 00         push    0                                ; /Arg1 = 00000000
  00422E9B  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422E9E  |.  83C1 70       add     ecx, 70                          ; |
  00422EA1  |.  E8 CAF4FFFF   call    00422370                         ; \VideoJoi.00422370
  00422EA6  |.  8845 FF       mov     [ebp-1], al                      ;                        //取用户名第一位 e 送到ebp-1
  00422EA9  |.  6A 01         push    1                                ; /Arg1 = 00000001
  00422EAB  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422EAE  |.  83C1 70       add     ecx, 70                          ; |
  00422EB1  |.  E8 BAF4FFFF   call    00422370                         ; \VideoJoi.00422370
  00422EB6  |.  8845 FA       mov     [ebp-6], al                      ;                        // 取用户名第二位 l 送到ebp-6
  00422EB9  |.  0FB645 EF     movzx   eax, byte ptr [ebp-11]                                    //eax='e'
  00422EBD  |.  83C8 4F       or      eax, 4F                                                   //eax=eax or 4f='o'
  00422EC0  |.  8845 EF       mov     [ebp-11], al                     ;                        //送'o'到ebp-11
  00422EC3  |.  0FB64D F8     movzx   ecx, byte ptr [ebp-8]                                     //送'l'到ecx
  00422EC7  |.  83C9 56       or      ecx, 56                                                   //ecx=ecx or 56='~'  
  00422ECA  |.  884D F8       mov     [ebp-8], cl                      ;                        // 送'~'到ebp-8 
  00422ECD  |.  0FB655 FF     movzx   edx, byte ptr [ebp-1]
  00422ED1  |.  83CA 4A       or      edx, 4A
  00422ED4  |.  8855 FF       mov     [ebp-1], dl                      ;                        //ebp-1='o'
  00422ED7  |.  0FB645 FA     movzx   eax, byte ptr [ebp-6]
  00422EDB  |.  83C8 4E       or      eax, 4E
  00422EDE  |.  8845 FA       mov     [ebp-6], al                      ;                        //ebp-6='n'
  00422EE1  |.  0FB645 EF     movzx   eax, byte ptr [ebp-11]                                    //eax='e'
  00422EE5  |.  99            cdq 
  00422EE6  |.  B9 0A000000   mov     ecx, 0A
  00422EEB  |.  F7F9          idiv    ecx                              ;                        // eax='b'
  00422EED  |.  8855 EF       mov     [ebp-11], dl                     ;        //ebp-11=01
  00422EF0  |.  0FB645 F8     movzx   eax, byte ptr [ebp-8]
  00422EF4  |.  99            cdq
  00422EF5  |.  B9 0A000000   mov     ecx, 0A
  00422EFA  |.  F7F9          idiv    ecx                              ;        //eax=0c
  00422EFC  |.  8855 F8       mov     [ebp-8], dl                      ;        //ebp-8= 06
  00422EFF  |.  0FB645 FF     movzx   eax, byte ptr [ebp-1]            ;        //eax='~'
  00422F03  |.  99            cdq
  00422F04  |.  B9 0A000000   mov     ecx, 0A
  00422F09  |.  F7F9          idiv    ecx                              ;        //eax=b
  00422F0B  |.  8855 FF       mov     [ebp-1], dl                      ;        //ebp-1= 01
  00422F0E  |.  0FB645 FA     movzx   eax, byte ptr [ebp-6]            ;        //eax='n'
  00422F12  |.  99            cdq
  00422F13  |.  B9 0A000000   mov     ecx, 0A
  00422F18  |.  F7F9          idiv    ecx
  00422F1A  |.  8855 FA       mov     [ebp-6], dl                      ;        //ebp-6=00
  00422F1D  |.  C745 F0 00000>mov     dword ptr [ebp-10], 0
  00422F24  |.  C745 E8 00000>mov     dword ptr [ebp-18], 0
  00422F2B  |.  EB 09         jmp     short 00422F36
  00422F2D  |>  8B55 E8       /mov     edx, [ebp-18]
  00422F30  |.  83C2 01       |add     edx, 1
  00422F33  |.  8955 E8       |mov     [ebp-18], edx
  00422F36  |>  8B4D E0        mov     ecx, [ebp-20]
  00422F39  |.  83C1 70       |add     ecx, 70
  00422F3C  |.  E8 9F8BFEFF   |call    0040BAE0
  00422F41  |.  3945 E8       |cmp     [ebp-18], eax
  00422F44  |.  7D 1E         |jge     short 00422F64
  00422F46  |.  8B45 E8       |mov     eax, [ebp-18]
  00422F49  |.  50            |push    eax                             ; /Arg1
  00422F4A  |.  8B4D E0       |mov     ecx, [ebp-20]                   ; |
  00422F4D  |.  83C1 70       |add     ecx, 70                         ; |
  00422F50  |.  E8 1BF4FFFF   |call    00422370                        ; \VideoJoi.00422370
  00422F55  |.  8845 E7       |mov     [ebp-19], al                    ;       //取用户名第一位 e 送到ebp-19
  00422F58  |.  0FB64D E7     |movzx   ecx, byte ptr [ebp-19]
  00422F5C  |.  034D F0       |add     ecx, [ebp-10]                   ;  
  00422F5F  |.  894D F0       |mov     [ebp-10], ecx                   ;  
  00422F62  |.^ EB C9         \jmp     short 00422F2D
  00422F64  |>  8B45 F0       mov     eax, [ebp-10]
  00422F67  |.  99            cdq
  00422F68  |.  B9 0A000000   mov     ecx, 0A
  00422F6D  |.  F7F9          idiv    ecx                              ;          //此时eax=3d
  00422F6F  |.  8855 F4       mov     [ebp-C], dl                      ;          //ebp-c=06
  00422F72  |.  6A 00         push    0                                ; /Arg1 = 00000000
  00422F74  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422F77  |.  83C1 74       add     ecx, 74                          ; |
  00422F7A  |.  E8 F1F3FFFF   call    00422370                         ; \VideoJoi.00422370
  00422F7F  |.  8845 FC       mov     [ebp-4], al                      ;         //ebp-4=00
  00422F82  |.  6A 01         push    1                                ; /Arg1 = 00000001
  00422F84  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422F87  |.  83C1 74       add     ecx, 74                          ; |
  00422F8A  |.  E8 E1F3FFFF   call    00422370                         ; \VideoJoi.00422370
  00422F8F  |.  8845 FD       mov     [ebp-3], al                      ;         // ebp-3=1
  00422F92  |.  6A 02         push    2                                ; /Arg1 = 00000002
  00422F94  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422F97  |.  83C1 74       add     ecx, 74                          ; |
  00422F9A  |.  E8 D1F3FFFF   call    00422370                         ; \VideoJoi.00422370
  00422F9F  |.  8845 F6       mov     [ebp-A], al                      ;          //ebp-a=2
  00422FA2  |.  6A 03         push    3                                ; /Arg1 = 00000003
  00422FA4  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422FA7  |.  83C1 74       add     ecx, 74                          ; |
  00422FAA  |.  E8 C1F3FFFF   call    00422370                         ; \VideoJoi.00422370
  00422FAF  |.  8845 F5       mov     [ebp-B], al                      ;          //ebp-b=3
  00422FB2  |.  6A 04         push    4                                ; /Arg1 = 00000004
  00422FB4  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422FB7  |.  83C1 74       add     ecx, 74                          ; |
  00422FBA  |.  E8 B1F3FFFF   call    00422370                         ; \VideoJoi.00422370
  00422FBF  |.  8845 F9       mov     [ebp-7], al                      ;          //ebp-7=4
  00422FC2  |.  6A 05         push    5                                ; /Arg1 = 00000005
  00422FC4  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422FC7  |.  83C1 74       add     ecx, 74                          ; |
  00422FCA  |.  E8 A1F3FFFF   call    00422370                         ; \VideoJoi.00422370
  00422FCF  |.  8845 F7       mov     [ebp-9], al                      ;           //ebp-9=5
  00422FD2  |.  6A 06         push    6                                ; /Arg1 = 00000006
  00422FD4  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422FD7  |.  83C1 74       add     ecx, 74                          ; |
  00422FDA  |.  E8 91F3FFFF   call    00422370                         ; \VideoJoi.00422370
  00422FDF  |.  8845 FE       mov     [ebp-2], al                      ;         //ebp-2=6
  00422FE2  |.  6A 07         push    7                                ; /Arg1 = 00000007
  00422FE4  |.  8B4D E0       mov     ecx, [ebp-20]                    ; |
  00422FE7  |.  83C1 74       add     ecx, 74                          ; |
  00422FEA  |.  E8 81F3FFFF   call    00422370                         ; \VideoJoi.00422370
  00422FEF  |.  8845 FB       mov     [ebp-5], al                      ;         //ebp-5=7
  00422FF2  |.  0FB655 EF     movzx   edx, byte ptr [ebp-11]           ;         //此时edx=01
  00422FF6  |.  0FB645 FC     movzx   eax, byte ptr [ebp-4]            ;          //此时eax='0'  
  
  唉,好累,好像也没什么操作啊?柔柔眼,接着往下看:
  0422FFA  |.  83E8 30       sub     eax, 30
  00422FFD  |.  3BD0          cmp     edx, eax
  00422FFF  |.  75 3C         jnz     short 0042303D
  00423001  |.  0FB64D F8     movzx   ecx, byte ptr [ebp-8]
  00423005  |.  0FB655 FD     movzx   edx, byte ptr [ebp-3]
  00423009  |.  83EA 30       sub     edx, 30
  0042300C  |.  3BCA          cmp     ecx, edx
  0042300E  |.  75 2D         jnz     short 0042303D
  00423010  |.  0FB645 FF     movzx   eax, byte ptr [ebp-1]
  00423014  |.  0FB64D F6     movzx   ecx, byte ptr [ebp-A]
  00423018  |.  83E9 30       sub     ecx, 30
  0042301B  |.  3BC1          cmp     eax, ecx
  0042301D  |.  75 1E         jnz     short 0042303D
  0042301F  |.  0FB655 FA     movzx   edx, byte ptr [ebp-6]
  00423023  |.  0FB645 F5     movzx   eax, byte ptr [ebp-B]
  00423027  |.  83E8 30       sub     eax, 30
  0042302A  |.  3BD0          cmp     edx, eax
  0042302C  |.  75 0F         jnz     short 0042303D
  0042302E  |.  0FB64D F4     movzx   ecx, byte ptr [ebp-C]
  00423032  |.  0FB655 F9     movzx   edx, byte ptr [ebp-7]
  00423036  |.  83EA 30       sub     edx, 30
  00423039  |.  3BCA          cmp     ecx, edx
  0042303B  |.  74 58         je      short 00423095
  0042303D  |>  0FB645 FC     movzx   eax, byte ptr [ebp-4]            ;       
  00423041  |.  83F8 35       cmp     eax, 35                                  //取注册码第一位与’5‘比较
  00423044      0F85 A7000000 jne      004230F1                                //不是5则出错
  0042304A  |.  0FB64D FD     movzx   ecx, byte ptr [ebp-3]            ;      
  0042304E  |.  83F9 31       cmp     ecx, 31                                  //取注册码第二位与’1‘比较
  00423051  |.  0F85 9A000000 jnz     004230F1                                 //不同就出错
  00423057  |.  0FB655 F6     movzx   edx, byte ptr [ebp-A]            ;       
  0042305B  |.  83FA 38       cmp     edx, 38                                  //取注册码第撒三位与’8‘比较
  0042305E      0F85 8D000000 jne      004230F1                                //不同就出错
  00423064  |.  0FB645 F5     movzx   eax, byte ptr [ebp-B]            ; 
  00423068  |.  83F8 39       cmp     eax, 39                                    //取注册码第撒四位与’9‘比较
  0042306B      0F85 80000000 jne      004230F1                                 //不同就出错
  00423071  |.  0FB64D F9     movzx   ecx, byte ptr [ebp-7]            ; 
  00423075  |.  83F9 37       cmp     ecx, 37                                        //取注册码第撒五位与’7‘比较
  00423078      75 77         jne      short 004230F1                               //不同就出错
  0042307A  |.  0FB655 F7     movzx   edx, byte ptr [ebp-9]            ;  
  0042307E  |.  83FA 36       cmp     edx, 36                                    //取注册码第撒六位与’6‘比较
  00423081  |.  75 6E         jnz     short 004230F1                          
  00423083  |.  0FB645 FE     movzx   eax, byte ptr [ebp-2]               
  00423087  |.  83F8 31       cmp     eax, 31                                     //取注册码第撒七位与’1‘比较
  0042308A  |.  75 65         jnz     short 004230F1                              //不同就出错
  0042308C  |.  0FB64D FB     movzx   ecx, byte ptr [ebp-5]
  00423090  |.  83F9 38       cmp     ecx, 38                                      //取注册码第撒八位与’8‘比较    
  00423093  |.  75 5C         jnz     short 004230F1                                //不同就出错
  00423095  |>  6A 00         push    0
  00423097  |.  6A 00         push    0
  00423099  |.  68 1CD04500   push    0045D01C                         ;  registration has succeeded!
  0042309E  |.  E8 18AC0200   call    0044DCBB
  004230A3  |.  8B4D E0       mov     ecx, [ebp-20]
  004230A6  |.  83C1 70       add     ecx, 70
  004230A9  |.  E8 E2F4FFFF   call    00422590
  004230AE  |.  50            push    eax
  004230AF  |.  68 38D04500   push    0045D038                         ;  username
  004230B4  |.  68 44D04500   push    0045D044                         ;  option
  004230B9  |.  E8 D22BFFFF   call    00415C90
  004230BE  |.  8BC8          mov     ecx, eax                         ; |
  004230C0  |.  E8 56A90200   call    0044DA1B                         ; \VideoJoi.0044DA1B
  004230C5  |.  8B4D E0       mov     ecx, [ebp-20]
  004230C8  |.  83C1 74       add     ecx, 74
  004230CB  |.  E8 C0F4FFFF   call    00422590
  004230D0  |.  50            push    eax
  004230D1  |.  68 4CD04500   push    0045D04C                         ;  registration_code
  004230D6  |.  68 60D04500   push    0045D060                         ;  option
  004230DB  |.  E8 B02BFFFF   call    00415C90
  004230E0  |.  8BC8          mov     ecx, eax                         ; |
  004230E2  |.  E8 34A90200   call    0044DA1B                         ; \VideoJoi.0044DA1B
  004230E7  |.  8B4D E0       mov     ecx, [ebp-20]
  004230EA  |.  E8 334F0200   call    00448022
  004230EF  |.  EB 0E         jmp     short 004230FF
  004230F1  |>  6A 00         push    0
  004230F3  |.  6A 00         push    0
  004230F5  |.  68 68D04500   push    0045D068                         ;  registration failed!
  004230FA  |.  E8 BCAB0200   call    0044DCBB
  004230FF  |>  8BE5          mov     esp, ebp
  00423101  |.  5D            pop     ebp
  00423102  \.  C3            retn
  呵呵,终于完了!!!
  至此,我们已弄明白了它的注册码比较原理.
  
  
  可得注册信息---用户名:elance
                    注册码:51897618
  
--------------------------------------------------------------------------------
【总结】
  此软件注册算法不好,居然用明码逐位比较注册码,因此很容易得到他的通用注册码:51897618
  此文章没什么技术含量,浪费大家时间了,实在抱歉!!!:)
  
--------------------------------------------------------------------------------
【版权声明】: 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
                                                                                                                    2006.3.19