iOrgSoft Video Converter 6.0.0 KeyGen
【文章标题】: iOrgSoft Video Converter 6.0.0 KeyGen【软件名称】: iOrgSoft Video Converter
【下载地址】: 自己搜索下载
【操作平台】: XP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一 .Net 主程序
1,.NET Reflector 打开主程序, 搜下注册提示提示字符,定位到代码在 VideoConVerterApp.Regist.Register_Btn_Click(Object, EventArgs) : Void
private void Register_Btn_Click(object sender, EventArgs e)
{
string messageBody = string.Empty;
if (string.IsNullOrEmpty(this.txtLicensedMail.Text))
{
messageBody = "Enter your License Email.";
}
else if (string.IsNullOrEmpty(this.txtRegistrationCode.Text))
{
messageBody = "Enter your License Code.";
}
else
{
RegistInfo.Regist(this.txtLicensedMail.Text.Trim(), this.txtRegistrationCode.Text.Trim());// 看来关键是这行
if (SysSetInfo.SysUserSetInfo.IsRegist == 0)
{
messageBody = "Register successfully.";
base.DialogResult = DialogResult.OK;
}
else
{
messageBody = "Register failure.";
}
}
ShowMessage.MsgBox.Show("Information", messageBody, ShowMessage.PicType.error, MessageBoxButtons.OK, false);
}
2,打开 RegistInfo.Regist(this.txtLicensedMail.Text.Trim(), this.txtRegistrationCode.Text.Trim()) 看看
public static void Regist(string regionName, string regionCode)
{
try
{
byte[] buffer = MD5.Create().ComputeHash(Encoding.Default.GetBytes(regionCode)); // 对输入的假注册码 MD5 ,也就是 MD5(1234567890)= e807f1fcf82d132f9bb018ca6738a19f
regionCode = "";
for (int i = 0; i < buffer.Length; i++) // md5结果转字串
{
regionCode = regionCode + string.Format("{0:x2}", buffer);
}
CheckRegister(regionName, regionCode); // 看函数名是校验函数,继续进,regionCode = MD5(1234567890)=e807f1fcf82d132f9bb018ca6738a19f
}
catch (Exception exception)
{
MessageBox.Show(exception.Message);
}
if (SysSetInfo.SysUserSetInfo.IsRegist == 0) // 保存注册信息到注册表
{
RegistryKeys keys = new RegistryKeys("CURRENT_USER");
keys.CreateRegKey(ReleaseInfo.KeyPath);
keys.SetRegVal(ReleaseInfo.KeyPath, ReleaseInfo.KeyName_Regname, regionName);
keys.SetRegVal(ReleaseInfo.KeyPath, ReleaseInfo.KeyName_License, regionCode);
}
}
3,打开 CheckRegister(regionName, regionCode);
public static void CheckRegister(string regionName = null, string regionCode = null)
{
RegistryKeys keys = new RegistryKeys("CURRENT_USER");
string def = string.Empty;
string str2 = string.Empty;
if ((regionName == null) && (regionCode == null)) // regionName,regionCode 为空则去注册表取
{
regionName = keys.GetRegVal(ReleaseInfo.KeyPath, ReleaseInfo.KeyName_Regname, def);
regionCode = keys.GetRegVal(ReleaseInfo.KeyPath, ReleaseInfo.KeyName_License, str2);
}
ProjectInfoStruct.RegistrationInfo registrationInfo = new ProjectInfoStruct.RegistrationInfo { //下面函数checkRegCode的参数
companyName = ReleaseInfo.DOrEmiSofT,
productName = ReleaseInfo.wEbCAmFORwiN,
userName = regionName, // email
md5LicenseCode = regionCode // 假码MD5=(1234567890)=e807f1fcf82d132f9bb018ca6738a19f
};
switch (ProjectInfoStruct.checkRegCode(ref registrationInfo)) // checkRegCode ,校验函数
{
case 0x2745:
SysSetInfo.SysUserSetInfo.IsRegist = -1;
return;
case 0:
SysSetInfo.SysUserSetInfo.IsRegist = 0;
return;
}
SysSetInfo.SysUserSetInfo.IsRegist = 1;
}
4,打开 ProjectInfoStruct.checkRegCode(ref registrationInfo))
// 以为到校验代码了,结果进了,reglib.dll ,看来还要跟checkRegCode
public static extern int checkRegCode(ref RegistrationInfo registrationInfo);
二,reglib.dll 部分
1,用PE工具打开reglib.dll 去看下它的导出函数,就2个函数,关心的是 checkRegCode ,RVA 是 000011C0 ,加上载入DLL基址,checkRegCode 函数地址了,这里基址是10000000,所以checkRegCode地址是 100011C0
2,运行程序,OD附加进去,ctrl+g 100011C0 ,下好断点,去程序注册框输入email abcde@crack.com ,假码 1234567890,点注册,我们来到 checkRegCode 100011C0 ,它的参数是 registrationInfo
看下堆栈情况
0012E9C8 00A9A994返回到 00A9A994
0012E9CC 00187D60 // 这个地址指向 registrationInfo,数据窗口跟随下
0012E9D0 0012EB14
0012E9D4 FFFFFFFF
0012E9D8 00000010
00187D60具体情况
00187D60002352D8ASCII "abcde@crack.com" // email
00187D6403932690ASCII "01210111010901010114010501200110012101070123011601040120"
00187D6800000000
00187D6C00235300ASCII "008700900092"
00187D7003933000ASCII "e807f1fcf82d132f9bb018ca6738a19f" //假码 MD5
00187D7400187D58
3,checkRegCode 主函数
100011C0 >55 push ebp ; checkRegCode
100011C1 8BEC mov ebp, esp
100011C3 81EC 48010000 sub esp, 148
100011C9 A1 20100110 mov eax, dword ptr
100011CE 33C5 xor eax, ebp
100011D0 8945 FC mov dword ptr , eax
100011D3 56 push esi
100011D4 8B75 08 mov esi, dword ptr
100011D7 E8 E4030000 call 100015C0 ; 里面有对水印 watermark.png MD5文件校验
100011DC 3D 45270000 cmp eax, 2745
100011E1 75 11 jnz short 100011F4 ; NOP掉是爆破,但算法部分在下面
100011E3 5E pop esi
100011E4 8B4D FC mov ecx, dword ptr
100011E7 33CD xor ecx, ebp
100011E9 E8 F0150000 call 100027DE
100011EE 8BE5 mov esp, ebp
100011F0 5D pop ebp
100011F1 C2 0400 retn 4
100011F4 57 push edi ; 算法开始
100011F5 8B3E mov edi, dword ptr ; 取 abcde@crack.com 算长度
100011F7 85FF test edi, edi
100011F9 0F84 F7000000 je 100012F6
100011FF 8BC7 mov eax, edi
10001201 8D50 01 lea edx, dword ptr
10001204 8A08 mov cl, byte ptr
10001206 40 inc eax
10001207 84C9 test cl, cl
10001209^ 75 F9 jnz short 10001204
1000120B 2BC2 sub eax, edx ; email 长度
1000120D 0F84 E3000000 je 100012F6
10001213 8B46 10 mov eax, dword ptr ; 取假码MD5e807f1fcf82d132f9bb018ca6738a19f 算长度
10001216 85C0 test eax, eax
10001218 0F84 C1000000 je 100012DF
1000121E 8D50 01 lea edx, dword ptr
10001221 8A08 mov cl, byte ptr
10001223 40 inc eax
10001224 84C9 test cl, cl
10001226^ 75 F9 jnz short 10001221
10001228 2BC2 sub eax, edx ; 假码 md5 长度
1000122A 0F84 AF000000 je 100012DF
10001230 6A 40 push 40
10001232 57 push edi ; emailabcde@crack.com
10001233 E8 18180000 call 10002A50
10001238 83C4 08 add esp, 8
1000123B 85C0 test eax, eax
1000123D 75 17 jnz short 10001256
1000123F 5F pop edi
10001240 B8 13270000 mov eax, 2713
10001245 5E pop esi
10001246 8B4D FC mov ecx, dword ptr
10001249 33CD xor ecx, ebp
1000124B E8 8E150000 call 100027DE
10001250 8BE5 mov esp, ebp
10001252 5D pop ebp
10001253 C2 0400 retn 4
10001256 8D4D BC lea ecx, dword ptr
10001259 8BFE mov edi, esi ; edi = 00187d60 ,指向前面提到的 registrationInfo
1000125B E8 60FEFFFF call 100010C0 ; 算法关键 !!!!!!!!!!!!!!!!!!!
10001260 8D45 BC lea eax, dword ptr ; 真码 658c2b-900b55-3bd75a
10001263 8D50 01 lea edx, dword ptr
10001266 8A08 mov cl, byte ptr
10001268 40 inc eax
10001269 84C9 test cl, cl
1000126B^ 75 F9 jnz short 10001266
1000126D 2BC2 sub eax, edx ; 真码长度
1000126F 50 push eax
10001270 8DBD BCFEFFFF lea edi, dword ptr
10001276 8D4D BC lea ecx, dword ptr
10001279 E8 A2100000 call <md5> ; 658c2b-900b55-3bd75a 进行 MD5
1000127E 8B46 10 mov eax, dword ptr ; 假码 MD5e807f1fcf82d132f9bb018ca6738a19f
10001281 83C4 04 add esp, 4
10001284 8BCF mov ecx, edi ; 真码 MD57479b133ec22f647d56bcc86d4e0b193
10001286 8A10 mov dl, byte ptr
10001288 3A11 cmp dl, byte ptr ; 比较
1000128A 75 33 jnz short 100012BF
1000128C 84D2 test dl, dl
1000128E 74 12 je short 100012A2
10001290 8A50 01 mov dl, byte ptr
10001293 3A51 01 cmp dl, byte ptr ; 比较
10001296 75 27 jnz short 100012BF
10001298 83C0 02 add eax, 2
1000129B 83C1 02 add ecx, 2
1000129E 84D2 test dl, dl
100012A0^ 75 E4 jnz short 10001286 ; 这个循环是注册码 MD5 进行比较,相同就成功
100012A2 33C0 xor eax, eax
100012A4 F7D8 neg eax
100012A6 1BC0 sbb eax, eax
100012A8 5F pop edi
100012A9 25 13270000 and eax, 2713
100012AE 5E pop esi
100012AF 8B4D FC mov ecx, dword ptr
100012B2 33CD xor ecx, ebp
100012B4 E8 25150000 call 100027DE
100012B9 8BE5 mov esp, ebp
100012BB 5D pop ebp
100012BC C2 0400 retn 4
4,现在知道了校验部分是对MD5(假码) MD5(真码) 是否相同,相同就注册成功,所以去关键算法call 100010C0 去看看真码怎么来的
省略部分代码
1000118B 8D95 FCFCFFFF lea edx, dword ptr ; 字符串 "videoconverter"
10001191 52 push edx
10001192 8D8D FCFDFFFF lea ecx, dword ptr ; 字符串 "TTS"
10001198 8D95 FCFEFFFF lea edx, dword ptr ; 字符串 "abcde@crack.com"
1000119E E8 3D060000 call 100017E0 ; 关键是这个,还得继续进!!!!!!!!!!!!!!!!!!!!!
5,call 100010C0,有些其他字符串,不参与算法,不细看了 , 进 call 100017E0 看看
省略部分代码
10001827 8BC3 mov eax, ebx ; abcde@crack.com
10001829 83C4 18 add esp, 18
1000182C 8D78 01 lea edi, dword ptr
1000182F 90 nop
10001830 8A08 mov cl, byte ptr
10001832 40 inc eax
10001833 84C9 test cl, cl
10001835^ 75 F9 jnz short 10001830
10001837 2BC7 sub eax, edi ; abcde@crack.com 长度
10001839 8BF8 mov edi, eax
1000183B 33C0 xor eax, eax
1000183D 85FF test edi, edi
1000183F 7E 0D jle short 1000184E
10001841 8AC8 mov cl, al ; al = i,i 是 abcde@crack.com 字符序号
10001843 80E1 1F and cl, 1F ; i&0x1f
10001846 000C03 add byte ptr , cl ; email+=cl
10001849 40 inc eax
1000184A 3BC7 cmp eax, edi
1000184C^ 7C F3 jl short 10001841 ; 这个循环相当于 email+=i&0x1F,"abcde@crack.com" ---> acegiEiyilu9o|{
1000184E 8B4C24 0C mov ecx, dword ptr ; videoconverter
10001852 8BC1 mov eax, ecx
10001854 8D78 01 lea edi, dword ptr
10001857 8A10 mov dl, byte ptr
10001859 40 inc eax
1000185A 84D2 test dl, dl
1000185C^ 75 F9 jnz short 10001857
1000185E 2BC7 sub eax, edi ; videoconverter 长度
10001860 8BF8 mov edi, eax
10001862 33C0 xor eax, eax
10001864 85FF test edi, edi
10001866 7E 0D jle short 10001875
10001868 8AD0 mov dl, al
1000186A 80E2 1F and dl, 1F
1000186D 281401 sub byte ptr , dl
10001870 40 inc eax
10001871 3BC7 cmp eax, edi
10001873^ 7C F3 jl short 10001868 ; 同email一样, videoconverter --->vhbbk^ign\hiYe
10001875 8B4424 08 mov eax, dword ptr ; TTS
10001879 8D50 01 lea edx, dword ptr
1000187C 8D6424 00 lea esp, dword ptr
10001880 8A08 mov cl, byte ptr
10001882 40 inc eax
10001883 84C9 test cl, cl
10001885^ 75 F9 jnz short 10001880
10001887 8B4C24 08 mov ecx, dword ptr
1000188B 2BC2 sub eax, edx ; TTS 长度
1000188D 50 push eax
1000188E 8D7C24 14 lea edi, dword ptr
10001892 E8 890A0000 call <md5> ; md5("TTS")= 4616606d5a8590d8c1d305d50dce2f73
10001897 8B7C24 0C mov edi, dword ptr ; edi=0012D938, ="4616606d5a8590d8c1d305d50dce2f73"
1000189B 68 00010000 push 100
100018A0 6A 00 push 0
100018A2 57 push edi
100018A3 E8 98200000 call 10003940 ; 内存置零
100018A8 68 00010000 push 100
100018AD 8D4424 24 lea eax, dword ptr
100018B1 50 push eax
100018B2 57 push edi
100018B3 E8 68100000 call 10002920 ; stringcopy
100018B8 8BC3 mov eax, ebx ; acegiEiyilu9o|{
100018BA 83C4 1C add esp, 1C
100018BD 8D48 01 lea ecx, dword ptr
100018C0 8A10 mov dl, byte ptr
100018C2 40 inc eax
100018C3 84D2 test dl, dl
100018C5^ 75 F9 jnz short 100018C0
100018C7 2BC1 sub eax, ecx ; acegiEiyilu9o|{ 长度
100018C9 50 push eax
100018CA 8D8C24 14040000 lea ecx, dword ptr
100018D1 53 push ebx ; acegiEiyilu9o|{
100018D2 51 push ecx
100018D3 E8 A8110000 call 10002A80 ; 字串合并 = "acegiEiyilu9o|{"
100018D8 8B5424 18 mov edx, dword ptr ; vhbbk^ign\hiYe
100018DC 8BC2 mov eax, edx
100018DE 83C4 0C add esp, 0C
100018E1 8D58 01 lea ebx, dword ptr
100018E4 8A08 mov cl, byte ptr
100018E6 40 inc eax
100018E7 84C9 test cl, cl
100018E9^ 75 F9 jnz short 100018E4
100018EB 2BC3 sub eax, ebx ; vhbbk^ign\hiYe长度
100018ED 50 push eax
100018EE 52 push edx ; vhbbk^ign\hiYe
100018EF 8D9424 18040000 lea edx, dword ptr
100018F6 52 push edx ; acegiEiyilu9o|{
100018F7 E8 84110000 call 10002A80 ; ="acegiEiyilu9o|{vhbbk^ign\hiYe"
100018FC 8BC7 mov eax, edi ; 4616606d5a8590d8c1d305d50dce2f73
100018FE 83C4 0C add esp, 0C
10001901 8D50 01 lea edx, dword ptr
10001904 8A08 mov cl, byte ptr
10001906 40 inc eax
10001907 84C9 test cl, cl
10001909^ 75 F9 jnz short 10001904
1000190B 2BC2 sub eax, edx ; 长度
1000190D 50 push eax
1000190E 8D8424 14040000 lea eax, dword ptr
10001915 57 push edi
10001916 50 push eax
10001917 E8 64110000 call 10002A80 ; ="acegiEiyilu9o|{vhbbk^ign\hiYe4616606d5a8590d8c1d305d50dce2f73"
1000191C 8D8424 1C040000 lea eax, dword ptr
10001923 83C4 0C add esp, 0C
10001926 8D50 01 lea edx, dword ptr
10001929 8DA424 00000000 lea esp, dword ptr
10001930 8A08 mov cl, byte ptr
10001932 40 inc eax
10001933 84C9 test cl, cl
10001935^ 75 F9 jnz short 10001930
10001937 2BC2 sub eax, edx ; 长度
10001939 50 push eax
1000193A 8D7C24 14 lea edi, dword ptr
1000193E 8D8C24 14040000 lea ecx, dword ptr ; ="acegiEiyilu9o|{vhbbk^ign\hiYe4616606d5a8590d8c1d305d50dce2f73"
10001945 E8 D6090000 call <md5> ; MD5结果 =="69508ec02fbc5b3bd75ae96541f37c85"
1000194A 0FB64C24 14 movzx ecx, byte ptr ; 第0位 MD5中的位置
1000194F 0FB65424 16 movzx edx, byte ptr ; 第2位
10001954 0FB64424 18 movzx eax, byte ptr ; 第4位
10001959 880E mov byte ptr , cl ; 0=0 前面为注册码位置,后面为MD5中位置
1000195B 0FB64C24 1A movzx ecx, byte ptr ; 第6位
10001960 8856 01 mov byte ptr , dl ; 1=2
10001963 0FB65424 1C movzx edx, byte ptr ; 第8位
10001968 8846 02 mov byte ptr , al ; 2=4
1000196B 0FB64424 1E movzx eax, byte ptr ; 第10位
10001970 884E 03 mov byte ptr , cl ; 3=6
10001973 0FB64C24 15 movzx ecx, byte ptr ; 第1位
10001978 8856 04 mov byte ptr , dl ; 4=8
1000197B 8846 05 mov byte ptr , al ; 5=10
1000197E 0FB64424 17 movzx eax, byte ptr ; 第3位
10001983 B2 2D mov dl, 2D
10001985 8856 06 mov byte ptr , dl ; 6="-"
10001988 884E 07 mov byte ptr , cl ; 7=1
1000198B 0FB64C24 1B movzx ecx, byte ptr ; 第7位
10001990 8846 08 mov byte ptr , al ; 8=3
10001993 8A4424 23 mov al, byte ptr ; 第15位
10001997 884E 09 mov byte ptr , cl ; 9=7
1000199A 8A4C24 33 mov cl, byte ptr ; 第31位
1000199E 8846 0A mov byte ptr , al ; 10=15
100019A1 884E 0B mov byte ptr , cl ; 11=31
100019A4 884E 0C mov byte ptr , cl ; 12=31
100019A7 0FB64C24 25 movzx ecx, byte ptr ; 第17位
100019AC 8856 0D mov byte ptr , dl ; 13="-"
100019AF 0FB65424 22 movzx edx, byte ptr ; 第14位
100019B4 8846 0F mov byte ptr , al ; 15=15
100019B7 0FB64424 24 movzx eax, byte ptr ; 第16位
100019BC 83C4 04 add esp, 4 ; esp+4 了
100019BF 8846 10 mov byte ptr , al ; 16=16
100019C2 0FB64424 23 movzx eax, byte ptr ; 第19位
100019C7 8856 0E mov byte ptr , dl ; 14=14
100019CA 0FB65424 22 movzx edx, byte ptr ; 第18位
100019CF 884E 11 mov byte ptr , cl ; 17=17
100019D2 8B8C24 14080000 mov ecx, dword ptr
100019D9 5F pop edi
100019DA 5B pop ebx
100019DB 8846 13 mov byte ptr , al ; 19=19
100019DE 33CC xor ecx, esp
100019E0 8856 12 mov byte ptr , dl ; 18=18
100019E3 33C0 xor eax, eax ; = 658c2b-900b55-3bd75a生成注册码
100019E5 E8 F40D0000 call 100027DE
100019EA 8BE5 mov esp, ebp
100019EC 5D pop ebp
100019ED C3 retn
三,总结
1,.Net 主程序部分,把 em="abcde@crack.com"假码 sn="1234567890" 的 MD5,snmd5 = md5(sn) 等信息,调用 reglib.dll.checkRegCode进行验证
2,em="abcde@crack.com"---> cem="acegiEiyilu9o|{",方式为 em+=em+i&0x1f
3,"videoconverter" ---> "vhbbk^ign\hiYe" ,方式同上
4,md5("TTS")="4616606d5a8590d8c1d305d50dce2f73"
5,scat= "acegiEiyilu9o|{" + "vhbbk^ign\hiYe" + "4616606d5a8590d8c1d305d50dce2f73"
6,scatmd5=MD5(scat)="69508ec02fbc5b3bd75ae96541f37c85"
7,从scatmd5 生成 key
8,md5(key) snmd5 是否相同,相同就成功,因为是md5,所以可以直接看作 sn key是否相同
9,注册信息保存在注册表内,HKEY_CURRENT_USER\Software\iOrgSoft\Video Converter\reg
四,注册机,固定字符串部分直接用结果了,python 代码
import hashlib
videoconverter="vhbbk^ign\hiYe"
TTSmd5="4616606d5a8590d8c1d305d50dce2f73"
cemail=""
sn=""
email=raw_input("your email : ")
for i in range(0,len(email)):
temp=ord(email)+(i&31)
cemail+=chr(temp)
md5=hashlib.md5()
md5.update(cemail)
md5.update(videoconverter)
md5.update(TTSmd5)
rmd5=md5.hexdigest()
sn+=rmd5
sn+="-"
sn+=rmd5
sn+=rmd5
sn+=rmd5
sn+=rmd5
sn+=rmd5
sn+=rmd5
sn+="-"
sn+=rmd5
print "your sn : %s"%sn
几组注册码
your email : abcde@crack.com
your sn : 658c2b-900b55-3bd75a
your email : abcde@126.com
your sn : a1753b-fb9a22-7ae2e9
your email : keygen@iOrgSoft.com
your sn : 06a22c-4b9faa-4f244d
--------------------------------------------------------------------------------
【经验总结】
玩KeyGen的人少了,遇到枚软柿子,脑子抽了,写这玩意,over~
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢! Fabiana 发表于 2015-9-16 17:34
烦,再也不写了
我给你编辑了一下,使用了代码框功能,看起来舒服多了,帖子过程完整,有分析有总结有算法注册机编写,给予精华鼓励,期待以后更多的分享交流。 Hmily 发表于 2015-9-15 11:34
代码地方可以试试代码框,会好看很多,原来是写在word里的?原版可以发上来我给你编辑下试试。
iOrgSoft Video Converter KeyGen.txt
Server (IO) Error
传不上 这个字体看得太别扭了 好难受 看不下去了 看完楼主的帖子我得了脊椎病!lz就不能好好写个帖子? liwenwu1058 发表于 2015-9-14 20:15
看完楼主的帖子我得了脊椎病!lz就不能好好写个帖子?
刷新下,我这正了 http://www.52pojie.cn/thread-412492-1-1.html
好乱啊,看不清!!
不错的分析。。。。 Fabiana 发表于 2015-9-14 20:21
刷新下,我这正了
代码地方可以试试代码框,会好看很多,原来是写在word里的?原版可以发上来我给你编辑下试试。 Fabiana 发表于 2015-9-15 17:33
iOrgSoft Video Converter KeyGen.txt
Server (IO) Error
直接写在txt里的啊?你压缩一下上传试试?你用的是代{过}{滤}理吗? Hmily 发表于 2015-9-15 18:39
直接写在txt里的啊?你压缩一下上传试试?你用的是代{过}{滤}理吗?
烦,再也不写了