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