zyyujq 发表于 2022-5-29 14:49

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):













zwd841 发表于 2022-5-29 14:50

Thanks~ 向楼主致敬!

YLa3 发表于 2022-5-29 14:55

甘拜下风,谢谢分享

MYJVcmOUusW 发表于 2022-5-29 15:21

来向大佬学习

bsrBw 发表于 2022-5-29 15:47

大佬牛批!顶!!

mSYxEdBpL 发表于 2022-5-29 15:56

回复看看

BPWK8 发表于 2022-5-29 16:13

威武霸气!

CaBTfroL 发表于 2022-5-29 16:18

必火 正好需要谢谢分享啊

FKEUiMSn0 发表于 2022-5-29 16:30

不知道来晚了没有

LxAsK 发表于 2022-5-29 16:31

感谢楼主
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: Virtual Serial Port Driver 最新版本V10_0_992的IL代码分析