好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

面对IE保护模式的开发者生存之道.doc

13页
  • 卖家[上传人]:汽***
  • 文档编号:510276357
  • 上传时间:2023-09-18
  • 文档格式:DOC
  • 文档大小:244KB
  • / 13 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 面对IE保护模式的开发者生存之道  在微软开发者大会上看到Vista和IE 7之后,我已经表示它们的保护模式不仅仅阻挡了间谍软件,也让合法的IE插件变得非常困难当我试用了Vista beta 2之后,我体验到了这种困难——我的产品之一是一个IE工具栏,保护模式破坏了它的许多主要功能,因为这个工具栏需要与IE之外的另一个进程进行通信经过多次尝试,我最终让这些功能又可以正常使用了关于如何在这种安全模式下对自己的应用程序做出必要的修改,我根据自己的经历总结出一些经验,希望和有这方面需求的朋友分享    这篇文章假定你已经熟悉C++、GUI和COM编程示例代码是使用Visual Studio 2005、WTL 7.5和Windows SDK建立的如果你想更多的了解WTL,可以查看我的关于WTL的系列文章( /wtl4mfc1.asp)WTL只用于图形化界面;本文介绍的概念适用于所有应用程序,没有依赖于任何类库 一.介绍保护模式    IE浏览器的保护模式是Vista中的一个新功能,是类似用户帐号控制(UAC)的一种安全功能在保护模式下,通过限制运行在IE进程下的代码不能修改 系统部分文件,从而来保护计算机的安全。

      这样,即使一个恶意网页利用了IE或IE插件中的一个代码注入漏洞,注入的代码也不能够对系统造成破坏    在我们深入了解保护模式对IE插件开发者意味着什么之前,我们需要先快速了解一下相关的安全功能 1.完整性级别和UIPI    Vista引入了一种叫做强制完整性级别的安全对象新属性分为四个级别:   ·系统:被操作系统组件使用,不应被应用程序所使用;   ·高:在提升的完全管理权限下运行的进程;   ·中:正常方式启动的进程;   ·低:被IE和Windows Mail使用来提供保护模式   Windows中关于进程的信息包含它是使用哪一个完整性级别启动的一旦该进程启动后这个级别永远不会发生改变,它只能在进程被创建的时候被设定一个进程的完整性级别具有以下三个主要的作用:   (1)这个进程所创建的任何安全对象具有与它相同的完整性级别   (2)这个进程不能够存取完整性级别比它高的资源   (3)这个进程不能发送Windows消息到具有更高完整性级别的进程    这不是一个完整的列表,但是以上所列的三个是对插件具有最大影响的前两条防止一个低完整性的进程篡改IPC资源,例如共享内存,包含敏感数据或一个应用程序正常运行所需要的数据。

      最后一条被称为用户界面特权隔离(UIPI),被设计来防止类似粉碎窗口攻击(shatter attack)之类的攻击,在粉碎窗口攻击中,攻击者通过发送给进程一个它不希望收到的消息,从而导致它运行非信任的代码2.虚拟化    虚拟化(在某些微软文档中又被叫做重定向)功能可以防止一个进程修改注册表和文件系统中的保护区域,但是依然允许这个应用程序正常的运行对中等完整性级 别的进程来说,这个保护区域是诸如HKLM、system32和Program Files目录之类的系统关键区域一个低完整级别的进程受限制性更大——它只能对特定的低权限的注册表和文件系统区域进行写操作,任何对这些区域外部进 行写操作的行为都将被阻止    当一个进程试图对它没有权限的区域进行写操作的时候,虚拟化功能都会阻止它们并且把这个写操作重定向到当前用户配置文件下的目录(或者注册表键值),这个 写操作实际上在这儿发生然后当这个应用程序试图读这个数据的时候,读操作同样被重定向,因此这个应用程序将看到它以前写的数据    因为虚拟化功能不再能完成像替其他进程写注册表之类的功能,因此它影响IE扩展插件的编写另外,IE扩展插件写数据文件的区域也非常有限制——只有像收藏夹(Favorites)、Cookies等IE特定的目录可以写。

      3.何时保护模式被打开?    在Vista的默认设置中,IE一直运行在保护模式如下图所示,从状态栏中可以看到保护模式被打开的提示:   你可以通过禁用用户帐号控制(UAC)来完全关闭保护模式,或者通过在IE选型对话框的安全标签中把启用保护模式前面的复选框去掉勾选你还可以通过运行一个新的提升权限的IE实例来临时的跳过保护模式,但是请记住这样做将使IE运行在高完整性等级,而不是像普通应用程序的中等完整性二 示例应用程序和扩展插件   本文中的示例代码包含了两个项目第一个项目,IEEExtension,是停靠在IE窗口底部的一个条形窗口:   第二个项目,DemoApp,是一个与上面的应用通信的EXE程序DemoApp本身不完成太多任务,比较有趣的部分是与这个EXE程序通信的IEExtecntion这种通信会受到IE保护模式的很大影响,这两个项目都演示了它们如何在保护模式的限制下运行,而且依然可以实现正常的互相通信    这个条形框中具有几个按钮来实现不同的IPC任务这些按钮成对显示:一个不能工作在保护模式下的老技术(button 1);一个可以工作的新智能识别保护模式技术(button 2)。

      列表控件显示不同的状态信息,诸如从Windows APIs返回的值    本文中的其余部分将关注这个扩展插件需要做什么才能在保护模式正常的运行我将介绍一些APIs,然后给出使用这些API的示例扩展插件的代码每一部分对应条形框(band)中的一个按钮(或一对按钮),因此你可以在阅读文章的时候查看相应的代码 三 在保护模式限制下运行    IE 7有好几个新的API可以被扩展插件用来完成保护模式下限制的功能这些API都在ieframe.dll中你可以通过使用iepmapi.lib这个 库来直接使用这些API,也可以在运行的时候使用LoadLibrary()/GetProcAddress()来得到这些函数的指针如果你想让你的插 件加载到Vista以前的Windows版本上,第二种方法是你必须使用的选择    执行提升权限操作的许多功能使用到了一个代理进程(broker process),ieuser.exe由于IE进程运行在低完整性等级下,它不能靠自己来完成更高权限的任务;ieuser.exe担任了这个角色 你会经常在本文中和微软的文档中看到提到的这个代理进程1.运行时检测保护模式    为了判断我们的插件是否运行在一个保护模式IE进程中,我们使用IEISProtectedModeProcess():HRESULT IEIsProtectedModeProcess(BOOL* pbResult);   如果返回值是一个成功的HRESULR和*pbResult是True,那么保护模式就被启用了。

      根据在*pbResult中返回的值,你可以在你的代码中采取不同的操作:HRESULT hr; BOOL bProtectedMode = FALSE; hr = IEIsProtectedModeProcess ( &bProtectedMode ); if ( SUCCEEDED(hr) && bProtectedMode ) // IE is running in protected mode else // IE isn't running in protected mode   示例band插件在一启动的时候调用了这个API,并显示了关于保护模式状态的一个消息 2.写文件系统    当保护模式被启用的时候,扩展插件只能对用户配置下的几个目录进行写操作只有在Temp、Temporary、Internet Files、Cookies和Favorites目录下的几个特定低完整性目录可以进行写操作IE还有某些兼容性补偿功能,它虚拟化其他常用目录对这 些目录的写操作将被重定向到Temporary Internet Files的子目录中如果一个扩展插件试图对一个敏感进行写操作的话,例如对windows目录,这个操作将会失败。

         当一个扩展插件希望写这个文件系统的时候,它应该使用IEGetWriteableFolderPath()这个API,而不是 GetSpecialFolderPath()、GetFolderPath()或SHGetKnownFolderPath() IEGetWriteableFolderPath()可以发现保护模式,如果一个插件请求一个不允许写的目 录,IEGetWriteableFolderPath()将返回E_ACCESSDENIEDIEGetWriteableFolderPath() 的原型如下:HRESULT IEGetWriteableFolderPath(GUID clsidFolderID, LPWSTR* lppwstrPath);  其中GUID是其中之一,在knownfolders.h: FOLDERID_InternetCache, FOLDERID_Cookies, FOLDERID_History中定义对于Temp目录来说似乎没有一个GUID,因此当你需要写临时文件的时候,我推荐使用 FOLDERID_InternetCache    以下是在缓存中创建一个临时文件的代码片段:HRESULT hr; LPWSTR pwszCacheDir = NULL; TCHAR szTempFile[MAX_PATH] = {0}; hr = IEGetWriteableFolderPath(FOLDERID_InternetCache, &pwszCacheDir); if ( SUCCEEDED(hr) ) { GetTempFileName(CW2CT(pwszCacheDir), _T("bob"), 0, szTempFile); CoTaskMemFree(pwszCacheDir); // szTempFile now has the full path to the temp file. }    如果IEGetWriteableFolderPath() 成功的话,它将分配一个缓冲器,并在pwszCacheDir中返回它的地址。

      我们把那个目录传输给GetTempFileName(),然后使用CoTaskMemFree()释放这个缓冲器    IEGetWriteableFolderPath() 不仅仅可以用来写临时文件当一个插件使用保护模式版的文件保存对话框的时候,也会用到它,这一点我们将在下面的《提示用户保存文件》部分解释在这个演 示项目中,当你点击了Save Log按钮后,使用这个API3.写注册表    因为注册表是系统的关键部分,所以有一点很重要,运行在浏览器中的代码不允许来修改注册表的任何可能导致运行恶意软件的部分为了实现这个目的,只有一个 键值是扩展插件可以写的对于文件系统来说,这个键值在当前用户的文件下的一个专门的低权限区域中要想得到这个键值的句柄,可以调用 IEGetWriteableHKCU(): HRESULT IEGetWriteableHKCU(HKEY* phKey);   如果它成功的话,你可以在其他的注册表API中使用返回的HKEY来写任何需要的数据本演示项目没有使用这个注册表,但是这割API是非常简单的,在使用它的时候应该不会什么麻烦 4.提示用户保存文件    当IE运行在保护模式的时候,还有一个方式让插件来间接的写低权限区域之外的文件系统。

      插件可以通过调用IEShowSa。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.