Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序虚拟化是如何实现的?_C#_.net_C++_Virtualization_Native - Fatal编程技术网

C# 应用程序虚拟化是如何实现的?

C# 应用程序虚拟化是如何实现的?,c#,.net,c++,virtualization,native,C#,.net,C++,Virtualization,Native,我试图理解像andsandboxie()这样的软件是如何工作的。但就我个人而言,我想不出任何东西能让这一切成为可能。他们如何拦截API调用并欺骗目标软件?如果有人说这只是魔法和精灵之尘,我会相信他们。但是,严肃地说,有没有讨论解决这个问题的白皮书 如果这在CLR级别上是可能的,那就好了,但如果必须的话,我愿意使用本机。Sandboxie通过向核心Windows API注入代码来实现这一点,就像病毒一样(这就是为什么Vista x64阻止这种行为,以及为什么Sandboxie在该操作系统上不起作用

我试图理解像andsandboxie()这样的软件是如何工作的。但就我个人而言,我想不出任何东西能让这一切成为可能。他们如何拦截API调用并欺骗目标软件?如果有人说这只是魔法和精灵之尘,我会相信他们。但是,严肃地说,有没有讨论解决这个问题的白皮书


如果这在CLR级别上是可能的,那就好了,但如果必须的话,我愿意使用本机。

Sandboxie通过向核心Windows API注入代码来实现这一点,就像病毒一样(这就是为什么Vista x64阻止这种行为,以及为什么Sandboxie在该操作系统上不起作用)


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

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

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

  • 系统调用发生
  • 您的自定义截取将被执行
  • 如果此系统调用不需要特殊处理,请继续。否则需要特殊处理并转至步骤4
  • 从堆栈中获取堆栈指针、指令指针和所有jazz,并构建一个新的堆栈框架,将您发送回user land中的自定义代码
  • 在用户区对数据、路径和内容进行按摩。这样,如果底层操作系统发生更改,则不必[频繁地]更新此代码
  • 在所有数据处理之后,再次执行系统调用
  • 您的自定义中断会再次执行,但它会检测到您正在从用户land helper层调用,并将调用传递给其他层。可能需要一些堆栈帧操作来设置正确的返回地址
  • 执行常规系统调用
  • 当系统调用返回时,堆栈帧应将您发送回常规程序流
    希望这能有所帮助。

    查看Wikipedia页面,该页面讨论了软件虚拟化(早期的VMWare、Wine、Sandboxie以及某种程度上的App-V)和更现代的硬件虚拟化(Hyper-V、VMWare等)


    我假设您正在专门寻找软件虚拟化,因为通过使用.NET(或任何CLR),您已经在某种程度上脱离了CPU体系结构,尤其是“AnyCPU”目标。

    酷!我会调查的。假设64位版本的WindowsVista和Windows7中不允许API挂接,对吗?谢谢两个不同事物的同一术语;您可以在特定事件发生时调用代码的范围内“钩住”(“调试”或“运行时”钩住-仅适用于操作系统允许钩住的事件)。但是,您不能覆盖实现实际事件细节的DLL,这正是sandboxie所需要的。请看,您应该为开发人员查看应用程序虚拟化的SDK。