1,136
个编辑
更改
创建页面
{{Archive/zh|https://www.bilibili.com/read/cv39712110}}
= Virtools 3.0版本许可证问题及解决方案 =
== 概述 ==
Virtools 3.0版本许可证问题的症状表现为:在配置了正确的许可证文件后(这很重要,未配置许可证文件的错误不是本文所讨论的),运行Virtools 3.0会弹出一个标题为<code>Virtools FlexLM error</code>的窗口,错误文本为<code>Terminal Server remote client not allowed.</code>,FLEXlm错误码为<code>-103,577</code>。同时,根据汇报者描述,此问题在Windows XP上不存在,只在一些较新的Windows系统上存在,这也就排除了许可证文件的问题。具体发生问题的截图如下所示,因涉及个人隐私,部分信息被涂改。
[[File:virtools30_license_error.png]]
此解决方案在2024年5月20日就已研究出来。这是一个很早就发生过的问题,只不过飘逸冷星在这一期间又将其提上日程。通过多方考证这个错误的含义,以及阅读API和各种反编译后,找到了此解决方案。拖了那么久是因为这个问题其实无关痛痒,因为还有Virtools 3.5可以运行来制图,所以一直没有公开发布这一方案。所以这次可以算作是这个解决方案的正式发布。
需要注意的是,本文并不是介绍如何获取或计算Virtools 3.0的许可证的,也不涉及任何FlexLM破解工作,只是单纯地介绍在拥有了正确的许可证的情况下,仍然无法打开Virtools 3.0的问题的解决方案。与此同时,我们认为这是Virtools 3.0这一软件发行过程中的一个失误,因为解决方案中涉及的字符串太过诡异,以致于让人怀疑是忘记删除调试代码导致的。不过这一切都只是猜测,谁能知道一个20年前发布的过时软件的真相呢?
== 解决方案 ==
该问题有两种解决方案,二选其一即可。
=== DLL劫持 ===
使用DLL劫持的解决方案操作起来非常简单快捷,即使是新手也可以快速掌握。按照以下方法操作即可:
# 打开Virtools的根目录文件夹(里面有<code>devr.exe</code>的那个文件夹)
# 右键新建一个空白文本文档。
# 右键将其改名为<code>wtsapi32.dll</code>(需要开启文件后缀名显示。Windows如若提示是否修改后缀名,确认修改即可)
# 双击运行<code>devr.exe</code>
如果上述操作无效,你仍然打不开Virtools(弹出FlexLM错误框),<s>则说明你可能是较新操作系统的受害者(划掉)</s>,则说明你的系统太新了。你只能使用设置环境变量的解决方案来解决此问题。
DLL劫持实际上利用了Windows上对于DLL特殊加载方式。Windows在寻找程序所需的动态链接库时,会优先从程序所在文件夹进行寻找,而不是系统库中。这种做法有一定逻辑,一定程度上提升了程序的兼容性,但大多数人们了解到这个概念的时候,他都是以病毒的形式存在的。病毒通过故意在程序文件夹中放置关键的系统库文件,以骗取应用程序先找到病毒的伪装文件,从而让程序不知不觉中运行病毒。我们所做的也是欺骗Virtools运行我们自定义的<code>wtsapi32.dll</code>,只不过并不是要执行恶意代码,而是让Virtools的许可证检查器加载这个DLL的过程失败,根据反汇编后的逻辑,许可证检查器就会认为这个文件不存在,从而放弃对Terminal Server这一特性的验证,而这一特性正对应上文FlexLM爆出的错误。
Virtools 3.0这一许可证错误问题在Windows XP上不存在,而在Windows 7及其以后的操作系统上可以稳定复现。这是因为<code>wtsapi32.dll</code>是一个从Windows Vista开始引入的模块,他所提供的Terminal Server功能在Windows XP上并不存在。FlexLM为了兼容性,使用了Win32动态DLL加载函数<code>LoadLibrary</code>来动态判定此DLL是否存在,以获取在Windows XP和Windows Vista及以后系统上均能运行的特性。我们通过DLL劫持机制,欺骗了FlexLM,让它加载<code>wtsapi32.dll</code>的过程意料之中地失败,然后让他认为<code>wtsapi32.dll</code>不存在,从而跳过了针对Terminal Server功能的检查。
需要注意的是,Windows很早就注意到DLL劫持可能带来的危害,因此自Windows 7开始,Windows对于一些系统关键DLL做了特殊设定,这些特殊的DLL名称将只能从系统库中寻找,而不是程序目录下。这份名单存储在注册表中的<code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs</code>项下。这个名单随着操作系统更新而不断扩展。目前可以证实的是,在Windows 10 21H1中,<code>wtsapi32.dll</code>还未加入列表。而在Windows 11中,<code>wtsapi32.dll</code>已加入列表。这也就意味着运行这些较新Windows的用户就不能使用这种便捷的方式来解决Virtools 3.0的许可证问题了。不过不用担心,解决方案还是有的,具体可参考下一章节,通过设置环境变量来解决。
=== 设置环境变量 ===
==== 临时环境变量 ====
# 打开Cmd,使用<code>CD</code>切换工作目录到Virtools根目录
# 执行<code>set HOMER=doh</code>设置环境变量(空格不允许随意添加和删除)
# 执行<code>devr.exe</code>运行Virtools
你可能会注意到这个环境变量以及其数值非常奇怪。是的,我们也觉得非常奇怪,他看起来就像是某种忘记删除的调试代码,不过具体的真相也无从知晓了。现在我们只需要知道,根据反编译给出的结果,设置这样的环境变量后,就可以绕开Terminal Server这一特性的检查,从而正确启动Virtools。
需要注意的是,不要在PowerShell中试图使用<code>set</code>命令去设置环境变量。因为在新版Windows中,在文件夹空白处按住Shift后点击鼠标右键出来的菜单中,默认是打开PowerShell窗口,而非Cmd窗口,所以这里需要强调一下。PowerShell中的<code>set</code>命令与Cmd中的<code>set</code>命令并不等同,请务必确保打开的是Cmd而非PowerShell,或者使用PowerShell中的环境变量设置语句。同时,如果你的<code>devr.exe</code>被设置了需要管理员运行(运行时弹出窗口要求你确认),那么你还需要保证你打开的Cmd是以管理员身份运行的,因为普通用户模式下Cmd中设置的变量,对于以管理员模式启动的程序没有作用。
==== 永久环境变量 ====
通过在命令行设置环境变量的方法是一个临时性的方法。为了简化以后每次打开Virtools的过程,将环境变量固定到系统中是十分必要的,这样就不需要在运行前使用复杂的命令行手动设置环境变量了。按照如下步骤打开Windows的环境变量设置窗口:
# 右键桌面的“此电脑”图标,选择“系统”。
# 选择“高级系统设置”。
# 转到“高级”选项卡。
# 选择“环境变量…”。
打开的窗口中分为上下两部分,上半为用户环境变量,下半为系统环境变量。如果你的<code>devr.exe</code>被设置了需要管理员运行,你需要在系统环境变量里面设置,否则在用户环境变量里设置就可以了。如果不放心或者不确定,可以两者都设定。
点击对应区域的“新建”按钮,打开添加环境变量的窗口,名称输入<code>HOMER</code>,值输入<code>duh</code>,点击确定即可添加。添加完成后,一路点击窗口的确认按钮关闭依次打开的窗口即可。之后再运行Virtools 3.0,也能做到正常运行。
= Virtools 3.0版本许可证问题及解决方案 =
== 概述 ==
Virtools 3.0版本许可证问题的症状表现为:在配置了正确的许可证文件后(这很重要,未配置许可证文件的错误不是本文所讨论的),运行Virtools 3.0会弹出一个标题为<code>Virtools FlexLM error</code>的窗口,错误文本为<code>Terminal Server remote client not allowed.</code>,FLEXlm错误码为<code>-103,577</code>。同时,根据汇报者描述,此问题在Windows XP上不存在,只在一些较新的Windows系统上存在,这也就排除了许可证文件的问题。具体发生问题的截图如下所示,因涉及个人隐私,部分信息被涂改。
[[File:virtools30_license_error.png]]
此解决方案在2024年5月20日就已研究出来。这是一个很早就发生过的问题,只不过飘逸冷星在这一期间又将其提上日程。通过多方考证这个错误的含义,以及阅读API和各种反编译后,找到了此解决方案。拖了那么久是因为这个问题其实无关痛痒,因为还有Virtools 3.5可以运行来制图,所以一直没有公开发布这一方案。所以这次可以算作是这个解决方案的正式发布。
需要注意的是,本文并不是介绍如何获取或计算Virtools 3.0的许可证的,也不涉及任何FlexLM破解工作,只是单纯地介绍在拥有了正确的许可证的情况下,仍然无法打开Virtools 3.0的问题的解决方案。与此同时,我们认为这是Virtools 3.0这一软件发行过程中的一个失误,因为解决方案中涉及的字符串太过诡异,以致于让人怀疑是忘记删除调试代码导致的。不过这一切都只是猜测,谁能知道一个20年前发布的过时软件的真相呢?
== 解决方案 ==
该问题有两种解决方案,二选其一即可。
=== DLL劫持 ===
使用DLL劫持的解决方案操作起来非常简单快捷,即使是新手也可以快速掌握。按照以下方法操作即可:
# 打开Virtools的根目录文件夹(里面有<code>devr.exe</code>的那个文件夹)
# 右键新建一个空白文本文档。
# 右键将其改名为<code>wtsapi32.dll</code>(需要开启文件后缀名显示。Windows如若提示是否修改后缀名,确认修改即可)
# 双击运行<code>devr.exe</code>
如果上述操作无效,你仍然打不开Virtools(弹出FlexLM错误框),<s>则说明你可能是较新操作系统的受害者(划掉)</s>,则说明你的系统太新了。你只能使用设置环境变量的解决方案来解决此问题。
DLL劫持实际上利用了Windows上对于DLL特殊加载方式。Windows在寻找程序所需的动态链接库时,会优先从程序所在文件夹进行寻找,而不是系统库中。这种做法有一定逻辑,一定程度上提升了程序的兼容性,但大多数人们了解到这个概念的时候,他都是以病毒的形式存在的。病毒通过故意在程序文件夹中放置关键的系统库文件,以骗取应用程序先找到病毒的伪装文件,从而让程序不知不觉中运行病毒。我们所做的也是欺骗Virtools运行我们自定义的<code>wtsapi32.dll</code>,只不过并不是要执行恶意代码,而是让Virtools的许可证检查器加载这个DLL的过程失败,根据反汇编后的逻辑,许可证检查器就会认为这个文件不存在,从而放弃对Terminal Server这一特性的验证,而这一特性正对应上文FlexLM爆出的错误。
Virtools 3.0这一许可证错误问题在Windows XP上不存在,而在Windows 7及其以后的操作系统上可以稳定复现。这是因为<code>wtsapi32.dll</code>是一个从Windows Vista开始引入的模块,他所提供的Terminal Server功能在Windows XP上并不存在。FlexLM为了兼容性,使用了Win32动态DLL加载函数<code>LoadLibrary</code>来动态判定此DLL是否存在,以获取在Windows XP和Windows Vista及以后系统上均能运行的特性。我们通过DLL劫持机制,欺骗了FlexLM,让它加载<code>wtsapi32.dll</code>的过程意料之中地失败,然后让他认为<code>wtsapi32.dll</code>不存在,从而跳过了针对Terminal Server功能的检查。
需要注意的是,Windows很早就注意到DLL劫持可能带来的危害,因此自Windows 7开始,Windows对于一些系统关键DLL做了特殊设定,这些特殊的DLL名称将只能从系统库中寻找,而不是程序目录下。这份名单存储在注册表中的<code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs</code>项下。这个名单随着操作系统更新而不断扩展。目前可以证实的是,在Windows 10 21H1中,<code>wtsapi32.dll</code>还未加入列表。而在Windows 11中,<code>wtsapi32.dll</code>已加入列表。这也就意味着运行这些较新Windows的用户就不能使用这种便捷的方式来解决Virtools 3.0的许可证问题了。不过不用担心,解决方案还是有的,具体可参考下一章节,通过设置环境变量来解决。
=== 设置环境变量 ===
==== 临时环境变量 ====
# 打开Cmd,使用<code>CD</code>切换工作目录到Virtools根目录
# 执行<code>set HOMER=doh</code>设置环境变量(空格不允许随意添加和删除)
# 执行<code>devr.exe</code>运行Virtools
你可能会注意到这个环境变量以及其数值非常奇怪。是的,我们也觉得非常奇怪,他看起来就像是某种忘记删除的调试代码,不过具体的真相也无从知晓了。现在我们只需要知道,根据反编译给出的结果,设置这样的环境变量后,就可以绕开Terminal Server这一特性的检查,从而正确启动Virtools。
需要注意的是,不要在PowerShell中试图使用<code>set</code>命令去设置环境变量。因为在新版Windows中,在文件夹空白处按住Shift后点击鼠标右键出来的菜单中,默认是打开PowerShell窗口,而非Cmd窗口,所以这里需要强调一下。PowerShell中的<code>set</code>命令与Cmd中的<code>set</code>命令并不等同,请务必确保打开的是Cmd而非PowerShell,或者使用PowerShell中的环境变量设置语句。同时,如果你的<code>devr.exe</code>被设置了需要管理员运行(运行时弹出窗口要求你确认),那么你还需要保证你打开的Cmd是以管理员身份运行的,因为普通用户模式下Cmd中设置的变量,对于以管理员模式启动的程序没有作用。
==== 永久环境变量 ====
通过在命令行设置环境变量的方法是一个临时性的方法。为了简化以后每次打开Virtools的过程,将环境变量固定到系统中是十分必要的,这样就不需要在运行前使用复杂的命令行手动设置环境变量了。按照如下步骤打开Windows的环境变量设置窗口:
# 右键桌面的“此电脑”图标,选择“系统”。
# 选择“高级系统设置”。
# 转到“高级”选项卡。
# 选择“环境变量…”。
打开的窗口中分为上下两部分,上半为用户环境变量,下半为系统环境变量。如果你的<code>devr.exe</code>被设置了需要管理员运行,你需要在系统环境变量里面设置,否则在用户环境变量里设置就可以了。如果不放心或者不确定,可以两者都设定。
点击对应区域的“新建”按钮,打开添加环境变量的窗口,名称输入<code>HOMER</code>,值输入<code>duh</code>,点击确定即可添加。添加完成后,一路点击窗口的确认按钮关闭依次打开的窗口即可。之后再运行Virtools 3.0,也能做到正常运行。