Virtools 3.0版本许可证问题及解决方案
概述
Virtools 3.0版本许可证问题的症状表现为:在配置了正确的许可证文件后(这很重要,未配置许可证文件的错误不是本文所讨论的),运行Virtools 3.0会弹出一个标题为Virtools FlexLM error
的窗口,错误文本为Terminal Server remote client not allowed.
,FLEXlm错误码为-103,577
。同时,根据汇报者描述,此问题在Windows XP上不存在,只在一些较新的Windows系统上存在,这也就排除了许可证文件的问题。具体发生问题的截图如下所示,因涉及个人隐私,部分信息被涂改。
此解决方案在2024年5月20日就已研究出来。这是一个很早就发生过的问题,只不过飘逸冷星在这一期间又将其提上日程。通过多方考证这个错误的含义,以及阅读API和各种反编译后,找到了此解决方案。拖了那么久是因为这个问题其实无关痛痒,因为还有Virtools 3.5可以运行来制图,所以一直没有公开发布这一方案。所以这次可以算作是这个解决方案的正式发布。
需要注意的是,本文并不是介绍如何获取或计算Virtools 3.0的许可证的,也不涉及任何FlexLM破解工作,只是单纯地介绍在拥有了正确的许可证的情况下,仍然无法打开Virtools 3.0的问题的解决方案。与此同时,我们认为这是Virtools 3.0这一软件发行过程中的一个失误,因为解决方案中涉及的字符串太过诡异,以致于让人怀疑是忘记删除调试代码导致的。不过这一切都只是猜测,谁能知道一个20年前发布的过时软件的真相呢?
解决方案
该问题有两种解决方案,二选其一即可。
DLL劫持
使用DLL劫持的解决方案操作起来非常简单快捷,即使是新手也可以快速掌握。按照以下方法操作即可:
- 打开Virtools的根目录文件夹(里面有
devr.exe
的那个文件夹) - 右键新建一个空白文本文档。
- 右键将其改名为
wtsapi32.dll
(需要开启文件后缀名显示。Windows如若提示是否修改后缀名,确认修改即可) - 双击运行
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的许可证问题了。不过不用担心,解决方案还是有的,具体可参考下一章节,通过设置环境变量来解决。
设置环境变量
临时环境变量
- 打开Cmd,使用
CD
切换工作目录到Virtools根目录 - 执行
set HOMER=doh
设置环境变量(空格不允许随意添加和删除) - 执行
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的环境变量设置窗口:
- 右键桌面的“此电脑”图标,选择“系统”。
- 选择“高级系统设置”。
- 转到“高级”选项卡。
- 选择“环境变量…”。
打开的窗口中分为上下两部分,上半为用户环境变量,下半为系统环境变量。如果你的devr.exe
被设置了需要管理员运行,你需要在系统环境变量里面设置,否则在用户环境变量里设置就可以了。如果不放心或者不确定,可以两者都设定。
点击对应区域的“新建”按钮,打开添加环境变量的窗口,名称输入HOMER
,值输入duh
,点击确定即可添加。添加完成后,一路点击窗口的确认按钮关闭依次打开的窗口即可。之后再运行Virtools 3.0,也能做到正常运行。