Virtual Serial Port Driver 最新版本V10_0_992的IL代码分析
本帖最后由 yujunqiang 于 2022-5-29 17:40 编辑运行环境:WIN10、WIN11
涉及工具:dnSpy
教程类型:逆向限制,算法分析等
是否讲解思路和原理:是
以下为图文内容:
Virtual Serial Port Driver 最新版本V10_0_992原版官方下载地址:
https://cdn.electronic.us/products/vspd/windows/download/vspd.exe
但美国或许禁止了中国IP下载,上面地址可能无法下载。
百度云下载:
链接:https://pan.baidu.com/s/1ZQW10aqsfd0LN-htArDTOA
提取码:yujq
安装后PJ运行界面:
主程序 vspdpro.exe 的PJ:
Virtual Serial Port Driver V10版本从10.0.844开始到现在的10.0.992,主程序 vspdpro.exe 都采用 MS Visual C# / Basic.NET 代码编译,且没有混淆代码,容易逆向。
以前发过这个程序的PJ过程,今天再详解:
1、安装后,使用 dnSpy 打开 主程序 vspdpro.exe
2、PJ主程序
dnSpy打开程序后,可以选择C#、VB、IL代码形式查看源代码
在 vspd.Control 下有 IsDemoKey、IsProKey
A、进入 vspd.Control.IsDemo
public bool IsDemo
{
get
{
return this.<IsDemo>k__BackingField; //注释:此处鼠标右键选择编辑IL指令,即改为return false,返回否,不是演示版。
}
private set
{
if (this.<IsDemo>k__BackingField == value)
{
return;
}
this.<IsDemo>k__BackingField = value;
this.OnPropertyChanged("IsDemo");
}
}
IsDemo.get 删除多余的IL指令,只留如下:
0 0000 ldc.i4.0 //注解:值0
1 0001 ret //返回,上面值0,即 false
B、进入 vspd.Control.IsPro
public bool IsPro
{
get
{
return this.<IsPro>k__BackingField; //注释:此处鼠标右键选择编辑IL指令,即改为return true,返回是,是专业版。
}
private set
{
if (this.<IsPro>k__BackingField == value)
{
return;
}
this.<IsPro>k__BackingField = value;
this.OnPropertyChanged("IsPro");
}
}
IsPro.get 删除多余的IL指令,只留如下:
0 0000 ldc.i4.1 //注解:值1
1 0001 ret //返回,上面值1,即 true
C、点击 vspd.vm.Activator ,下有DaysLimit、IsExpired、IsGoodToWork、IsDemoKey、IsProKey,修改方法同上。
修改 IsExpired 返回 false (未过期),IsGoodToWork 返回 true(工作OK),IsDemoKey 返回 false(非演示),IsProKey 返回 true(是专业版)
public override bool IsDemoKey
{
get
{
if (!this.license.demo)
{
int? days = this.license.days;
int num = 0;
return days.GetValueOrDefault() > num & days != null;
}
return true; //注解:将上面if语句删除,将此改为 false ,即 get { return false; } ,IsDemoKey直接返回 false (不是演示版)。
}
}
在get语句内,鼠标右键选择编辑IL指令,删除多余的指令,修改为如下:
0 0000 ldc.i4.0 //注解:值0
1 0001 ret //返回,上面值0,即 false
// vspd.vm.Activator
public override long DaysLimit
{
get
{
return (long)this.license.days.GetValueOrDefault();
}
}
返回可以修改为3650,过期天数为十年:
public override long DaysLimit
{
get
{
return 3650L;
}
}
鼠标右键选择编辑IL指令,删除多余的指令,修改为如下:
0 0000 ldc.i4 3650 //注解:值3650 (十六进制 0xE42)
1 0001 ret //返回,上面值3650,即3650天,十年
D、//// vspd.Utils.LicenseUpdater
public void UpdateLicense()
{
string text;
uint num;
for (;;)
{
text = this.Activator.LicenseStatus;
if (this.Activator.IsDemoKey && this.Activator.IsExpired && text != "+STARTING")
{
text = "DEMO_IS_OVER";
}
num = <PrivateImplementationDetails>.ComputeStringHash(text);
if (num <= 890022063U)
{
if (num > 516577132U)
{
goto IL_6B;
}
if (num == 215374295U)
{
goto IL_DB;
}
if (num != 516577132U)
{
break;
}
if (!(text == "+BADTIME"))
{
break;
}
if (!new AlertWindow
{
FirstLine = Resources.IDSA_badlocaltime,
SecondLine = Resources.IDSA_setdatetime,
OkButtonText = Resources.IDSA_btn_tryagain
}.Run(this.parentWindow))
{
return;
}
this.Activator.ActivateOnline("reactivate");
}
else if (num <= 2646111894U)
{
if (num == 1181904525U)
{
goto IL_12F;
}
if (num != 2646111894U)
{
break;
}
if (!(text == "+BACKWARDTIME"))
{
break;
}
if (!new AlertWindow
{
FirstLine = Resources.IDSA_time_backward,
SecondLine = Resources.IDSA_trial_blocked,
OkButtonText = Resources.IDSA_btn_activate,
CancelButtonText = Resources.IDSA_btn_ordernow
}.Run(this.parentWindow))
{
goto IL_20E;
}
this.Activator.ActivateOnline("demo");
}
else if (num != 3427124686U)
{
if (num == 3457219322U)
{
goto IL_F0;
}
if (num != 3914721229U)
{
break;
}
if (!(text == "+WRONG_HID"))
{
break;
}
if (!new AlertWindow
{
Title = Resources.IDSA_title_reactivation_required,
FirstLine = Resources.IDSA_wrong_hid,
SecondLine = Resources.IDSA_failed_reactivate,
OkButtonText = Resources.IDSA_btn_tryagain,
CancelButtonText = Resources.IDSA_btn_upd_info
}.Run(this.parentWindow))
{
goto IL_372;
}
this.Activator.ActivateOnline("reactivate");
}
else
{
if (!(text == "+STARTING"))
{
break;
}
Thread.Sleep(500);
this.Activator.UpdateStatus();
}
}
goto IL_393;
IL_6B:
if (num != 609027880U)
{
if (num == 890022063U)
{
if (text == "0")
{
goto IL_183;
}
}
}
else if (text == "NO_AVAILABLE_ACTIVATIONS")
{
if (new AlertWindow
{
Title = Resources.IDSA_title_cant_reactivate_anymore,
FirstLine = Resources.IDSA_max_hids,
SecondLine = Resources.IDSA_msg_maxhids_update.Replace("{update_info_button}", Resources.IDSA_btn_upd_info),
OkButtonText = Resources.IDSA_btn_activate,
CancelButtonText = Resources.IDSA_btn_upd_info
}.Run(this.parentWindow))
{
this.<UpdateLicense>g__ShowRegisterWindow|5_1();
return;
}
this.OpenChangeHidUrl();
return;
}
goto IL_393;
IL_DB:
if (!(text == "ALREADY_ACTIVATED"))//已激活
{
goto IL_393;
}
goto IL_183;
IL_F0:
if (text == "DEMO_IS_OVER")
{
this.<UpdateLicense>g__ShowWizard|5_0(new WizardModel.Expired());
return;
}
goto IL_393;
IL_12F:
if (text == "KEY_BANNED")
{
if (new AlertWindow
{
FirstLine = Resources.IDSA_error_key_banned,
SecondLine = Resources.IDSA_support_email,
OkButtonText = Resources.IDSA_btn_activate,
CancelButtonText = Resources.IDSA_btn_ordernow
}.Run(this.parentWindow))
{
this.<UpdateLicense>g__ShowRegisterWindow|5_1();
return;
}
this.OpenPurchaseUrl();
return;
}
goto IL_393;
IL_183:
if (this.Activator.IsDemoKey || this.Activator.DaysLimit > 0L)
{
this.<UpdateLicense>g__ShowWizard|5_0(new WizardModel.Message());
return;
}
return;
IL_20E:
this.OpenPurchaseUrl();
return;
IL_372:
this.OpenChangeHidUrl();
return;
IL_393:
if (new AlertWindow
{
Title = Resources.IDSA_title_other_error,
FirstLine = Resources.IDSA_need_activate,
SecondLine = Resources.IDSA_error_details.Replace("{error}", text),
OkButtonText = Resources.IDSA_btn_tryagain,
CancelButtonText = Resources.IDSA_btn_ordernow
}.Run(this.parentWindow))
{
this.<UpdateLicense>g__ShowRegisterWindow|5_1();
return;
}
this.OpenPurchaseUrl();
}
改为:
// vspd.Utils.LicenseUpdater
public void UpdateLicense()
{
}
编辑IL指令为一句
0 0000 ret //返回空,不更新证书
E、自定义注册信息,注册名 // vspd.AboutWindow
public string Registered
{
get
{
return this.<Registered>k__BackingField; //此处改为 return "ChinaRadKe";
}
}
删除多余IL指令,修改为:
0 0000 ldstr "ChinaRadKe"
1 0005 ret
F、自定义注册信息,注册类型// vspd.AboutWindow
public string License
{
get
{
return this.<License>k__BackingField; //此处改为 return "Site License";
}
}
删除多余IL指令,修改为:
0 0000 ldstr "Site License"
1 0005 ret
G、搜索所有 Electronic Team 字符串改 Eltima Software,使用鼠标右键选择编辑IL指令。
H、汉化 vspd.Properties.Resources 资源,实现中文化。汉化资源可以使用 dnSpy 直接保存导出和导入。
I、到我的博客 https://blog.csdn.net/zyyujq ,下载:vspdpro_service.exe、vspdpro_service.dll,停止服务后覆盖原来的文件,再打开vspdpro服务。
最新汉化下载(含PJ的vspdpro_service.exe、vspdpro_service.dll):
https://download.csdn.net/download/zyyujq/85492721
最新版本 V10.0.979和V10.0.992博客:
https://blog.csdn.net/zyyujq/article/details/124067614
Virtual Serial Port Driver Pro 注册原理:
https://blog.csdn.net/zyyujq/article/details/121387304
本站PJ下载(中文和英文版的PJ):
补充内容 (2025-4-24 10:30):
https://download.csdn.net/download/zyyujq/90680938 ,包含所有安装详细步骤和谐过程,汉化资源文件,完整文件。
下载后解包密码:ChinaRedKe Thanks~ 向楼主致敬! 甘拜下风,谢谢分享 来向大佬学习 大佬牛批!顶!! 回复看看 威武霸气! 必火 正好需要谢谢分享啊 不知道来晚了没有 感谢楼主