Virtools 3.0版本许可证问题及解决方案

来自Ballance Wiki
跳转至: 导航搜索
Archive icon.png 存档
本页面是对应的原始页面的一个备份,除了少量格式外不会对内容作任何更改。这意味着即使原页面存在错误,本页面也会将之保留下来。

Virtools 3.0版本许可证问题及解决方案

概述

Virtools 3.0版本许可证问题的症状表现为:在配置了正确的许可证文件后(这很重要,未配置许可证文件的错误不是本文所讨论的),运行Virtools 3.0会弹出一个标题为Virtools FlexLM error的窗口,错误文本为Terminal Server remote client not allowed.,FLEXlm错误码为-103,577。同时,根据汇报者描述,此问题在Windows XP上不存在,只在一些较新的Windows系统上存在,这也就排除了许可证文件的问题。具体发生问题的截图如下所示,因涉及个人隐私,部分信息被涂改。

Virtools30 license error.png

此解决方案在2024年5月20日就已研究出来。这是一个很早就发生过的问题,只不过飘逸冷星在这一期间又将其提上日程。通过多方考证这个错误的含义,以及阅读API和各种反编译后,找到了此解决方案。拖了那么久是因为这个问题其实无关痛痒,因为还有Virtools 3.5可以运行来制图,所以一直没有公开发布这一方案。所以这次可以算作是这个解决方案的正式发布。

需要注意的是,本文并不是介绍如何获取或计算Virtools 3.0的许可证的,也不涉及任何FlexLM破解工作,只是单纯地介绍在拥有了正确的许可证的情况下,仍然无法打开Virtools 3.0的问题的解决方案。与此同时,我们认为这是Virtools 3.0这一软件发行过程中的一个失误,因为解决方案中涉及的字符串太过诡异,以致于让人怀疑是忘记删除调试代码导致的。不过这一切都只是猜测,谁能知道一个20年前发布的过时软件的真相呢?

解决方案

该问题有两种解决方案,二选其一即可。

DLL劫持

使用DLL劫持的解决方案操作起来非常简单快捷,即使是新手也可以快速掌握。按照以下方法操作即可:

  1. 打开Virtools的根目录文件夹(里面有devr.exe的那个文件夹)
  2. 右键新建一个空白文本文档。
  3. 右键将其改名为wtsapi32.dll(需要开启文件后缀名显示。Windows如若提示是否修改后缀名,确认修改即可)
  4. 双击运行devr.exe

如果上述操作无效,你仍然打不开Virtools(弹出FlexLM错误框),则说明你可能是较新操作系统的受害者(划掉),则说明你的系统太新了。你只能使用设置环境变量的解决方案来解决此问题。

DLL劫持实际上利用了Windows上对于DLL特殊加载方式。Windows在寻找程序所需的动态链接库时,会优先从程序所在文件夹进行寻找,而不是系统库中。这种做法有一定逻辑,一定程度上提升了程序的兼容性,但大多数人们了解到这个概念的时候,他都是以病毒的形式存在的。病毒通过故意在程序文件夹中放置关键的系统库文件,以骗取应用程序先找到病毒的伪装文件,从而让程序不知不觉中运行病毒。我们所做的也是欺骗Virtools运行我们自定义的wtsapi32.dll,只不过并不是要执行恶意代码,而是让Virtools的许可证检查器加载这个DLL的过程失败,根据反汇编后的逻辑,许可证检查器就会认为这个文件不存在,从而放弃对Terminal Server这一特性的验证,而这一特性正对应上文FlexLM爆出的错误。

Virtools 3.0这一许可证错误问题在Windows XP上不存在,而在Windows 7及其以后的操作系统上可以稳定复现。这是因为wtsapi32.dll是一个从Windows Vista开始引入的模块,他所提供的Terminal Server功能在Windows XP上并不存在。FlexLM为了兼容性,使用了Win32动态DLL加载函数LoadLibrary来动态判定此DLL是否存在,以获取在Windows XP和Windows Vista及以后系统上均能运行的特性。我们通过DLL劫持机制,欺骗了FlexLM,让它加载wtsapi32.dll的过程意料之中地失败,然后让他认为wtsapi32.dll不存在,从而跳过了针对Terminal Server功能的检查。

需要注意的是,Windows很早就注意到DLL劫持可能带来的危害,因此自Windows 7开始,Windows对于一些系统关键DLL做了特殊设定,这些特殊的DLL名称将只能从系统库中寻找,而不是程序目录下。这份名单存储在注册表中的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs项下。这个名单随着操作系统更新而不断扩展。目前可以证实的是,在Windows 10 21H1中,wtsapi32.dll还未加入列表。而在Windows 11中,wtsapi32.dll已加入列表。这也就意味着运行这些较新Windows的用户就不能使用这种便捷的方式来解决Virtools 3.0的许可证问题了。不过不用担心,解决方案还是有的,具体可参考下一章节,通过设置环境变量来解决。

设置环境变量

临时环境变量

  1. 打开Cmd,使用CD切换工作目录到Virtools根目录
  2. 执行set HOMER=doh设置环境变量(空格不允许随意添加和删除)
  3. 执行devr.exe运行Virtools

你可能会注意到这个环境变量以及其数值非常奇怪。是的,我们也觉得非常奇怪,他看起来就像是某种忘记删除的调试代码,不过具体的真相也无从知晓了。现在我们只需要知道,根据反编译给出的结果,设置这样的环境变量后,就可以绕开Terminal Server这一特性的检查,从而正确启动Virtools。

需要注意的是,不要在PowerShell中试图使用set命令去设置环境变量。因为在新版Windows中,在文件夹空白处按住Shift后点击鼠标右键出来的菜单中,默认是打开PowerShell窗口,而非Cmd窗口,所以这里需要强调一下。PowerShell中的set命令与Cmd中的set命令并不等同,请务必确保打开的是Cmd而非PowerShell,或者使用PowerShell中的环境变量设置语句。同时,如果你的devr.exe被设置了需要管理员运行(运行时弹出窗口要求你确认),那么你还需要保证你打开的Cmd是以管理员身份运行的,因为普通用户模式下Cmd中设置的变量,对于以管理员模式启动的程序没有作用。

永久环境变量

通过在命令行设置环境变量的方法是一个临时性的方法。为了简化以后每次打开Virtools的过程,将环境变量固定到系统中是十分必要的,这样就不需要在运行前使用复杂的命令行手动设置环境变量了。按照如下步骤打开Windows的环境变量设置窗口:

  1. 右键桌面的“此电脑”图标,选择“系统”。
  2. 选择“高级系统设置”。
  3. 转到“高级”选项卡。
  4. 选择“环境变量…”。

打开的窗口中分为上下两部分,上半为用户环境变量,下半为系统环境变量。如果你的devr.exe被设置了需要管理员运行,你需要在系统环境变量里面设置,否则在用户环境变量里设置就可以了。如果不放心或者不确定,可以两者都设定。

点击对应区域的“新建”按钮,打开添加环境变量的窗口,名称输入HOMER,值输入duh,点击确定即可添加。添加完成后,一路点击窗口的确认按钮关闭依次打开的窗口即可。之后再运行Virtools 3.0,也能做到正常运行。