Alive Video Converter v5.2.0.2 算法分析+注册机[新手思路]
本帖最后由 pj2020 于 2017-3-1 21:44 编辑【文章标题】:Alive Video Converter v5.2.0.2 算法分析+注册机[新手思路]
【文章作者】:pj2020
【软件名称】:Alive Video Converter v5.2.0.2
【软件大小】:6.84M
【保护方式】:注册码
【下载地址】:见附件
【加壳方式】:无壳
【编写工具】:Borland Delphi 6.0 - 7.0
【逆向工具】:PEID、OD
【操作平台】:WinXP3
【作者声明】:只是感兴趣,没有其他目的
【软件简介】Alive Video Converter是一款专业的视频转换工具,支持的格式多,例如AVI、MPEG、WMV、ASF、MOV、QuickTime等。它可以把上述格式的视频转换成AVI(包括DivX、 XviD、 MS-MPEG4等)、MPEG(MPEG-1、MPEG-2、DVD、VCD、SVCD)、WMV、RM等。Alive Video Converter 也是一款音频抽取工具,可以从多中格式的视频中抽出音频,并且保存成MP3格式。它支持批量文件转换可以一次点击转换多个文件。
【思路方法】
======================上篇:内存注册机======================
一、查壳:Borland Delphi 6.0 - 7.0 无壳
二、试注册,有错误提示“Invalid Registration Code!”:
三、OD载入程序,F9运行,查找字符串“Invalid Registration Code!”关键字(只有一处),在这一行双击或回车进入,在段首F2下断:
重新载入程序后,输入假注册名和假码断下,然后F8单步跟踪:
Reg Name:abcde
Registration Code:123456789
可以看到,在F8到0047CA7A,出现真假码对照:
0047CA7A|.E8 35BDF8FF call VideoCon.004087B4 ;//寄存器出现真假码对比
四、做内存注册机:
中断地址:0047CA7A
中断次数:1
第一字节:E8
指令长度:5
Reg Name:abcde
Registration Code:1004A-E643F-24417
经验证,注册成功!
======================下篇:算法注册机(重头戏)======================
前面的步骤跟上面差不多,在0047CA6F|.E8 90010000 call VideoCon.0047CC04 ;F7进入:
0047CC04/$55 push ebp 来到这里:
0047CC05|.8BEC mov ebp,esp
0047CC07|.6A 00 push 0x0
0047CC09|.6A 00 push 0x0
0047CC0B|.6A 00 push 0x0
0047CC0D|.6A 00 push 0x0
0047CC0F|.6A 00 push 0x0
0047CC11|.6A 00 push 0x0
0047CC13|.6A 00 push 0x0
0047CC15|.6A 00 push 0x0
0047CC17|.53 push ebx
0047CC18|.56 push esi
0047CC19|.57 push edi
0047CC1A|.8BD9 mov ebx,ecx
0047CC1C|.8955 FC mov ,edx
0047CC1F|.8BF8 mov edi,eax
0047CC21|.8B45 FC mov eax, ;注册名给EAX
0047CC24|.E8 F37DF8FF call VideoCon.00404A1C
0047CC29|.33C0 xor eax,eax
0047CC2B|.55 push ebp
0047CC2C|.68 5FCD4700 push VideoCon.0047CD5F
0047CC31|.64:FF30 push dword ptr fs:
0047CC34|.64:8920 mov dword ptr fs:,esp
0047CC37|.8D45 FC lea eax,
0047CC3A|.BA 78CD4700 mov edx,VideoCon.0047CD78 ;读取固定字串:Fk2yB$P30jH
0047CC3F|.E8 F87BF8FF call VideoCon.0040483C
0047CC44|.8B45 FC mov eax, ; 注册名与固定字串“Fk2yB$P30jH”相连,为"abcdeFk2yB$P30jH"
0047CC47|.E8 E87BF8FF call VideoCon.00404834
0047CC4C|.8BF0 mov esi,eax ;相连后注册名的长度,这里为16位
0047CC4E|.D1FE sar esi,1 ;算术右移1位,即长度16/2=8,结果给esi=0x8
0047CC50|.79 03 jns short VideoCon.0047CC55
0047CC52|.83D6 00 adc esi,0x0
0047CC55|>8D45 F0 lea eax,
0047CC58|.50 push eax
0047CC59|.8BCE mov ecx,esi
0047CC5B|.BA 01000000 mov edx,0x1
0047CC60|.8B45 FC mov eax, ;注册名与字串“Fk2yB$P30jH”相连后的"abcdeFk2yB$P30jH"给EAX
0047CC63|.E8 247EF8FF call VideoCon.00404A8C
0047CC68|.8B45 F0 mov eax, ;取新字串前8位,(ASCII "abcdeFk2")
0047CC6B|.50 push eax
0047CC6C|.8D45 EC lea eax,
0047CC6F|.50 push eax
0047CC70|.8B45 FC mov eax,
0047CC73|.E8 BC7BF8FF call VideoCon.00404834
0047CC78|.8BC8 mov ecx,eax ;eax=00000010,新名长度
0047CC7A|.8D56 01 lea edx,dword ptr ds: ; 地址=00000009
0047CC7D|.8B45 FC mov eax,
0047CC80|.E8 077EF8FF call VideoCon.00404A8C ;取新字串剩下的字符,即第9位到最后一位:(ASCII "yB$P30jH")
0047CC85|.8B55 EC mov edx,
0047CC88|.8D45 FC lea eax,
0047CC8B|.59 pop ecx ;0012EBCC
0047CC8C|.E8 EF7BF8FF call VideoCon.00404880
0047CC91|.8D45 F8 lea eax,
0047CC94|.50 push eax
0047CC95|.B9 0A000000 mov ecx,0xA
0047CC9A|.BA 01000000 mov edx,0x1
0047CC9F|.8B45 FC mov eax, ; 后取字串+前取字串,组成新字串: (ASCII "yB$P30jHabcdeFk2")
0047CCA2|.E8 E57DF8FF call VideoCon.00404A8C
0047CCA7|.8D45 F4 lea eax,
0047CCAA|.50 push eax
0047CCAB|.8B45 FC mov eax,
0047CCAE|.E8 817BF8FF call VideoCon.00404834
0047CCB3|.8BC8 mov ecx,eax
0047CCB5|.BA 06000000 mov edx,0x6 ;edx=0x6
0047CCBA|.8B45 FC mov eax,
0047CCBD|.E8 CA7DF8FF call VideoCon.00404A8C ;取第6位到最后一位作为第二段字串, (ASCII "0jHabcdeFk2")
0047CCC2|.837D F4 00 cmp ,0x0
0047CCC6|.75 10 jnz short VideoCon.0047CCD8
0047CCC8|.8D45 F4 lea eax,
0047CCCB|.BA 78CD4700 mov edx,VideoCon.0047CD78 ;Fk2yB$P30jH
0047CCD0|.8B4D F8 mov ecx,
0047CCD3|.E8 A87BF8FF call VideoCon.00404880
0047CCD8|>53 push ebx
0047CCD9|.8B4D F4 mov ecx, ;第二段字串(第6到最后一位)给ECX,(ASCII "0jHabcdeFk2")
0047CCDC|.8B55 F8 mov edx, ;第一段字串(第1-10位)给EAX,(ASCII "yB$P30jHab")
0047CCDF|.8BC7 mov eax,edi
0047CCE1|.E8 1EF7FFFF call VideoCon.0047C404 ; //F7进入算法注册CALL
0047C404/$55 push ebp ; 来到这里
。。。。。。
0047C459|.BB 00010000 mov ebx,0x100 ;ebx=0x100,下面要用到
0047C45E|.8D45 F0 lea eax,
0047C461|.50 push eax
0047C462|.C745 E4 00010>mov ,0x100
0047C469|.C645 E8 00 mov byte ptr ss:,0x0
0047C46D|.8D55 E4 lea edx,
0047C470|.33C9 xor ecx,ecx ;ECX清零
0047C472|.B8 4CC54700 mov eax,VideoCon.0047C54C ;%1.2x
0047C477|.E8 40D5F8FF call VideoCon.004099BC
0047C47C|.8B45 FC mov eax,
0047C47F|.E8 B083F8FF call VideoCon.00404834
0047C484|.8BF8 mov edi,eax
0047C486|.85FF test edi,edi
0047C488|.7E 60 jle short VideoCon.0047C4EA
0047C48A|.C745 EC 01000>mov ,0x1
0047C491|>8B45 FC /mov eax, ;取第一段字串: "yB$P30jHab"
0047C494|.8B55 EC |mov edx, ;从第一位开始
0047C497|.0FB64410 FF |movzx eax,byte ptr ds: ; 依次取第一段字串各字符的ASC码
0047C49C|.03C3 |add eax,ebx ;eax=eax+ebx=字串ASC码+0x100
0047C49E|.B9 FF000000 |mov ecx,0xFF ; ecx=0xFF
0047C4A3|.99 |cdq ;将双字数据扩展为四字
0047C4A4|.F7F9 |idiv ecx ; EAX/ECX,商放EAX,余数入EDX
0047C4A6|.8BDA |mov ebx,edx ;余数edx给ebx
0047C4A8|.3B75 F4 |cmp esi,
0047C4AB|.7D 03 |jge short VideoCon.0047C4B0
0047C4AD|.46 |inc esi
0047C4AE|.EB 05 |jmp short VideoCon.0047C4B5
0047C4B0|>BE 01000000 |mov esi,0x1
0047C4B5|>8B45 F8 |mov eax, ;取第二段字串:"0jHabcdeFk2"
0047C4B8|.0FB64430 FF |movzx eax,byte ptr ds: ;依次取第二段字串各字符的ASC码,给EAX
0047C4BD|.33D8 |xor ebx,eax ;ebx=ebx(余数) xor eax,即余数与第二段字串ASC码进行异或
0047C4BF|.8D45 E0 |lea eax,
0047C4C2|.50 |push eax
0047C4C3|.895D E4 |mov ,ebx
0047C4C6|.C645 E8 00 |mov byte ptr ss:,0x0
0047C4CA|.8D55 E4 |lea edx,
0047C4CD|.33C9 |xor ecx,ecx
0047C4CF|.B8 4CC54700 |mov eax,VideoCon.0047C54C ;%1.2x
0047C4D4|.E8 E3D4F8FF |call VideoCon.004099BC
0047C4D9|.8B55 E0 |mov edx,
0047C4DC|.8D45 F0 |lea eax,
0047C4DF|.E8 5883F8FF |call VideoCon.0040483C
0047C4E4|.FF45 EC |inc
0047C4E7|.4F |dec edi
0047C4E8|.^ 75 A7 \jnz short VideoCon.0047C491 ;完了吗?没有取完继续
0047C4EA|>8B45 08 mov eax,
0047C4ED|.8B55 F0 mov edx, ;把所有异或结果连接,并在前面加上100
0047C4F0|.E8 DB80F8FF call VideoCon.004045D0
0047C4F5|.33C0 xor eax,eax
0047C4F7|.5A pop edx ;VideoCon.0047C527
0047C4F8|.59 pop ecx ;VideoCon.0047C527
0047C4F9|.59 pop ecx ;VideoCon.0047C527
0047C4FA|.64:8910 mov dword ptr fs:,edx
0047C4FD|.68 27C54700 push VideoCon.0047C527
0047C502|>8D45 E0 lea eax,
0047C505|.E8 7280F8FF call VideoCon.0040457C
0047C50A|.8D45 F0 lea eax,
0047C50D|.E8 6A80F8FF call VideoCon.0040457C
0047C512|.8D45 F8 lea eax,
0047C515|.BA 02000000 mov edx,0x2
0047C51A|.E8 8180F8FF call VideoCon.004045A0
0047C51F\.C3 retn
0047CCE6|.8D45 E8 lea eax,
0047CCE9|.50 push eax
0047CCEA|.8B03 mov eax,dword ptr ds: ;取最后运算结果,"1004AE643F24417E54BEA26"
0047CCEC|.B9 05000000 mov ecx,0x5 ;取5位
0047CCF1|.BA 01000000 mov edx,0x1 ;从第1位开始
0047CCF6|.E8 917DF8FF call VideoCon.00404A8C ;即取第1-5位, "1004A"
0047CCFB|.FF75 E8 push
0047CCFE|.68 8CCD4700 push VideoCon.0047CD8C ;用“-”连接
0047CD03|.8D45 E4 lea eax,
0047CD06|.50 push eax
0047CD07|.8B03 mov eax,dword ptr ds: ;取最后运算结果,"1004AE643F24417E54BEA26"
0047CD09|.B9 05000000 mov ecx,0x5 ;取5位
0047CD0E|.BA 06000000 mov edx,0x6 ;从第6位开始取
0047CD13|.E8 747DF8FF call VideoCon.00404A8C ; 即取第6-10位, "E643F"
0047CD18|.FF75 E4 push
0047CD1B|.68 8CCD4700 push VideoCon.0047CD8C ;用“-”连接
0047CD20|.8D45 E0 lea eax,
0047CD23|.50 push eax
0047CD24|.8B03 mov eax,dword ptr ds: ;取最后运算结果,"1004AE643F24417E54BEA26"
0047CD26|.B9 05000000 mov ecx,0x5 ;取5位
0047CD2B|.BA 0B000000 mov edx,0xB ;从第11位开始取
0047CD30|.E8 577DF8FF call VideoCon.00404A8C ;即取第11-15位,"24417"
0047CA74|.8B55 F4 mov edx, ; 三段结果用“-”相连:"1004A-E643F-24417"
0047CA77|.8B45 F8 mov eax, ; 假码给EAX
0047CA7A|.E8 35BDF8FF call VideoCon.004087B4 ;//寄存器出现真假码对比
0047CA7F|.85C0 test eax,eax
0047CA81|.75 41 jnz short VideoCon.0047CAC4 ; //跳向失败
【算法总结】:以注册名”abcde“为例:
**** Hidden Message *****
【体会】:一、本程序为明码比较,适合吾等新手练习。算法部分也比较清晰,没有过多的干扰代码。二、有一点疑惑:当注册名为单个的英文字母时,可以追出注册码,但竟然注册不成功!用内存注册机注册单个英文字母时,可以得出注册码,但同样也注册不成功!不知为何?新手求解。三、在做算法注册机时,当注册名中含中文时,陆陆续续搞了两个多星期也没能做出注册名中含中文的算法注册机,外行+新手,搞得头晕,差点想要放弃了。后来从一高手一句话中得到启示,终于搞出来了。一句话:逆向,贵在坚持!
四、附上一组注册码:
Reg Name:吾爱汇编论坛 ____By:pj2020
Registration Code:1002D-3456F-16082
五、新手作品,如有不足,欢迎指正!
附上:
原程序:
内存注册机:
算法注册机:
好好学习,天天向上 觉得好恐怖啊,能把算法给分析了。 谢谢分享啊 要支持的哦 过来学习学习,感谢楼主 谢谢楼主分享{:5_116:} {:5_116:}很好的教程,过来学习一下。 好高深,我现在看还为时过早,还去学习下基础吧 这才是大神 我服