Windows 如何创建';沙箱';是否为应用程序使用虚拟化注册表?

Windows 如何创建';沙箱';是否为应用程序使用虚拟化注册表?,windows,process,registry,sandbox,registry-virtualization,Windows,Process,Registry,Sandbox,Registry Virtualization,我们有一个第三方本机应用程序(我相信是用C编写的),我们希望在一台机器上运行的多个实例 但是,应用程序从一个特定的注册表项进行读写,以便找到配置文件的位置。它在运行期间连续读取此位置。注册表项位于HKLM中。这意味着,如果我们尝试在配置文件的两个不同位置运行应用程序的两个不同实例,那么这些进程会相互影响 是否可以“虚拟化”进程正在使用的注册表(或在沙箱中运行每个进程),以便它们都可以认为它们正在向单个位置写入,但实际上它们是从不同的位置写入和读取的,并且它们不会互相干扰?有几个选项可以虚拟化程序

我们有一个第三方本机应用程序(我相信是用C编写的),我们希望在一台机器上运行的多个实例

但是,应用程序从一个特定的注册表项进行读写,以便找到配置文件的位置。它在运行期间连续读取此位置。注册表项位于HKLM中。这意味着,如果我们尝试在配置文件的两个不同位置运行应用程序的两个不同实例,那么这些进程会相互影响


是否可以“虚拟化”进程正在使用的注册表(或在沙箱中运行每个进程),以便它们都可以认为它们正在向单个位置写入,但实际上它们是从不同的位置写入和读取的,并且它们不会互相干扰?

有几个选项可以虚拟化程序:

创建自己的虚拟化软件要复杂得多,并且需要使用windows SDK对编程和挂接库调用进行一次完整的粗略操作

然而,一个更简单的选择是不需要为程序的每个副本设置和运行额外的软件,我建议创建程序的多个副本并编辑每个可执行文件。

创建运行所需的应用程序的尽可能多的副本,然后在十六进制编辑器中打开应用程序文件并搜索注册表项的名称,即:
HKLM\System\CurrentControlSet\Control\Session Manager

然后将最后一个字节更改为每个不同版本的数字(1字节,0-9),即:
HKLM\System\CurrentControlSet\Control\Session Manager 1
HKLM\System\CurrentControlSet\Control\Session Manager 2
HKLM\System\CurrentControlSet\Control\Session Manager 3

对于10个以上的差异(2个字节,00-99),请使用最后两个字节:
HKLM\System\CurrentControlSet\Control\Session Manag01
HKLM\System\CurrentControlSet\Control\Session Manag02

HKLM\System\CurrentControlSet\Control\Session Manag03

是的,您可以虚拟化应用程序,这种技术称为应用程序虚拟化。 尝试Cameyo是一种用于构建虚拟应用程序的软件


虚拟应用程序是一个单独的EXE文件,它包含整个应用程序,包括文件、DLL和注册表。虚拟应用程序与您的系统隔离,可以在不安装的情况下从一台计算机复制和移动到另一台计算机。

虽然Joshua的解决方案适用于此特定应用程序,但它可能不适用于其他应用程序(例如,在代码中构造注册表路径的位置或在应用程序签名时)

因此,我建议使用并拦截对
RegOpenKey(Ex)
RegCreateKey(Ex)
等的调用。这样,在将调用传递到真正的Windows
Advapi32.dll
之前,您可以修改注册表路径

关于API挂钩的一些很棒的文章:

是的,可以运行一个应用程序的多个实例,每个实例都在它自己的“沙盒”中,它认为这是整个宇宙。但如果需要,您也可以通过正常方式直接访问数据


换句话说,Sandboxie可以让您查看应用程序操作中所做的所有注册表更改,如果您愿意,您可以回滚这些更改。

有趣的想法。我已经检查了dll并在其中找到了注册表项,所以当我有机会时,我会测试这个。这不是一个理想的解决方案(因为我们希望在创建流程时更具动态性),但这可以工作,也可以简化。我刚刚测试了这一点,它似乎可以工作。谢谢我将等待其他建议,但这应该解决我们的问题,即使没有其他解决方案即将到来。谢谢我认为您可以创建一个脚本来创建程序的新副本,并自动更改注册表名,因为您知道要更改的序列的位置。就像这样,你可以让这个过程自动化一点