开发人员的应用程序虚拟化





0/5 (0投票)
2011年3月,Virtualization Technologies发布了新版本的开发者库,使得在应用程序中使用虚拟化成为可能。
2011年3月,Virtualization Technologies发布了新版本的开发者库,使得在应用程序中使用虚拟化成为可能。
该产品名为BoxedApp SDK。顺便说一句,演示版本是完全免费的,您现在就可以通过点击此链接下载。
虚拟化?我为什么需要它?
我想我不会错,如果你听到“虚拟化”时,想到的第一个是虚拟机、VMWare和VirtualBox这样的产品。但令人惊讶的是,虚拟化可以就生活在你的应用程序内部。
这里有几个例子。一个无需安装即可运行的可移植应用程序;问题在于该应用程序使用了Flash ActiveX。这个问题似乎无解:您可以安装Flash ActiveX,但可移植应用程序会向注册表写入某些东西——这有点奇怪。最重要的是,您可能没有足够的权限写入注册表。
另一个例子。第三方代码唯一的分发格式是DLL,但您需要将其静态链接以确保没有任何竞争对手能够发现您的产品本质上是由什么构成的。是的,您可以将DLL保存到临时文件,然后手动加载DLL,但在这种情况下,文件也很容易被其他人保存。当然,同样,您可能没有将DLL保存到磁盘的权限。
或者,您想创建自己的打包器,将众多的可执行文件、DLL和ActiveX合并成一个可执行文件。是的,您可以使用BoxedApp SDK创建这类产品。
这些只是虚拟化所需的任务。
那么,它是如何工作的呢?
它的基本思想是拦截系统调用。当应用程序尝试打开文件或注册表项时,我们会给它一个伪描述符。实际上有很多功能:不仅仅是打开文件,还有许多其他功能。BoxedApp SDK会巧妙地拦截它们,并创建出伪文件(或者更精确地说,虚拟文件)实际存在的逼真幻觉。
结果是,可以创建一个“文件”,应用程序可以像处理真实文件一样处理它。但既然我们是开发者,这里有一个代码示例
HANDLE hFile = BoxedAppSDK_CreateVirtualFile( _T("1.txt"), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, 0, NULL);
看,只需一个调用,“文件”就准备好了。
现在我们可以向这个虚拟文件写入一些文本,然后用记事本打开它
const char* szText = "This is a virtual file. Cool! You have just loaded the virtual file into notepad.exe!\r\nDon't forget to obtain a license ;)\r\nhttp://boxedapp.com/order.html"; DWORD temp; WriteFile(hFile, szText, lstrlenA(szText), &temp, NULL); CloseHandle(hFile); // Inject BoxedApp engine to child processes BoxedAppSDK_EnableOption(DEF_BOXEDAPPSDK_OPTION__EMBED_BOXEDAPP_IN_CHILD_PROCESSES, TRUE); // Now notepad loads the virtual file WinExec("notepad.exe 1.txt", SW_SHOW);
虚拟文件存储在哪里?我能把虚拟文件存储在我的存储中吗?
默认情况下,虚拟文件位于内存中,但有时可能需要为这样的文件设置自定义存储。例如,当数据要存储在数据库或互联网上的某个地方时。对于这种情况,虚拟文件会在实现IStream接口时创建。您只需将存储操作的逻辑放在IStream的实现中,数据就会被放置在那里,而不是在内存中。
使用此类文件的一个有趣的例子是播放加密的媒体内容。例如,源视频文件可以逐块加密,并放置在应用程序中或主程序附近的一个文件中。当播放视频时,程序会创建一个基于IStream的虚拟文件。该IStream不会解密整个视频文件,而是根据需要(从IStream::Read
方法)以小块的形式提供数据。
ActiveX / COM怎么样?
ActiveX仍然被广泛使用;有很多遗留的ActiveX。使用BoxedApp,您可以在程序启动时虚拟注册一个ActiveX,程序将能够使用它!注册非常简单
BoxedAppSDK_RegisterCOMLibraryInVirtualRegistryW(L"Flash9e.ocx");
就是这样!使用ActiveX所需的所有注册表项现在都在虚拟注册表中,位于应用程序内部。这不会以任何方式影响真实的注册表。
如果我创建一个可执行的“文件”并运行它呢?
BoxedApp将创建一个虚拟进程。当您需要分发一个“一体化”应用程序时,这可能会非常方便。您可以将所有可执行文件放在应用程序的资源中,然后在需要时将它们转换成虚拟文件并运行。客户端计算机将保持干净,进程将像从真实文件创建的一样运行。
// Create virtual app1.exe HMODULE hModule = GetModuleHandle(NULL); HRSRC hResInfo = FindResource(hModule, _T("BIN1"), _T("BIN")); HGLOBAL hResData = LoadResource(hModule, hResInfo); LPVOID lpData = LockResource(hResData); DWORD dwSize = SizeofResource(hModule, hResInfo); HANDLE hFile = BoxedAppSDK_CreateVirtualFile( _T("app1.exe"), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, 0, NULL); DWORD temp; WriteFile(hFile, lpData, dwSize, &temp, NULL); CloseHandle(hFile); // Launch it! WinExec("app1.exe 1.txt", SW_SHOW);
这些示例是C++的;C#、Delphi呢?
BoxedApp提供了C++、VB6、C#、VB.Net、Delphi的示例:您现在就可以下载示例。
BoxedApp SDK提供32位和64位版本。
结论
实际上不可能涵盖虚拟化可能需要的全部任务,但我还是会尝试列出一个清单。当以下情况发生时,虚拟化是必需的:
- 创建必须将其所有代码保留在单个文件中的应用程序。
- 创建必须即时运行、无需安装的可移植应用程序。
- 需要将部分代码保密,隐藏其使用的事实。
- 您的目标是创建一个打包器应用程序,该应用程序可以将一组DLL、ActiveX和数据文件合并成一个可执行文件。
感觉您真的需要虚拟化吗?告诉我们您的任务,我们将为您提供一个使用BoxedApp的合适解决方案。