超级Flv视频转换器算法分析带算号器
【文章标题】: 超级Flv视频转换器算法分析带算号器【作 者】: 冰河之刃
【邮 箱】: [email protected]
【主 页】: http://user.qzone.qq.com/290113866
【QQ 号】: 290113866
【软件名称】: 超级Flv视频转换器 1.30
【大 小】: 1.15M
【下载地址】: 自己搜索下载
【加壳方式】: 无壳
【保护方式】: 重启验证
【编写语言】: Borland Delphi 6.0 - 7.0
【工 具】: peid,od,双手和大脑
【操作平台】: Windows xp3
【软件介绍】: flv格式转换器,优酷土豆全是flv格式的视频,呵呵
【作者声明】: 相互交流,共同进步!
--------------------------------------------------------------------------------
【详细过程】
先介绍一下这个软件,功能上面挺全面的。
启动时会验证是否是注册用户,若不是则弹出注册窗体。
未注册时标题栏会显示未注册只能转换20%的视频。
点注册后,若注册码错误则弹出错误提示,若正确则提示信息已经记录下来了,重启后就可验证是否正确。
注册信息保存在注册表中:
-------------------------------------启动时候的流程----------------------------------------------------
004C0224 .8B00 MOV EAX,DWORD PTR DS: ;在启动时判断注册表中数据是否合法
004C0226 .E8 11CAFFFF CALL flv.004BCC3C ;关键call
004C022B .8B55 BC MOV EDX,DWORD PTR SS: ;在EDX中放入注册码
004C022E .8B45 FC MOV EAX,DWORD PTR SS:
004C0231 .8B80 00050000 MOV EAX,DWORD PTR DS: ;在EAX中放入假码
004C0237 .E8 FC44F4FF CALL flv.00404738 ;比较注册码是否为真,为假则跳向失败处
004C023C .75 0C JNZ SHORT flv.004C024A ;若跳转实现 则证明 注册码错误
004C023E .8B45 FC MOV EAX,DWORD PTR SS:
004C0241 .C680 F4040000>MOV BYTE PTR DS:,0
004C0248 .EB 31 JMP SHORT flv.004C027B ;此jmp可跳过错误提示
004C024A >8B45 FC MOV EAX,DWORD PTR SS:
004C024D .C680 F4040000>MOV BYTE PTR DS:,1
004C0254 .8D55 B8 LEA EDX,DWORD PTR SS:
004C0257 .A1 1C7E4C00 MOV EAX,DWORD PTR DS:
004C025C .E8 876EFAFF CALL flv.004670E8
004C0261 .8D45 B8 LEA EAX,DWORD PTR SS:
004C0264 .BA B4054C00 MOV EDX,flv.004C05B4 ;(试用版只能转换源文件20%的时间!)
004C0269 .E8 8643F4FF CALL flv.004045F4
004C026E .8B55 B8 MOV EDX,DWORD PTR SS:
004C0271 .A1 1C7E4C00 MOV EAX,DWORD PTR DS:
004C0276 .E8 9D6EFAFF CALL flv.00467118
004C027B >8B45 FC MOV EAX,DWORD PTR SS: ;上面的jmp跳向此处。。。
---------------------------------------------算法call--------------------------------------------------
004BCC3C/$55 PUSH EBP ;算法开始
004BCC3D|.8BEC MOV EBP,ESP
004BCC3F|.51 PUSH ECX
004BCC40|.B9 04000000 MOV ECX,4
004BCC45|>6A 00 /PUSH 0 ;依次获取用户名
004BCC47|.6A 00 |PUSH 0
004BCC49|.49 |DEC ECX
004BCC4A|.^ 75 F9 \JNZ SHORT flv.004BCC45
004BCC4C|.51 PUSH ECX
004BCC4D|.874D FC XCHG DWORD PTR SS:,ECX
004BCC50|.53 PUSH EBX
004BCC51|.56 PUSH ESI
004BCC52|.57 PUSH EDI
004BCC53|.8BF9 MOV EDI,ECX
004BCC55|.8955 FC MOV DWORD PTR SS:,EDX
004BCC58|.8B45 FC MOV EAX,DWORD PTR SS: ;把从EDX中得到的用户名装入eax
004BCC5B|.E8 7C7BF4FF CALL flv.004047DC
004BCC60|.33C0 XOR EAX,EAX ;清空EAX
004BCC62|.55 PUSH EBP
004BCC63|.68 FDCD4B00 PUSH flv.004BCDFD
004BCC68|.64:FF30 PUSH DWORD PTR FS:
004BCC6B|.64:8920 MOV DWORD PTR FS:,ESP
004BCC6E|.8BC7 MOV EAX,EDI
004BCC70|.E8 9B76F4FF CALL flv.00404310
004BCC75|.8B45 FC MOV EAX,DWORD PTR SS:
004BCC78|.E8 6F79F4FF CALL flv.004045EC
004BCC7D|.8BF0 MOV ESI,EAX
004BCC7F|.85F6 TEST ESI,ESI
004BCC81|.7E 26 JLE SHORT flv.004BCCA9
004BCC83|.BB 01000000 MOV EBX,1 ;将EBX中放入初始值1
004BCC88|>8D4D EC /LEA ECX,DWORD PTR SS:
004BCC8B|.8B45 FC |MOV EAX,DWORD PTR SS: ;得到用户名,放入EAX中
004BCC8E|.0FB64418 FF |MOVZX EAX,BYTE PTR DS: ;依次取用户名的每一位
004BCC93|.33D2 |XOR EDX,EDX ;清空EDX
004BCC95|.E8 4AC0F4FF |CALL flv.00408CE4 ;将取到 的字母转换为16进制
004BCC9A|.8B55 EC |MOV EDX,DWORD PTR SS: ;将转换后的数字放入EDX中
004BCC9D|.8D45 F8 |LEA EAX,DWORD PTR SS:
004BCCA0|.E8 4F79F4FF |CALL flv.004045F4 ;将转换为16进制后的数字累加起来
004BCCA5|.43 |INC EBX ;将EBX加一
004BCCA6|.4E |DEC ESI ;将ESI减一,注意寄存器中数据
004BCCA7|.^ 75 DF \JNZ SHORT flv.004BCC88
004BCCA9|>8B45 F8 MOV EAX,DWORD PTR SS: ;将转换为16进制后的数字装入EAX中
004BCCAC|.E8 3B79F4FF CALL flv.004045EC
004BCCB1|.8BF0 MOV ESI,EAX
004BCCB3|.85F6 TEST ESI,ESI
004BCCB5|.7E 2C JLE SHORT flv.004BCCE3
004BCCB7|.BB 01000000 MOV EBX,1 ;下面的循环主要是实现对上面数字串的逆序
004BCCBC|>8B45 F8 /MOV EAX,DWORD PTR SS: ;得到转换为16进制后的数字串
004BCCBF|.E8 2879F4FF |CALL flv.004045EC
004BCCC4|.2BC3 |SUB EAX,EBX ;EAX减去EBX
004BCCC6|.8B55 F8 |MOV EDX,DWORD PTR SS: ;将EDX中放入最后的数字
004BCCC9|.8A1402 |MOV DL,BYTE PTR DS:
004BCCCC|.8D45 E8 |LEA EAX,DWORD PTR SS:
004BCCCF|.E8 2478F4FF |CALL flv.004044F8 ;依次正向获取每一位数字
004BCCD4|.8B55 E8 |MOV EDX,DWORD PTR SS: ;在EDX中放入已经截掉对应位数的数字串
004BCCD7|.8D45 F4 |LEA EAX,DWORD PTR SS:
004BCCDA|.E8 1579F4FF |CALL flv.004045F4
004BCCDF|.43 |INC EBX ;计算位数呢,循环的条件
004BCCE0|.4E |DEC ESI
004BCCE1|.^ 75 D9 \JNZ SHORT flv.004BCCBC
004BCCE3|>8D45 F8 LEA EAX,DWORD PTR SS:
004BCCE6|.50 PUSH EAX
004BCCE7|.B9 04000000 MOV ECX,4 ;注意ECX和EDX中的数字。。。
004BCCEC|.BA 01000000 MOV EDX,1
004BCCF1|.8B45 F4 MOV EAX,DWORD PTR SS: ;在EAX中放入逆序后的数字串
004BCCF4|.E8 537BF4FF CALL flv.0040484C
004BCCF9|.8D45 F4 LEA EAX,DWORD PTR SS:
004BCCFC|.50 PUSH EAX
004BCCFD|.B9 04000000 MOV ECX,4 ;再次注意ECX和EDX中的数字。。。
004BCD02|.BA 05000000 MOV EDX,5
004BCD07|.8B45 F4 MOV EAX,DWORD PTR SS:
004BCD0A|.E8 3D7BF4FF CALL flv.0040484C ;此call截取前4位数字
004BCD0F|.8B45 F8 MOV EAX,DWORD PTR SS:
004BCD12|.E8 D578F4FF CALL flv.004045EC
004BCD17|.83F8 04 CMP EAX,4 ;比较EAX中数字是否大于等于4,若符合则跳
004BCD1A|.7D 2F JGE SHORT flv.004BCD4B
004BCD1C|.8B45 F8 MOV EAX,DWORD PTR SS:
004BCD1F|.E8 C878F4FF CALL flv.004045EC
004BCD24|.8BD8 MOV EBX,EAX
004BCD26|.83FB 03 CMP EBX,3
004BCD29|.7F 20 JG SHORT flv.004BCD4B
004BCD2B|>8D4D E4 /LEA ECX,DWORD PTR SS:
004BCD2E|.8BC3 |MOV EAX,EBX
004BCD30|.C1E0 02 |SHL EAX,2
004BCD33|.33D2 |XOR EDX,EDX
004BCD35|.E8 AABFF4FF |CALL flv.00408CE4
004BCD3A|.8B55 E4 |MOV EDX,DWORD PTR SS:
004BCD3D|.8D45 F8 |LEA EAX,DWORD PTR SS:
004BCD40|.E8 AF78F4FF |CALL flv.004045F4
004BCD45|.43 |INC EBX
004BCD46|.83FB 04 |CMP EBX,4
004BCD49|.^ 75 E0 \JNZ SHORT flv.004BCD2B
004BCD4B|>8B45 F4 MOV EAX,DWORD PTR SS: ;获取第5到第8位数字,也共4位
004BCD4E|.E8 9978F4FF CALL flv.004045EC
004BCD53|.83F8 04 CMP EAX,4
004BCD56|.7D 2F JGE SHORT flv.004BCD87
004BCD58|.8B45 F4 MOV EAX,DWORD PTR SS:
004BCD5B|.E8 8C78F4FF CALL flv.004045EC
004BCD60|.8BD8 MOV EBX,EAX
004BCD62|.83FB 03 CMP EBX,3
004BCD65|.7F 20 JG SHORT flv.004BCD87
004BCD67|>8D4D E0 /LEA ECX,DWORD PTR SS:
004BCD6A|.8BC3 |MOV EAX,EBX
004BCD6C|.C1E0 02 |SHL EAX,2
004BCD6F|.33D2 |XOR EDX,EDX
004BCD71|.E8 6EBFF4FF |CALL flv.00408CE4
004BCD76|.8B55 E0 |MOV EDX,DWORD PTR SS:
004BCD79|.8D45 F4 |LEA EAX,DWORD PTR SS:
004BCD7C|.E8 7378F4FF |CALL flv.004045F4
004BCD81|.43 |INC EBX
004BCD82|.83FB 04 |CMP EBX,4
004BCD85|.^ 75 E0 \JNZ SHORT flv.004BCD67
004BCD87|>8D45 F0 LEA EAX,DWORD PTR SS: ;下面一行获取一个固定值 flv67u986e
004BCD8A|.BA 14CE4B00 MOV EDX,flv.004BCE14 ;flv67u986e
004BCD8F|.E8 1476F4FF CALL flv.004043A8
004BCD94|.8D45 DC LEA EAX,DWORD PTR SS:
004BCD97|.50 PUSH EAX
004BCD98|.B9 04000000 MOV ECX,4 ;注意ECX和EDX中的数字。。。
004BCD9D|.BA 01000000 MOV EDX,1
004BCDA2|.8B45 F0 MOV EAX,DWORD PTR SS:
004BCDA5|.E8 A27AF4FF CALL flv.0040484C ;此CALL截取 flv67u986e 中的前4位数字
004BCDAA|.FF75 DC PUSH DWORD PTR SS:
004BCDAD|.68 28CE4B00 PUSH flv.004BCE28 ;-
004BCDB2|.FF75 F8 PUSH DWORD PTR SS: ;获得逆序后的第0到4位数字
004BCDB5|.8D45 D8 LEA EAX,DWORD PTR SS:
004BCDB8|.50 PUSH EAX
004BCDB9|.B9 05000000 MOV ECX,5 ;还是要注意ECX和EDX中的数字。。。
004BCDBE|.BA 05000000 MOV EDX,5
004BCDC3|.8B45 F0 MOV EAX,DWORD PTR SS:
004BCDC6|.E8 817AF4FF CALL flv.0040484C ;此CALL从 flv67u986e 中的第5位开始,截5位数字
004BCDCB|.FF75 D8 PUSH DWORD PTR SS: ;截完后也就是 7u986 了
004BCDCE|.68 28CE4B00 PUSH flv.004BCE28 ;-
004BCDD3|.FF75 F4 PUSH DWORD PTR SS: ;获取逆序后第4到第8之间的数字
004BCDD6|.8BC7 MOV EAX,EDI
004BCDD8|.BA 06000000 MOV EDX,6
004BCDDD|.E8 CA78F4FF CALL flv.004046AC
004BCDE2|.33C0 XOR EAX,EAX
004BCDE4|.5A POP EDX
004BCDE5|.59 POP ECX
004BCDE6|.59 POP ECX
004BCDE7|.64:8910 MOV DWORD PTR FS:,EDX
004BCDEA|.68 04CE4B00 PUSH flv.004BCE04
004BCDEF|>8D45 D8 LEA EAX,DWORD PTR SS:
004BCDF2|.BA 0A000000 MOV EDX,0A
004BCDF7|.E8 3875F4FF CALL flv.00404334 ;此call将前面计算出的连起来拼成注册码
004BCDFC\.C3 RETN
004BCDFD .^ E9 526EF4FF JMP flv.00403C54
004BCE02 .^ EB EB JMP SHORT flv.004BCDEF
004BCE04 .5F POP EDI
004BCE05 .5E POP ESI
004BCE06 .5B POP EBX
004BCE07 .8BE5 MOV ESP,EBP
004BCE09 .5D POP EBP
004BCE0A .C3 RETN ;要返回了,算法结束
----------------------------------------点注册按钮后的流程--------------------------------------------
004BD02A .55 PUSH EBP ;按注册按钮时程序的流程
004BD02B .68 69D14B00 PUSH flv.004BD169
004BD030 .64:FF30 PUSH DWORD PTR FS:
004BD033 .64:8920 MOV DWORD PTR FS:,ESP
004BD036 .8B45 FC MOV EAX,DWORD PTR SS:
004BD039 .E8 B2FEFFFF CALL flv.004BCEF0 ;点注册后会调用此call计算注册码
004BD03E .84C0 TEST AL,AL ;比较一下
004BD040 .0F84 DB000000 JE flv.004BD121 ;看是否是合法用户,不是则跳向失败处
004BD046 .33C0 XOR EAX,EAX
004BD048 .55 PUSH EBP ;上面若注册码正确就将注册信息保存在注册表中
004BD049 .68 05D14B00 PUSH flv.004BD105
004BD04E .64:FF30 PUSH DWORD PTR FS:
004BD051 .64:8920 MOV DWORD PTR FS:,ESP
004BD054 .B2 01 MOV DL,1
004BD056 .A1 E8B34300 MOV EAX,DWORD PTR DS:
004BD05B .E8 88E4F7FF CALL flv.0043B4E8
004BD060 .8BD8 MOV EBX,EAX
004BD062 .BA 02000080 MOV EDX,80000002
004BD067 .8BC3 MOV EAX,EBX
004BD069 .E8 1AE5F7FF CALL flv.0043B588
004BD06E .B1 01 MOV CL,1
004BD070 .BA 80D14B00 MOV EDX,flv.004BD180 ;Software\mp4soft\flvconverter
004BD075 .8BC3 MOV EAX,EBX
004BD077 .E8 70E5F7FF CALL flv.0043B5EC
004BD07C .8D55 F4 LEA EDX,DWORD PTR SS:
004BD07F .8B45 FC MOV EAX,DWORD PTR SS:
004BD082 .8B80 04030000 MOV EAX,DWORD PTR DS:
004BD088 .E8 5BA0FAFF CALL flv.004670E8
004BD08D .8B45 F4 MOV EAX,DWORD PTR SS:
004BD090 .8D55 F8 LEA EDX,DWORD PTR SS:
004BD093 .E8 D0B8F4FF CALL flv.00408968
004BD098 .8B4D F8 MOV ECX,DWORD PTR SS:
004BD09B .BA A8D14B00 MOV EDX,flv.004BD1A8 ;Name
004BD0A0 .8BC3 MOV EAX,EBX
004BD0A2 .E8 E1E6F7FF CALL flv.0043B788
004BD0A7 .8D55 EC LEA EDX,DWORD PTR SS:
004BD0AA .8B45 FC MOV EAX,DWORD PTR SS:
004BD0AD .8B80 08030000 MOV EAX,DWORD PTR DS:
004BD0B3 .E8 30A0FAFF CALL flv.004670E8
004BD0B8 .8B45 EC MOV EAX,DWORD PTR SS:
004BD0BB .8D55 F0 LEA EDX,DWORD PTR SS:
004BD0BE .E8 A5B8F4FF CALL flv.00408968
004BD0C3 .8B4D F0 MOV ECX,DWORD PTR SS:
004BD0C6 .BA B8D14B00 MOV EDX,flv.004BD1B8 ;Pass
004BD0CB .8BC3 MOV EAX,EBX
004BD0CD .E8 B6E6F7FF CALL flv.0043B788
004BD0D2 .8BC3 MOV EAX,EBX
004BD0D4 .E8 E763F4FF CALL flv.004034C0
004BD0D9 .6A 40 PUSH 40
004BD0DB .68 C0D14B00 PUSH flv.004BD1C0 ;软件注册
004BD0E0 .68 CCD14B00 PUSH flv.004BD1CC ;已保存了注册信息!下次启动本程序时将会对你的注册码进行验证,如注册码正确,本程序所有功能限制将被解除,您成为我们正式版本用户!
004BD0E5 .8B45 FC MOV EAX,DWORD PTR SS:
004BD0E8 .E8 E307FBFF CALL flv.0046D8D0
004BD0ED .50 PUSH EAX ; |hOwner
004BD0EE .E8 5DA1F4FF CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
004BD0F3 .8B45 FC MOV EAX,DWORD PTR SS:
004BD0F6 .E8 6D6DFCFF CALL flv.00483E68
004BD0FB .33C0 XOR EAX,EAX
004BD0FD .5A POP EDX
004BD0FE .59 POP ECX
004BD0FF .59 POP ECX
004BD100 .64:8910 MOV DWORD PTR FS:,EDX
004BD103 .EB 36 JMP SHORT flv.004BD13B
004BD105 .^ E9 9668F4FF JMP flv.004039A0
004BD10A .8B45 FC MOV EAX,DWORD PTR SS:
004BD10D .E8 566DFCFF CALL flv.00483E68
004BD112 .8B45 FC MOV EAX,DWORD PTR SS:
004BD115 .E8 12FDFFFF CALL flv.004BCE2C
004BD11A .E8 E96BF4FF CALL flv.00403D08
004BD11F .EB 1A JMP SHORT flv.004BD13B
004BD121 >6A 40 PUSH 40 ;下面就是注册失败的提示了
004BD123 .68 4CD24B00 PUSH flv.004BD24C ;Register
004BD128 .68 58D24B00 PUSH flv.004BD258 ;注册码错误,请重新输入用户名和注册码!
--------------------------------------------注册的算法步骤-------------------------------------------
1.将用户名转换为16进制的字符串。
2.将16进制的字符串再逆序一次,即原来是123的变成321了。
3.将固定字符串flv67u986e先截前4位即flv6,再从第5位截到第8位,又截了5位数字即7u986。
4.将逆序后的字符串截2次,第一次从第1到第4位,第二次从第5位到第8位。(注:从第5位是包括第5位在内的)
5.将上面的4部分连接并加上横杠连成注册码。
其中flv6为第一部分,逆序后的前4位为第二部分,7u986为第三部分(第二三部分之间不要横杠),第5到第8位的
就是第四部分了。
说明:
1.对固定字符串flv67u986e的处理纯属多此一举,只是在拢乱视线而已。
写算号器时就不必再按他的步骤截固定的字符串了。
真要照此程序那么做了,跟傻子有何区别。
编程是要会变通的,有一定技巧性。
2.用户名不支持中文名。。。中文名也能追出注册码,但有问题。可自己追一下。
-------------------------------------------C#算号器源码---------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace KeyGenMaker
{
public partial class Form1 : Form, System.IFormatProvider
{
public Form1()
{
InitializeComponent();
}
#region IFormatProvider 成员
public object GetFormat(Type formatType)
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
private void keymakeit_Click(object sender, EventArgs e)
{
try
{
string hexall = "";//声明一个全局变量存储转换为16进制后的字符串
string str = txt_string.Text.Trim();//从界面中获取用户名
for (int i = 0; i < str.Length; i++)//此for循环将用户名转换为16进制
{
char b = (char)str;
int t = (int)b;
hexall += Convert.ToString(t, 16).ToString();//将ascii码转换为16进制
}
int j = hexall.Length;//获取转换成16进制的字符串的长度
string hou = "";//声明一个变量
while (j > 0)//此while循环将上面的字符串逆序
{
hou += hexall.ToString();//累加逆序后的字符串
j--;
}
//重新声明一个变量接收逆序后的字符串,并将其转换为大写格式。自己在追码时想一下为什么?
string dao = hou.ToString().ToUpper();
string one = "flv6-";//注册码第一部分
string two = dao.Substring(0, 4);//截取前4位
string three = "7u986-";//注册码第三部分
string four = dao.Substring(4, 4);//从第5位开始截4位则截到第8位
txt_ok.Text = one + two + three + four;//将注册码的各部分串起来并赋值给界面中的注册码框
}
catch
{
MessageBox.Show("注意检查输入的格式,不支持中文用户名", "提示:");
}
}
private void about_Click(object sender, EventArgs e)
{
about a = new about();
a.Show();
}
}
}
----------------------------------------------就到这里吧----------------------------------------------
--------------------------------------------------------------------------------
【总结】
有些call不必跟进,F8过后注意看寄存器和堆栈就知道他的作用了。
在进行算法分析时,要有一定的预见性。有些循环也不必进。
可先用黑吧专用破解计算器计算一下用户名,看其ascii码和16进制格式的内容和你追的时候的某些数据是否相同。
相同的话,呵呵。。。速度会加快一些的哦。。。
--------------------------------------------------------------------------------
【版权声明】: 本文原创自冰河之刃, 转载请注明作者并保持文章的完整, 谢谢!
--------------------------------------------------- 这个软件的注册码很好找!但是他有暗撞!注册之后只是标题变了而已!
功能仍然有限制的 阁下的算号器在那???
我不是白购买了么!!! 你用vs2005自己把这份源码编译一下就OK了。。。
页:
[1]