应用程序虚拟化如何实施?

时间:2010-04-23 14:40:22

标签: c# .net c++ virtualization native

我想了解像App-V和sandboxie(http://www.sandboxie.com/这样的软件是如何工作的。但对于我的生活,我想不出任何可能使这成为可能的东西。他们如何拦截API调用并欺骗目标软件?如果有人会说它只是魔法和小精灵,我会相信它们。但是说真的,有没有白皮书讨论这个问题的解决方案?

如果这在CLR级别上是可行的,那么这将是好的,但如果必须,我愿意去原生。

3 个答案:

答案 0 :(得分:3)

Sandboxie通过将代码注入核心Windows API来实现这一点,就像病毒一样(这就是Vista x64阻止此行为的原因,以及为什么Sandboxie无法在该操作系统上运行)。

Here是一个解释API挂钩的项目。通过研究Metamod:Source的源代码(用于CounterStrike的SourceMod:Source :),我学会了所有这些工作。

答案 1 :(得分:0)

我不知道MS是如何做到的,但这是一种方法的基本理论......

您要做的是挂钩系统调用(类似于链接到中断)。

  1. 系统调用。
  2. 您的自定义拦截会被执行。
  3. 如果此系统调用不需要特殊处理,请继续。否则需要特殊处理并转到步骤4.
  4. 从堆栈中获取堆栈指针,指令指针和所有爵士乐,并构建一个新的堆栈帧,将您发送回用户区域中的自定义代码。
  5. 在用户土地上按摩数据和路径。这样,如果底层操作系统发生变化,则不必[经常]更新此代码。
  6. 完成所有数据按摩后,再次执行系统调用。
  7. 您的自定义中断再次执行,但它应检测到您正在从您的用户级助手层调用并通过该调用。可能需要一些堆栈帧操作来设置正确的返回地址。
  8. 执行常规系统调用。
  9. 当系统调用返回时,堆栈框架应该会将您发送回常规程序流程。
  10. 希望这有帮助。

答案 2 :(得分:0)

查看X86 Virtualization上的维基百科页面,其中讨论了软件虚拟化(早期VMWare,Wine,Sandboxie和App-V的范围)以及更现代的硬件虚拟化(Hyper-V,VMWare,其他)。

我假设您正在寻找软件虚拟化,因为使用.NET(或任何CLR),您已经在某种程度上将您自己从CPU体系结构中抽象出来,尤其是'AnyCPU'目标。