如何为应用程序创建一个带虚拟化注册表的“沙盒”?

6
我们有一个第三方本地应用程序(我相信是用C编写的),我们希望在一台机器上运行多个实例。
然而,该应用程序从一个特定的注册表键中读取和写入以查找配置文件的位置。它在运行期间持续读取此位置。注册表键位于HKLM。这意味着,如果我们尝试运行2个具有2个不同配置文件位置的不同应用程序实例,则进程会互相干扰。
是否可能“虚拟化”进程正在使用的注册表(或在沙盒中运行每个进程),使得进程都认为它们正在写入单个位置,但实际上它们正在从不同的位置进行读写,并且它们不会互相干扰?
4个回答

5
有几种虚拟化程序的选项:
https://en.wikipedia.org/wiki/Portable_application_creators
创建自己的虚拟化软件要复杂得多,需要进行编程和使用Windows SDK挂钩库调用的整个过程。但是,一种更容易的选择是创建多个程序副本并对每个可执行文件进行十六进制编辑,这不需要为每个程序的副本设置和运行额外的软件。

根据需要运行的版本数量创建多个应用程序副本,然后在十六进制编辑器中打开应用程序文件,并搜索注册表键的名称,例如:
HKLM\System\CurrentControlSet\Control\Session Manager

然后为每个不同版本更改最后一个字节为数字(1字节,0-9),例如:
HKLM\System\CurrentControlSet\Control\Session Manage1
HKLM\System\CurrentControlSet\Control\Session Manage2
HKLM\System\CurrentControlSet\Control\Session Manage3

对于超过10个不同版本(2字节,00-99),请使用最后两个字节:
HKLM\System\CurrentControlSet\Control\Session Manag01
HKLM\System\CurrentControlSet\Control\Session Manag02
HKLM\System\CurrentControlSet\Control\Session Manag03


有趣的想法。我已经检查了dll并在其中找到了注册表键,所以等我有机会时我会测试一下。虽然这不是理想的解决方案(因为我们希望在进程创建方面更加动态),但这可能可行且简单。 - Sam Holder
我刚刚测试了一下,似乎可以工作。谢谢。我会等待其他建议,但即使没有其他解决方案,这也应该解决我们的问题。谢谢! - Sam Holder
我认为你可以创建一个脚本来创建程序的新副本,并自动更改注册表名称,因为你知道要更改的序列的位置。这样你就可以稍微自动化这个过程。 - Swift

3
虽然Joshua的解决方案适用于这个特定的应用程序,但它可能不适用于其他情况(例如,在代码中构建注册表路径或应用程序签名时)。
因此,我建议使用DLL注入并拦截对RegOpenKey(Ex)RegCreateKey(Ex)等的调用。这样,您可以在将调用传递给真正的Windows Advapi32.dll之前操纵注册表路径。
一些关于API挂钩的优秀文章: Windows上的API挂钩和DLL注入 使用MS Detours进行API挂钩

2
是的,Sandboxie可以运行一个应用程序的多个实例,每个实例都在它自己的“沙盒”中运行,以为自己是整个宇宙。但是如果需要,您也可以通过常规方式直接访问数据。
换句话说,Sandboxie允许您查看应用程序操作中所做的所有注册表更改,如果需要,您可以回滚这些更改。

1
是的,您可以将应用程序虚拟化,这种技术称为应用程序虚拟化。尝试http://www.cameyo.com/。Cameyo是用于构建虚拟应用程序的软件。
虚拟应用程序是一个单独的EXE文件,包含整个应用程序,包括文件、DLL和注册表。虚拟应用程序与您的系统隔离,并且可以在不安装的情况下从一台计算机复制和移动到另一台计算机。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接