具体实施方式
本发明描述的系统和方法处理各种信息,如由一个或多个程序或服务生成的事件。此外,描述了一种准许诸如安全相关信息等信息在计算机系统的各种组件和程序中通信的接口。计算系统包括从多个来源,如安全引擎和其它计算系统接收事件和其它信息的事件管理器。示例安全引擎包括防病毒引擎、防火墙引擎和入侵检测引擎。事件管理器将从特定的来源接收的事件信息传递到可使用该信息来提高提供给计算系统的安全级别的一个或多个安全引擎。
尽管本发明所讨论的具体示例涉及安全相关事件和其它安全相关信息,替换实施例可处理任一类型的事件或信息。该信息包括可由主计算机中的安全相关组件使用的任一信息。其它实施例可接收、处理并分发未必涉及主计算机的安全性的信 息。术语“接口”、“程序接口”和“应用程序接口(API)”在这里可互交换地使用。
事件处理
图1示出了可生成并处理各种事件的示例环境100。事件包括,例如,计算机病毒的检测、访问保密数据的尝试的检测、破坏了计算机病毒的通知、特定应用程序被暂停或防止执行的通知、系统状态信息的改变等等。主计算机102通过网络108耦合至多个服务器104和106。主计算机102和服务器104和106可以是任一类型的计算设备,如下文参考图9所讨论的设备。网络108可以是任一类型的数据通信网络,如局域网(LAN)、广域网(WAN)、因特网等等。尽管图1示出了主计算机102耦合至两个服务器104和106,主计算机102可耦合至任意数量的服务器或能够与主计算机通信的其它设备。
环境100可表示各种设置的任一个,如家庭网络、商业、教育、研究等设置。例如,服务器104可以是企业LAN上的服务器设备,主计算机102可以是企业LAN上的台式或者便携式计算设备。作为另一示例,服务器104可以是因特网上的服务器设备,主计算机102可以是用户家中的桌面计算设备。
主计算机102包括安全模块110,它执行各种安全相关功能,如监控、检测并响应主计算机102上的攻击。安全模块110包括耦合至三个安全引擎114、116和118的事件管理器112。安全引擎可以是在对恶意用户和/或恶意程序进行保护中有帮助的任一服务。安全引擎114-118可以软件、硬件或软件和硬件的组合实现。特定的安全引擎是安全相关应用程序,如防病毒程序和入侵检测程序。安全引擎114-118也可被称为“服务”。特定的安全模块110可包括耦合至事件管理器112的任意数量的安全引擎。安全模块110也可包括其它模块、组件或应用程序(未示出),如安全相关政策读取器或其它政策处理机制。
安全模块110也耦合至系统状态信息120和系统配置信息122。系统状态信息120包括关于主计算机102的当前操作状态或操作模式的信息。系统配置信息122包括关于如何配置主计算机102的信息。系统状态信息120和系统配置信息122可储存在非易失存储设备中,如存储器设备或硬盘设备。在一个实施例中,事件管理器112和安全引擎114-118能够接收系统状态信息120和系统配置信息122。
主计算机102也包括准许安全政策和事件信息在主计算机102或其它设备的 各种组件和程序中通信的应用程序接口(API)124。例如,API 124允许组件或程序与安全引擎114-118或事件管理器112进行通信来发送或接收安全相关信息。API 124也方便了,例如,加载新安全引擎、上传现有的安全引擎、向安全引擎发送安全政策、将数据中的变化传递到安全引擎、与安全引擎的用户交互以及安全引擎的集中式配置管理。下文将讨论关于API 124的另外的细节。
尽管未在图1中示出,另外的数据源或数据提供者可将信息和事件传递到安全模块112和事件管理器112。另外的数据包括,例如,涉及因特网信息服务(IIS)的配置信息、由系统管理应用程序提供的数据、包含在系统注册表中的数据以及由系统的用户或管理员提供的信息。
每一安全引擎114-118执行某些安全相关功能来帮助保护主计算机102免遭恶意用户或应用程序侵扰。这些恶意用户或应用程序可试图禁用主计算机102或禁用主计算机102的功能、从主计算机获取数据(如,密码或其它保密信息)、或使用主计算机(如,协助攻击其它计算机系统)。例如,安全引擎114检测计算机病毒,安全引擎116提供防火墙保护,而安全引擎118基于一个或多个用户特权或特征阻塞特定应用程序的执行。在该示例中,安全引擎114保护主计算机102免遭计算机病毒、蠕虫、特洛伊木马等的感染。另外,防火墙保护包括保护主计算机102免遭其它设备通过网络连接的访问。阻塞特定应用程序的执行包括防止不具有合适的特权的用户在主计算机102上执行应用程序。另外,如果检测到了不正确的行为,如不正确的网络访问或不正确的存储设备访问,应用程序的执行将被阻塞。
在其它实施例中,一个或多个安全引擎可执行入侵检测或攻击分析。入侵检测包括,例如,当恶意应用程序和/或用户访问主计算机102时进行标识,以及采取适当的行动来通知用户或管理员、试图禁用恶意应用程序或暂停恶意用户的访问。攻击分析包括,例如,试图检测主计算机102中由于未正确地安装或更新安全引擎或其它组件、未适当地配置安全引擎或其它组件、未安装补丁或热修理、密码不符合需要的长度或需要的字符等等而产生的弱点。特定的安全引擎114-1118可知道耦合至事件管理器112的其它安全引擎的存在和功能。
每一安全引擎114-118向事件管理器112传递事件(如,计算机病毒的检测、从主计算机102检索数据的尝试的检测或防止用户执行应用程序)。这些事件包括由安全引擎收集的信息、由安全引擎采取的行动、由事件管理器从一个或多个数据源收集的信息等等。示例信息包括在特定安装中例示的所有虚拟服务器的清单。事 件管理器112处理这些事件并把包含在特定事件中的信息传递到可从这些信息获益的其它安全引擎114-118。
安全模块110也接收包括一个或多个规则和各种数据的安全相关政策。如需要,事件管理器112将规则分发到适当的安全引擎114-118,并向安全引擎提供数据。每一安全引擎114-118储存从事件管理器112接收的这些规则和数据。安全模块110、事件管理器112和安全引擎114-118的操作在后文更详细讨论。
图2示出了包含数据和规则的示例安全政策200。在一个实施例中,安全政策200储存在安全模块110中。特定的安全模块可接收并储存从任意数量的不同数据源接收的任意数量的不同的安全政策200。可选地,安全政策200可储存在主计算机102内的另一模块或组件中。在图2的示例中,安全政策200的数据部分202包括一个或多个数据元素。如图2所示,这些数据元素包括分配给变量的值(如,值“1”分配给变量“A”,值“4”分配给变量“B”)。在其它实施例中,替代图2所示的数据或除图2所示的数据之外,可包括其它类型的数据。例如,包含在安全政策200中的数据由包含在安全政策200或包含在一个或多个其它安全政策中的一个或多个规则使用。
安全政策200也包括包含多个规则的规则部分204。安全政策200中的规则部分可与一个或多个安全引擎关联。例如,某些规则可仅由特定的安全引擎应用。规则可基于其所关联的安全引擎在安全政策200中排列。可选地,与每一规则关联的标识符可标识能够应用该规则的安全引擎。在特定的实施例中,规则可与任意数量的安全引擎关联。在其它实施例中,主计算机可以不包含应用特定规则的安全引擎。在这一情况下,该规则不与任一安全引擎关联。
在图2的示例中,使用“如果-则”(IF-THEN)结构来定义规则。可选地,规则组可采用各种不同的形式。使用图2所示的“如果-则”规则,该规则定义了特定的条件和对应的特定行动或结果。在实施规则的过程中,如果检测到了特定的条件,则执行对应的特定行动或结果。规则可标识各种不同的条件和对应的行动或结果。示例条件包括试图访问资源(如,存储器位置、网络地址或端口、其它程序、或存储设备上的文件)、试图向特定位置写入数据(如,特定存储器位置或存储设备上的特定位置)、试图运行特定的程序以及主计算机102的当前操作状态的各方面。示例结果包括防止资源被读取、防止数据被写入到特定位置、防止程序被运行或生成检测到了规则中的条件的出现的通知(如,在记录中记录其出现或向用户或 其它计算机发送消息)。特定的结果也可以是本质上许可而非防止。例如,结果可指示仅当主计算机102满足规则中的条件时可访问特定资源或位置,或仅当主计算机102满足规则中的条件时可运行特定的程序。
规则的另外的示例包括准许某些应用程序或服务更新特定目录或文件夹中的数据文件、如果启用了文件传输协议(FTP)则起用端口21上通信量的接收、以及如果检测到了特定的病毒签名则生成病毒警告消息。其它示例包括如果特定的应用程序未升级到特定的修订级则生成事件、如果应用程序未升级到最小修订级则防止对网络的访问、以及防止主计算机通过网络端口35接收数据。
图3示出了由安全模块维护的关于各种安全引擎请求的数据的示例表300。在一个实施例中,表300储存在安全模块110中。可选地,表300可储存在主计算机102内的另一模块或组件中。每次安全引擎从安全模块请求数据,安全模块都更新该表(如必需)以包括该数据请求。表300的第一列302标识具体的数据元素,如变量或其它标识符或信息。表300的第二列标识先前曾请求相关数据元素的任一安全引擎。例如,表300标识出数据元素“A”先前由安全引擎“1”请求。类似地,数据元素“D”先前由安全引擎“1”、“4”和“6”请求。如后文更详细讨论的,包含在表300内的信息由安全模块用于确定哪一安全引擎应当接收更新的数据。
图4所示是用于检索并分发安全政策规则和数据的过程400的实施例的流程图。例如,可在主计算机的初始化之后执行过程400。最初,安全模块检索用于主计算机的安全政策(块402)。事件管理器标识安全政策中涉及每一安全引擎的规则(块404)。事件管理器然后将该规则传递到适当的安全引擎(块406)。
每一安全引擎例如通过标识包含在安全引擎将应用的规则内的数据元素,来标识应用其关联的规则所必需的数据(408)。每一安全引擎然后从事件管理器请求其标识的数据(块410)。在从安全引擎接收了数据请求之后,事件管理器在表(如图3的表300)中记录请求的数据元素或其它数据结构用于将来参考(块412)。最后,事件管理器查找请求的数据并将该数据提供给请求的安全引擎(块414)。由此,事件管理器向每一请求的安全引擎提供所请求的数据,而不是向所有的安全引擎提供所有数据。
图5所示是用于处理更新的安全政策数据的过程500的实施例的流程图。最初,安全模块接收更新的数据(块502)。例如,更新的数据可包括对现有变量的更新值。安全模块标识先前曾请求现已更新的数据的一个或多个安全引擎(块 504)。在一个实施例中,安全模块使用诸如图3所示的表300等表来标识这些安全引擎。在标识适当的安全引擎之后,安全模块向每一标识的安全引擎提供更新的数据(块506)。最后,安全引擎用更新的数据更新其数据元素。在每次安全模块接收更新数据时重复过程500。在另一实施例中,安全模块周期性地检查各种数据源的更新数据。如果数据已更新,则安全模块检索更新的数据并依照过程500分发该数据。
在一个实施例中,当规则被更新后,安全模块标识与该规则关联的安全引擎并将更新的规则分发到标识的安全引擎。如果接收了新规则,则安全模块标识可能使用该新规则的安全引擎并将该新规则分发到适当的安全引擎。类似地,如果删除了现有规则,则安全模块从与该规则关联的所有安全引擎删除该规则。在另一个实施例中,当规则被更新时,安全模块创建一组新规则(包括更新的规则),并将该组新规则分发到安全引擎,由此替换了包含在安全引擎中的现有规则。
图6所示是用于处理诸如事件信息或系统状态信息等信息向一个或多个安全引擎的分发的过程600的实施例的流程图。最初,事件管理器从安全引擎接收事件(块602)。事件管理器然后标识包含在该事件内的信息(块604),如事件类型或生成该事件的攻击的特性。事件管理器也标识可使用包含在该事件内的信息的其它安全引擎(块606)。例如,在主计算机接收的安全规则中指定不同安全引擎之间的关系。这些关系可由系统管理员或其它系统操作员在创建安全政策时全部或部分地定义。
下一步,事件管理器向标识的安全引擎提供包含在事件内的信息(块608)。标识的安全引擎然后应用接收的信息(块610)。这一事件信息的共享(或相关)增强了主计算机提供的对恶意攻击的安全级别。事件信息的共享由事件管理器处理,使得个别的安全引擎不需要知道包含在主计算机内的其它安全引擎。本发明讨论的安全相关信息可储存在中央位置上,由此允许其它设备、组件和应用程序访问该信息。例如,其它安全引擎或计算系统可访问储存的安全相关信息。
在过程600的一个示例中,防病毒安全引擎检测通过特定端口访问网络的重复试图。防病毒安全引擎向事件管理器报告这一信息(如,尝试的访问的日期和事件以及尝试访问的端口)。在该示例中,防病毒安全引擎不负责响应这一访问试图。事件管理器从防病毒引擎接收信息,并确定入侵检测安全引擎和防火墙安全引擎可使用该信息。在接收信息之后,入侵检测安全引擎和防火墙安全引擎可基于接收的 信息调整其操作。例如,入侵检测安全引擎可增加它检测入侵者的频率。另外,防火墙安全引擎可临时禁用尝试访问的端口。由此,通过允许安全引擎基于关于安全相关事件的共享信息调整其操作,提高了主计算机对攻击的总体安全性。
在过程600的另一示例中,弱点安全引擎检测特定的补丁是否已安装在主计算机上。如果未安装补丁,则弱点安全引擎生成指示未安装补丁的事件。如果未安装补丁,则主防火墙安全引擎和行为阻塞安全引擎向事件管理器注册用于通知。当主防火墙安全引擎和行为阻塞安全引擎接收未安装补丁的通知时,安全引擎实施限制未打补丁的应用程序的功能(或防止执行)的规则。
在另一实施例中,系统状态信息在安全模块的各种组件(如,事件管理器和多个安全引擎)中共享。该系统状态信息可由各种数据源提供。示例系统状态信息包括当前网络状态、网络连接是有线还是无线、主计算机正在访问企业网络还是未知网络、以及主计算机配置信息。由此,如果安全引擎标识了特定的系统状态信息,则该标识的信息可在其它安全引擎和主计算机中的其它组件或模块中共享。
在一个具体的实施例中,各种组件收集的系统状态信息可储存在中央位置上,由此提供了其它设备、组件和应用程序对该信息的访问。例如,一个安全引擎收集的系统状态信息可由其它安全引擎、安全模块和计算系统访问。
安全政策更新
如上所述,安全政策可用于描述要由例如安全引擎或安全提供器应用的规则。当对安全政策作出改变时,向各种安全引擎提供更新的规则,并且这些各种安全引擎改变成在基本上同一时间开始使用更新的规则。
除上文参考图1讨论的组件、程序和模块之外,主计算机102从一个或多个源服务器,如服务器104和106接收安全政策。安全政策描述了主计算机102上的各种安全引擎应当如何操作。尽管在图1中仅示出了一个主计算机102,可以理解,多个主计算机102可从同一源设备获取安全政策。
示例源设备包括桌面或工作站计算设备、服务器计算设备、便携式或手持式计算设备、游戏控制台、网络器材、蜂窝电话、个人数字助理(PDA)、网络设备(如,路由器、网关、防火墙、无线接入点等)等等。
主计算机102也可包括政策读取器模块、规则读取器模块、规则组生成器模块和动态规则数据存储。可以理解,这些模块的一个或多个可组合成单个模块,和 /或这些模块的一个或多个可分割成两个或多个模块。
一般地,为更新安全引擎114-118实施的安全政策,政策读取器从源设备获取安全政策。规则组生成器使用新获取的安全规则来为各种安全引擎的每一个生成一组一个或多个规则和相关数据。这些规则组然后被传递到各种安全引擎,并且相关的数据储存在动态规则数据存储中。相关的数据也可传递到安全引擎。在接收该组一个或多个规则之后,每一安全引擎处理该组新规则,准备好开始使用该组新规则。然而,每一安全引擎继续使用其当前规则组,直到被指示改变到新组。规则管理器在从准备好改变到新规则组的每一安全引擎接收指示之后,指示所有安全引擎改变到新规则组。
在某些实施例中,规则管理器协调主计算机102中的安全政策的更新。规则管理器从各种安全引擎接收指示安全引擎已准备好改变到新规则组的指示,并给予安全引擎何时开始使用新规则组的指示。
政策读取器模块从源设备获取新安全政策。政策读取器模块可被配置成以有规律或无规律的间隔检查是否可从源获得新安全规则,或可选地可从某一其它组件(如,规则管理器、源设备或图1中未示出的某一设备)接收它应当从该源获取新安全规则(或检查该源上是否有新安全规则可用)的指示。政策读取器可向源标识政策读取器期望获取的特定安全政策,或可选地可仅从源为主计算机请求最近的安全政策。可作出主计算机使用的当前安全政策和最近的安全政策之间的比较,以确定是否已在主计算机上实施了最近的安全政策。这一比较可由源、政策读取器或可选地某一其它组件作出。
当从源获取新安全政策之后,规则组生成器为不同的安全引擎114-118的每一个生成规则组。当在主计算机102上实施安全政策时,不同的安全引擎可使用不同的规则。例如,一个安全引擎114可以是防火墙,而另一安全引擎116可以是防病毒组件。安全政策可标识对防病毒引擎专用的规则(并且由此防火墙引擎不需要关注它们),并也可标识对防火墙引擎专用的规则(并且由此防病毒引擎不需要关注它们)。
在某些实施例中,安全政策本身是规则及相关数据的列表。安全政策也可包括哪些规则和数据用于哪些安全引擎的指示,或可选地不包括这一指示(如,依赖于主计算机来确定哪些规则用于哪些安全引擎)。安全政策允许设计者具有主计算机的保护中所涉及的所有规则的单个记录或文件,而不需要在不同的记录或文件上 为不同的安全引擎分割规则。
另外,使用本发明描述的技术,可由将对特定攻击进行保护的责任从一个安全引擎转移到另一个的设计者准备新安全政策。例如,对特定类型攻击的保护在一个安全政策中可由防病毒程序实施,但是在新安全政策中改变到由防火墙程序实施。使用本发明描述的技术,设计者可确定该责任中的转移将基本上并发地出现在所有安全引擎中,由此降低了在转移过程中主计算机对攻击的弱点。
规则组生成器基于安全政策标识哪些规则和相关数据(如果有的话)由哪些安全引擎使用。对于每一安全引擎,规则组生成器为该安全引擎生成规则组,并令生成的规则组对该安全引擎可用(如,该规则组可传输或发送到安全引擎、可向安全引擎通知可获取生成的规则组的存储器位置,等等)。可以各种不同的方式执行这一生成。例如,可由规则组生成器在不考虑安全引擎实施的当前规则的情况下生成新规则组。作为另一示例,可修改或改变当前规则组来结合进当前规则组和新规则组之间的任一差异。另外,规则组生成器可仅复制来自安全政策的规则,或可选地,规则组生成器可基于描述该规则的安全政策中的信息生成规则。
在某些实施例中,安全政策标识哪些规则要分发到哪些安全引擎。例如,每一规则可与特定的标签或标识符关联(如,安全引擎1或防病毒引擎等)。规则组生成器可使用这些标识符来为各种安全引擎生成规则组。在替换的实施例中,规则组生成器可推断哪些规则要分发到哪些安全引擎。在其它实施例中,可使用这些技术的组合(如,对于某些规则,安全政策可标识它们要分配给哪些安全引擎,而对于其它规则,安全政策生成器可推断它们将分配给哪些安全政策)。
规则组生成器生成的规则组可采用各种不同形式的任一种。在某些实施例中,规则遵循上文所讨论的“如果-则”结构。采用这一结构,规则定义了特定的条件和对应的特定行动或结果。在规则的实施过程中,如果检测了该特定的条件,则执行对应的特定行动或结果。可由规则定义各种条件的任一个以及对应的结果。特定的条件的示例包括:试图访问特定资源(如,存储器位置、网络地址或端口、其它程序、存储设备上的文件等)、试图向特定位置写入数据(如,向特定的存储器位置、向存储设备上的特定位置等)、试图运行特定的程序、主计算机的当前操作状态的各方面(如,可用资源、运行的程序等)等等。特定结果的示例包括:防止资源被访问、防止数据被写入到特定位置、防止程序被运行、生成检测到规则中的条件的出现的通知(如,在记录中记录其出现、向用户或其它计算机发送消息等)。 特定的结果也可以本质上是许可性的而非防止性的。例如,结果可指示仅当主计算机满足规则中的条件时访问特定的资源或位置,或仅当主计算机满足规则中的条件时运行特定的程序。
在某些实施例中,主计算机102包括动态规则数据存储,它是与安全引擎实施的各种规则关联的数据。在某些实施例中,动态规则数据存储可包括两组数据:一组用于安全引擎实施的当前规则,另一组用于安全引擎要更新来实施的新规则。当接收新安全政策时,规则组生成器用与传递到安全引擎的该组新规则来更新动态规则数据存储。
每一安全引擎包括从规则组生成器接收一组一个或多个规则的规则改变模块。与规则关联的数据可从规则组生成器连同规则一起接收,或可选地,规则改变模块可从动态规则数据获取它所期望的数据。另外,应当注意,上文讨论中,尽管规则组生成器基于安全政策为每一安全引擎生成规则组,可选地,每一安全引擎可接收整个安全政策(或安全政策的大部分),并生成其自己的规则组而非从规则组生成器接收该组。
规则改变模块如所需要的处理该新规则组,以生成实施新政策的新内部规则。处理新规则组来生成新内部规则涉及安全引擎为将新规则组置于使得它们可由安全设备实施的状态中所必需的任何行动。例如,该处理可包括将新规则组转换为内部格式、将规则储存在特定的存储器位置、将规则组织成特定的排列或顺序等等。规则改变模块可以各种方式的任一种生成新规则;规则改变模块可将规则保持在与它们从规则组生成器接收相同的格式,或可选地将规则转换成安全引擎所使用的内部格式。
无论新规则是怎样生成的,每一安全引擎维护着为主计算机实施先前的安全政策(被更新的安全政策)的当前规则组。在生成新规则时,甚至在生成新规则之后,安全引擎继续实施当前规则。安全引擎不开始实施新规则,直到它被指令这么做(如,由规则管理器)。
在规则改变模块完成生成新规则之后,规则改变模块向规则管理器指示它已完成并准备好切换到使用新规则(并由此开始实施新安全政策)。在规则管理器从所有安全引擎接收这一指示之后,规则管理器指令每一安全引擎开始使用新规则。规则管理器延缓指令每一安全引擎开始使用新规则,直到规则管理器从所有安全引擎接收到这种指示。一旦被指令这么做,每一安全引擎便开始使用新规则。一旦安 全引擎开始使用新规则,它可删除先前所使用的规则。
在某些情况下,安全引擎可能在处理新规则时发生故障。在这一情况下,安全引擎向规则管理器返回这一故障指示。可选地,规则管理器可在来自安全引擎的响应上施加时间限制。如果在时间限制内,所有的安全引擎都没有它们已准备好开始使用新规则的指示响应,则规则管理器可假定安全引擎的一个或多个在处理新规则上失败。
当规则管理器标识安全引擎的一个或多个在处理新规则上失败时,规则管理器不指令安全引擎的任一个开始使用新规则。相反,规则管理器发送指示来中止对新规则的改变(这也可被称为回退)。这一中止或回退指示通知每一安全引擎,忽略从规则组生成器接收的新规则以及来得自其处理的任一新规则,并继续使用当前规则。在某些实施例中,安全引擎可响应于这一中止或回退指示,安全地删除它们所生成(或在生成的过程中)的新规则。
在某些实施例中,每一安全引擎在通知规则管理器它准备好使用新规则之前,等候直到它几乎能够确保它可开始使用新规则。换言之,安全引擎延缓向规则管理器通知它已准备好开始使用新规则,直到安全引擎到达处理新规则的某一点上,在该点上,安全引擎实际上不再可能在被指令开始实施那些规则时而无法实施。在某些实施例中,这可通过安全引擎生成新规则组,并维护到它使用哪一规则组(旧规则或新规则)的指针。在生成新规则之后,安全引擎向规则管理器指示,安全引擎已准备好开始使用新规则组。然后,当被指令开始使用新规则组时,安全引擎可仅将其指针仅从旧规则组改变到新规则组。安全引擎几乎可确保它可改变其指针并开始使用新规则。可以理解,“几乎确保”不需要100%地保证失败是完全不可能的。仍可出现将导致失败的某些情况(如,电源丢失或禁止改变指针的病毒攻击)。然而,可以理解,这类失败的机会是很小的。
规则管理器可以各种不同的方式的任一种来指令安全引擎开始使用新规则组(也称为切换到新规则组)。然而,使用的方式应当操作成以在基本上同一时刻通知所有安全引擎,使得所有的安全引擎可在基本上同一时刻(此处也称为基本上并发)开始使用其新规则组。通过令所有安全引擎在基本上同一时刻开始使用其新规则组,降低了由于规则改变而引起的主计算机的弱点。一般地,安全引擎开始使用其新规则组的时间越近,改变到新规则组的过程中的弱点就越小。以下是规则管理器可指令安全引擎在基本上同一时刻开始使用其新规则组的方法的某些示例。
规则管理器可指令安全引擎开始使用新规则组的一个方法是使用可跨越所有安全引擎一次被激发的事件对象。例如,在从规则组生成器接收新规则之后,每一安全引擎设置内部标志以在每次访问规则时(在其保护主计算机的正常操作中)轮询特定的事件。规则管理器然后可通过激发该事件(安全引擎所轮询的同一个)指令安全引擎开始使用其新规则组。因此,在事件被激发之后,任一随后的事件轮询将反映该事件已被激发,并且由此通知轮询安全引擎应当使用新规则。例如,响应于检测事件已被激发,安全引擎中的指针可改变到指向新规则组。
除轮询事件之外,也可由等候事件的安全引擎运行线程。当激发事件时,该线程检测该激发,使得向安全引擎通知应当使用新规则组。例如,响应于线程检测事件已激发,安全引擎中的指针可改变到指向新规则组。
一旦事件被激发,且使用了新规则组,安全引擎可停止轮询事件。另外,如果服务于事件的线程由安全引擎运行,该线程可被终止。
规则管理器可指令安全引擎开始使用新规则组的另一方法是调用每一安全引擎所展现的功能(如,“切换”功能)。调用安全引擎的这一功能指令该安全引擎开始使用新规则组。例如,响应于调用安全引擎上的这一功能,安全引擎将其指针改变到指向新规则组。
规则管理器可指令安全引擎开始使用新规则组的另一方法是向每一安全引擎通知每一安全引擎可访问的共享数据结构。规则管理器可在不同的时刻向每一安全引擎通知共享数据结构,如通过调用安全引擎上的功能(如,“标识数据结构功能”),或通过在新规则被传递到安全引擎时标识通向数据结构。共享数据结构可采用各种不同形式的任一种,如存储器中的位置(如,随机存取存储器(RAM)或诸如闪存等非易失存储器)、储存在本地或远程存储设备上的文件等等。
每一安全引擎检查该共享数据结构(如,每次在访问规则时(在保护主计算机的正常操作中))来确定其值。规则管理器可通过改变储存在共享数据结构中的值来指令每一安全引擎开始使用新规则组。例如,共享数据结构最初可储存“先前”值或0值来指示使用当前规则组,并且当切换来开始使用新规则组时,规则管理器可向共享数据结构写入“新”或“切换”值或1值来指示要使用新规则组。
如上所述,动态规则数据存储储存与安全引擎实施的各种规则关联的数据。由此,当更新主计算机来开始实施新政策时,安全引擎所使用的数据也可改变。该数据也可在主计算机的操作过程中改变(如,安全引擎可稍后向动态规则数据存储 请求数据或将数据储存到其中)。为令正确的数据对安全引擎可用,当更新安全政策时,动态规则数据存储可以与安全引擎相同的方式操作。即,将维护两组规则数据-第一组将在切换之前使用,第二组将在切换之后使用。新数据将储存在动态规则数据存储中,并且动态规则数据存储将在准备好开始使用新数据组时向规则管理器返回指示。动态规则数据存储然后继续使用前一组数据,直到从规则管理器接收开始使用新数据组的指示。
应当注意,主计算机中的各种组件可在主计算机上执行的同一应用程序进程中实现。例如,政策读取器、规则管理器、动态规则数据、规则组生成器和安全引擎都可以是同一应用程序进程的部分。
可选地,主计算机中的不同组件可以跨越在主计算机上执行的两个或多个应用程序进程实现。例如,一个或多个安全引擎可运行在与其它安全引擎分离、并与政策读取器、规则管理器、动态规则数据和规则组生成器分离的进程中运行。允许不同的组件在不同的应用程序进程中运行允许,例如,不同的开发者设计不同的插入式组件(如,不同的插入式安全引擎)来增强主计算机的安全性。这些附加的插件组件将被升级来以与非插入式组件相同的方式实施新政策。
当跨越多个应用程序进程分割组件时,使用一种机制来允许各种组件彼此通信。例如,这一通信允许新规则组和数据被传递到不同进程中的安全引擎、数据被从不同进程中的安全引擎传递到动态规则数据、开始使用新规则组的指令被传递到不同进程中的安全引擎等等。作为示例,此处讨论的组件可被实现为组件对象模型(COM)组件。关于组件对象模型体系结构的其它信息可从华盛顿州雷蒙德市的微软公司获得。
应当注意,在此处的讨论中,由规则管理器指令每一安全引擎开始使用其新规则组。可选地,该指令可以仍允许每一安全引擎基本上并发地开始使用新规则组的其它方式来实现。例如,可使用一种而是指示每一安全引擎开始使用新规则组的控制机制可跨各种安全引擎分发,而不是使用规则管理器。例如,这可通过每一安全引擎通知其它安全引擎它以准备好开始使用新规则组,而没有一个安全引擎开始使用其新规则组,直到所有的安全引擎向所有的其它安全引擎通知了它们已准备好开始使用新规则组为止来实现。
图7所示是用于更新安全政策的示例过程700的流程图。过程700由协调主计算机上的安全政策的更新的组件来实现,如本发明所讨论的规则管理器。过程 700可以软件、硬件、固件或其组合来实现。
最初,获取要在设备上实施的新政策(块702)。该政策可以“拉”方式来获取,其中,主计算机启动对新政策来源的访问来检查是否可从该来源获得新政策。可选地可以“推”方式获取新政策,其中,向主计算机通知(如,发送消息或其它指示)新安全政策的可用性或新安全政策本身。
无论如何获取新政策,一旦获取了新政策,向每一安全引擎提供一组新规则和/或与用于新政策的规则关联的数据(块704)。如上所述,可基于用于每一安全引擎的新政策生成不同的规则和/或数据组。
然后从安全引擎接收返回值(块706)。在某些实施例中,每一安全引擎向实现过程700的组件返回表示“OK”的值或表示“失败”的值。当安全引擎返回表示“OK”的值时,它指示安全引擎已处理了它所接收的规则和/或数据组,并已准备好开始使用新规则和/或数据组。这也可被称为安全引擎已准备好实现新规则和/或数据组。例如,对安全引擎所有所剩下的是将其指针改变到指向新规则组而非前一规则组。然而,当安全引擎返回表示“失败”的值时,它指示安全引擎无法(或没有)处理该规则和/或数据组,并且安全引擎无法开始使用新规则和/或数据组。另外,如上文所讨论的,可在来自安全引擎的响应上施加时间限制也称为超时值或时间阈值)-如果在该时间限制内安全引擎未使用表示“OK”或“失败”的值响应,则实现过程700的组件将安全引擎作为它返回了表示“失败”的值来处理。
可以理解,规则的发送和响应的接收(块704和706)是异步过程。不同的安全引擎可采用不同的时间量来处理它们所接收的规则和/或数据,并且过程700径直等到所有的安全引擎完成其各自的处理(直到所施加的任一可任选时间限制)。
过程700基于所有安全引擎是否返回表示“OK”的值来前进(块708)。如果所有的安全引擎返回表示“OK”的值,则所有的安全引擎都准备好开始使用新规则组,因此向所有的安全引擎指示开始使用新规则组(块710)。
然而,如果至少一个安全引擎未返回表示“OK”的值,则向每一安全引擎发出回退调用(块712)。该回退调用本质上中止了更新过程,因此没有一个安全引擎将开始使用新规则组(即使是那些返回了表示“OK”的值的安全引擎)。
图8所示是用于更新安全政策的另一示例过程800的流程图。过程800由设备上的安全引擎实现,如图1的主计算机上的安全引擎114-118。过程800可以软件、硬件、固件或其组合实现。
最初,接收一组新规则和/或数据用于要实施的新政策(块802)。如上所述,该规则和数据可基本上在同一时刻接收,或可选地,安全引擎可如需要地从数据存储获取数据(如,本发明所讨论的动态规则数据存储)。然后处理新规则和/或数据(块804)。新规则和/或数据的处理为安全引擎创建了在实施新安全政策中所遵循(如,以安全引擎的内部格式)的内部规则组。
过程800基于规则处理是否成功来前进(块806)。如果安全引擎完成了它所接收的规则和/或数据组的处理,并准备好开始使用新的规则和/或数据组(如,对安全引擎所剩下的只是将其指针改变到指向新规则组而非前一规则组),则处理是成功的。否则,处理是不成功的。如果处理成功,则返回表示“OK”的值(块808)。然而,如果处理不成功,则返回表示“失败”的值(块810)。块808和810的返回值返回到在主计算机上协调安全政策的更新的组件(如,本发明上文所讨论的规则管理器)。
不论是否返回了值,安全引擎继续使用先前或旧的规则组,直到它被指示回退或开始使用新规则(块812)。如果被指令开始使用新规则,则安全引擎开始使用新规则和/或数据(块814),如通过将其指针从其前一规则组改变成其新规则组。开始使用新规则的指令可由安全引擎以上文讨论的各种方式的任一种接收。
然而,如果被指令回退,则安全引擎丢弃处理新规则和/或数据的任何结果(块816)。不论安全引擎是否完成了它所接收的新规则组的处理,这种丢弃皆可执行。
由此,如图8中可见到的,安全引擎继续使用其前一规则组,直到接收切换到新规则的指令。在接收到这一指令时,安全引擎已准备好开始使用新规则,并且需要很少的时间来发生切换。例如,安全引擎仅需将其指针切换到指向其新新规则组而非其前一规则组。
应用程序接口(API)
诸如上文参考图1所讨论的API 124等API准许安全政策和事件信息在主计算机中的各种组件和程序(如,安全引擎)内通信。在一个实施例中,使用组件对象模型(COM)来定义API。该API支持用于加载并卸载安全引擎、向安全引擎发送安全政策、将安全政策总的变化传递到感兴趣的安全引擎、允许主机用户在决策制定时刻与安全引擎进行交互以允许或不允许某些政策专用行为以及安全引擎的集中式配置管理的方法。
本发明所讨论的系统和过程令计算系统的安全性能够通过将安全政策的目标定为特定的计算系统或计算系统组来进行中央管理。另外,这些系统和过程收集并相关由那些计算系统或其它数据源生成的事件和其它信息,如安全相关信息。
在一个实施例中,该接口支持客户机通过安全、已验证协议对安全政策和事件数据库的访问。该接口准许各种组件或应用程序和一个或多个安全引擎之间的通信。该接口也定义安全引擎如何彼此并与其它设备、组件、服务或程序进行通信。
在一个实施例中,使用自定义加载器来降低攻击者通过改变COM注册表值将安全引擎切换到攻击者自己的代码的可能性,该接口被定义为COM接口。
在一个示例实施例中,由该API支持的功能调用是:
代理-安全引擎功能调用
·Initialize(初始化)
·Shutdown(关闭)
·PreparePolicy(准备政策)
·CommitPolicy(提交政策)
·RollbackPolicy(回退政策)
·WriteData(写数据)
·WriteConfig(写配置)
这七个功能被称为“ISecurityEngine接口”。
安全引擎-代理功能调用
·ReadAndRegisterNotifyData(读并注册通知数据)
·WriteSEData(写安全引擎数据)
·UnregisterNotifyData(取消通知数据的注册)
·GetDataAttribute(获取数据属性)
·ReadAndRegisterNotifyConfig(读并注册通知配置)
·UnRegisterNotifyConfig(取消通知配置的注册)
·QueryUser(查询用户)
·Complete(完成)
上述前七个功能调用被称为“ISecurityAgent接口”,最后一个功能调用(Complete)被称为“IAgentCallback接口”。
功能调用也可被称为“调用”、“方法”、“功能”或“服务”。关于这些功能调用的细节在下文提供。替换实施例可使用另外的功能调用和/或可省略本发明所讨论的一个或多个功能调用。
在一个实施例中,代理,如事件管理器或安全代理,通过API与安全引擎进行通信。代理也可被称为“管理器”。在具体的实施例中,当API调用仍未完结时,代理将不调用特定的安全引擎。该规则对于异步API有例外。在这些情况下,许可的代理行动在以下状态表中定义。
Initialize功能调用
该方法对代理所知的每一安全引擎调用一次。该方法在代理启动过程中调用。Initialize功能调用加载安全引擎并允许它执行初始化操作。
该方法由代理对每一安全引擎依次异步地调用,并且当它们接收时处理回叫。代理将在继续之前等待所有回叫完成。
该方法被定义如下:
HRESULT Initialize(
[in]ISecurityAgent*pAgent.
[in]IAgentCallback*pCallback);
pAgent是可由安全引擎用于回叫到代理的COM接口。
pCallback是以下定义的回叫对象。
如果Initialize功能调用失败,或它在合理的时间内未返回,则调用Shutdown。由于可能的竞争条件,安全引擎在Initialize返回之前处理Shutdown。
Shutdown功能调用
该方法对调用来由代理Initialize的每一安全引擎调用一次。该方法允许安全引擎开始其关闭处理。即使Initialize失败,代理调用Shutdown来允许安全引擎关闭分配的任何资源。例如,该方法允许安全引擎执行不能在DLL_PROCESS_DETACH处理中执行的复杂关闭。
由于该方法可花费相当大量的时间来完成,它使用一回叫对象来指示它已完成了关闭处理。当该方法作为进程内(in-process)系统关闭的结果来调用时,处 理完成可用的时间是有限的,并且可在回叫完成之前由系统终止代理。
该方法定义如下:
typedef enum tagSHUTDOWN_TYPE
{
SHUTDOWN_NORMAL=0,
SHUTDOW_SYSTEM
}SHUTDOWN_TYPE;
HRESULT Shutdown(
[in]SHUTDOWN_TYPE eType,
[in]IAgentCallback*pCallback);
eType是SHUTDOWN_NORMAL或SHUTDOWN_SYSTEM的枚举。
pCallback是下文所定义的回叫对象。
在作出Shutdown回叫之后(或出现超时)将出现DLL卸载(DLL Unload)。由于可异步地作出回叫,代理可能需要在继续卸载安全引擎DLL之前等候作出回叫的线程退出。这允许回叫栈帧展开至将被卸载的DLL外部的一点,并避免进程的异常。如果在Shutdown调用过程中作出回叫,则该附加的步骤不是必需的,因为假定安全引擎线程要关闭。
错误被记录为可操作事件或被忽略,因为无论如何代理都将要关闭。
PreparePolicy功能调用
该方法由代理在接收到经更新的政策时调用。所得的政策被合并,并且构建每一RuleSet(规则组)来传递到正确的安全引擎。XML数据作为可由MSXML(微软XML)使用的IStream对象传递-DOM(文档对象模型)或SAX(用于XML的简单API)-来读取XML数据。该方法定义如下:
HRESULT PreparePolicy(
[in]IStream*pstreamRuleset,
[in]IAgentCallback*pCallback);
pstreamRuleset是允许读XML规则组的到Stream(流)对象的COM接口。可假定该IStream对机器是本地的,并且不跨网络访问数据。
pCallback是下文定义的回叫对象。
如果调用返回错误,则假定安全引擎继续运行先前应用的政策(可以是启动时政策)。代理为其PreparePolicy成功的所有安全引擎调用RollbackPolicy,但是不对任一失败的安全引擎调用。该过程在安全引擎返回错误即刻开始。另外,如果PreparePolicy回叫不以及时的方式到达,则代理将其作为该安全引擎的部分上的失败来处理。因此,安全引擎假定代理可在PreparePolicy调用返回之前调用RollbackPolicy。
CommitPolicy功能调用
该方法由代理在所有安全引擎返回PreparePolicy调用成功时调用。该调用促使它们切换到新政策。该方法定义如下:
HRESULT CommitPolicy(void);
该调用是同步的,并且代理将等一个调用完成后再移动到下一调用。在一个实施例中,预期会使政策更新失败的所有工作都在PreparePolicy调用中执行,并且该调用是从旧政策数据结构到新政策数据结构的简单切换。
CommitPolicy方法返回灾难性的失败,如安全引擎的用户和内核部分之间的通信的失败。当该调用的确返回错误时,代理试图重加载先前的政策并重应用该政策。由于有错误,这可能不起作用,且政策实施将处于未知状态。如果CommitPolicy失败,可由代理记录可操作的错误。
RollbackPolicy功能调用
该方法由代理在安全引擎返回其PreparePolicy调用上的失败时调用。该调用促使代理调用所有其它安全引擎来中止更新,并还原到实施中的政策。该方法定义如下:
HRESULT RollbackPolicy(void);
该调用是异步的,因为预期安全引擎的回退处理是广泛的,粗略地类似于PreparePolicy的处理。当安全引擎完成处理该调用时,安全引擎调用Complete来指示回退状态。
如果政策回退,则由代理取消在PreparePolicy之后注册的任何数据-系统回 退到每一安全引擎预订的前一数据组。鉴于此原因,安全引擎不丢弃其处于孤独状态的数据的本地副本,直到它们从代理接收CommitPolicy调用。代理负责处理政策回退过程中来自安全引擎的ReadAndRegisterData调用到达的定时窗。
RollbackPolicy和Complete回叫可返回灾难性失败。预期安全引擎实现PreparePolicy,使得回退可被支持。当RollbackPolicy失败时可由代理记录可操作错误。在这发生之后,不能由安全引擎和任一共同操作的安全引擎作出关于政策实施的任何假设。未来的政策将继续发送到安全引擎。
WriteData功能调用
当安全引擎先前调用ReadAndRegisterNotifyData时的数据片断有了变化时,该方法由代理调用。其参数类似于ReadAndRegisterNotifyData调用,除了其存储器所有权属于代理之外,因此安全引擎在处理它之后不可删除该项目。
当安全引擎在从代理接收新政策的过程中时,即,在PreparePolicy和CommitPolicy/RollbackPolicy的调用之间,不调用WriteData。一旦新政策被提交或被回退,由代理检测到的此时的任何数据变化被分批并向下发送到感兴趣的安全引擎。待决更新的队列由代理优化,以尽可能地避免对同一数据片断传递多个连续的变化。WriteData方法被定义如下:
#define DF_DYNAMIC 0x1
#define DF_COLLECTION 0x2
#define DF_BOOLEAN 0x4
#define DF_PERSISTED 0x8
HRESULT WriteData(
[in]REFGUID guidDataID,
[in]DWORD dwFlags,
[in]DWORD dwDataSize,
[in]VARIANT varData,
[in]DWORD dwKeySize,
[in]byte*pbKeyValue);
当向安全引擎传递回与前一查询关联的上下文时,使用用于传递Key(dwKeySize,pbKeyValue)的参数。安全引擎使用该上下文以将查询的结果与向代理发出的前一QueryUser调用相关。该附加的数据是必需的,因为给定的查询可 对同一规则中的不同上下文多次出现-例如,询问用户应用程序X是否被允许修改注册表值,然后稍后询问关于应用程序Y的同一问题。
错误被记录为可操作事件,或者被忽略。同一数据片断的未来更新将仍被通知到失败的安全引擎。如果安全引擎希望避免这一通知,它可为该数据片断调用UnRegisterNotifyData。
WriteConfig功能调用
该方法允许代理向感兴趣的安全引擎分发配置数据。一旦安全引擎使用ReadAndRegisterNotifyConfig方法读取了配置数据,将由代理调用该方法向它通知对该数据的变化。该方法定义如下:
HRESULT WriteConfig(
[in]WCHAR*wszDataName,
[in]VARIANT varData);
wszDataName是要写入的配置数据项目的文本名,并且是在该数据的注册表中使用的名字。
varData是包含该名字所表示的单个数据项目的变量结构。该数据可以有各种类型,取决于注册表中该数据的类型是什么。代理不作类型检查-依照上下文,期望安全引擎在需要时检查数据类型。
错误被记录为可操作事件,或者被忽略。对同一配置参数的未来更新仍被通知到失败的安全引擎。如果安全引擎希望防止这一通知,则它应当为该数据片断调用UnRegisterNotifyConfig。
当来自代理的API调用尚待决之时,特定的安全引擎通常不调用该代理。代理将其作为错误处理并忽略第二次调用。
ReadAndRegisterNotifyData功能调用
该方法允许安全引擎从动态规则数据子系统读数据用于其规则处理。一旦安全引擎读取了该数据,将由代理调用IScurityEngine接口的WriteData方法来向其通知改变。该方法定义如下:
HRESULT ReadAndRegisterNotifyData(
[in]REFGUID guidDataID,
[out]SWORD*pdwFlags,
[out]DWORD*pdwDataSuze,
[out]VARIANT*pvarData);
guidDataID是要检索的数据项目的GUID。
pdwFlags是描述数据项目的一组标志。示例值可以是DYNAMIC(动态)或STATIC(静态),以及COLLECTION(集合)或BOOLEAN(布尔)。
pdwDataSize是变量数据中返回的数组中数据项目的总大小。
pvarData是包含到数据项目的数组的引用的变量结构,或用于布尔数据类型的数据项目值。该变量在输入时为空。
安全引擎要求不再在政策内的数据是错误。代理将对任一错误生成可操作事件。在这一情况下,无法保证安全引擎和代理具有被影响的数据的一致视图。
WriteSEData功能调用
该方法由安全引擎在数据片断改变安全引擎所拥有并发布(用于持久),或由其它安全引擎使用时调用。其参数类似于WriteData调用,除其存储器所有权属于安全引擎外,因此代理不在处理之后删除该项目。该方法定义如下:
HRESULT WriteSEData(
[in]REFGUID guidDataID,
[in]DWORD dwDataSize,
[in]VARIANT varData);
该方法可在任一线程的任一时刻调用,包括当另一WriteSEData调用待决时。如需要,确保串行化是代理的责任。
数据项目的所有者由定义所有者的GUID在集合定义内标识。这可以是安全引擎的GUID或代理的标识符,或可能是另一消费者的标识符。
如果安全引擎定义它所拥有的集合,假定将通过该API向代理发布该数据。
代理将任一错误记录为可操作事件。安全引擎可决定在错误之后是否继续提供更新。不保证在错误之后数据的代理版本与安全引擎的视图一致。
UnRegisterNotifyData功能调用
该方法允许安全引擎对不再感兴趣的数据项目停止接收WriteData通知。该方法定义如下:
HRESULT UnRegisterNotifyData(
[in]REFGUID guidDataID);
guidDataID是标识安全引擎在变化通知中不再感兴趣的数据项目的GUID。安全引擎可指示它希望通过传递空(Null)GUID{00000000-0000-0000-000000000000}来取消所有当前的通知的注册。
代理将任一错误记录为可操作事件。这包括数据对代理未知的情况,以帮助诊断政策管理问题。
GetDataAttribute功能调用
该方法允许安全引擎检索与数据项目关联的具体属性。属性名与政策XML中的名字相同,包括文本的大小写。属性值仅可在政策改变时改变,因此该数据不需要通知系统。该方法定义如下:
HRESULT GetDataAttribute(
[in]REFGUID guidDataID,
[in]WCHAR*wszAttributeName,
[out]VARIANT*pvarAttributeValue);
该方法可在任一时刻调用。
guidDataID是标识为检索属性的数据项目的GUID。
wszAttributeName是属性名,如它在政策文档中的完全一样。
pvarAttributeValue是作为变量的属性值。可应用正常的输出参数分配规则。代理用该信息分配新变量,并且稍后释放它是调用者的责任。
ReadAndRegisterNotifyConfi功能调用
该方法允许安全引擎从代理读配置数据。一旦安全引擎读取了配置数据,将 由代理调用IScurityEngine接口的WriteConfig方法来向其通知该数据的改变。
代理的配置数据及其主存(host)的安全引擎可位于一公共根下。该方法定义如下:
HRESULT ReadAndRegisterNotifyConfig(
[in]WCHAR*wszDataName,
[out]VARIANT*pvarData);
wszDataName是要检索的配置数据项目的文本名,并且是该数据的注册表内使用的名字。这标识了与公共代理根相关的个别项目。不需要前导的‘\’字符。该值是大小写不敏感的,但是空格字符是重要的。
pvarData是包含名字所标识的单个数据项目的变量结构。该数据可以是各种类型,取决于该数据在注册表中是什么类型。代理不作类型检查-依照上下文,期望安全引擎在需要时检查数据类型。
代理将任一错误记录为可操作事件。
UnRegisterNotifyConfig功能调用
该方法允许安全代理对它不再感兴趣的数据项目停止接收WriteConfig通知。该方法定义如下:
HRESULT UnRegisterNotifyConfig(
[in]WCHAR*wszDataName);
wszDataName是标识安全引擎在变化通知中不再感兴趣的配置数据项目的文本名。
代理将任一错误记录为可操作事件。这包括数据对代理未知的情况,以帮助诊断配置管理问题。
QueryUser功能调用
该方法允许安全引擎要求代理向用户显示具体的消息,返回用户选择的回答。代理也可高速缓存该回答,并在代理重起后持久保存该值。向用户呈现的问题可包含关于用户为何询问该问题的信息。该信息可由安全代理提供,并可在每次调用该 方法时不同。代理如何确定该问题在之前是否已提出过及答案是什么等由安全引擎提供的键入信息(Key Information)来确定。
该调用立即返回到安全引擎。安全引擎然后挂起触发该查询的会话/线程的操作,直到向其通知响应。这在用户键入响应或当查询超时发生。超时处理由代理处理。在这一点上,代理用键入或默认的响应更新相关的数据项目,并用其关联的上下文向安全引擎通知结果。
由于获取对这一查询的响应的时间是至关重要的,该API可在任一时刻由实施需要发出查询的规则的安全引擎调用。该方法定义如下:
HRESULT QueryUser(
[in]REFGUID guidQueryItem,
[in]DWORD dwKeySize,
[in]byte*pbKeyValue,
[in]SAFEARRAY(VARIANT)pvarQueryParams);
guidQueryItem是包含用于向用户提出问题并提供该问题的答案的基本串的数据项目的GUID。
dwKeySize是关键值的长度,以字节计算。
pbKeyValue是为该查询定义唯一关键字的字节组。
pvarQueryParams是包含代替到向用户显示的查询文本中的查询参数的变量安全数组(Safearray of Variants)。参数的顺序和句法由QueryUser行动所关联的规则类型定义。
如果数据项目是不可定义的,则代理返回错误。执行查询中的错误将被记录为可操作时间。在这一情况下,向安全引擎返回默认行动。
Complete功能调用
该方法向代理通知安全引擎已完成与从代理到该安全引擎的先前的异步调用相关的处理。尽管特定的安全引擎可潜在地令一个以上来自代理的异步调用未决,代理为每一安全引擎管理内部状态,使得特定Complete回叫的上下文无歧义。该方法定义如下:
HRESULT Complete(
[in]HRESULT hrCompletionCode);
hrCompletionCode是代理先前对该安全引擎作出的异步调用的返回码。
接口使用
下文描述了这些API如何用于与一个或多个安全引擎交互上的示例限制。
在特定的时刻,安全引擎处于关于其与代理的交互的某一状态。以下列表标识了可能的安全引擎状态。
状态 |
定义 |
Pending_Initialize(初始化待决) |
安全引擎DLL被加载但是尚未收到API调用。 这一点上的政策状态取决于安全引擎-NSE 具有启动时政策,行为阻塞没有,直到由代理 向其给予规则。 |
Initializing(初始化) |
已调用Initialize但未完成 |
Running(运行) |
安全引擎已回叫代理,告诉它已成功初始化, 并实施(最初)启动时或(在随后的 CommitPolicy)代理所提供的政策 |
Preparing_Policy(准备政策) |
调用了PreparePolicy但未发生回叫 |
Policy_Prepared(政策准备好) |
以成功返回码完成PreparePolicy回叫,等候 CommitPolicy调用 |
Policy_Rollback(政策回退) |
安全引擎调用RollbackPolicy,处理回退请求 |
Shutting_Down(正在关闭) |
调用Shutdown但未完成 |
Pending_Termination(终止待决) |
关闭完成,等候进程终止 |
代理和安全引擎之间的准许交互可被化为一组表,定义当安全引擎在特定状态中时可由每一实体调用的API,以及安全引擎需要采取什么状态变化或其它行动作为结果。假定代理的操作状态是不重要的-安全引擎可假定当安全引擎被加载到存储器时,它在所有时刻保持在正常操作。
该状态表覆盖了安全引擎的生命周期的以下阶段:
·初始化
·来自代理的更新政策
·关闭
这些表中未覆盖的API调用和安全引擎状态的任一组合可被认为是API的错误使用。避免这一错误使用是API调用者的责任。
以下状态表定义了在安全引擎初始化过程中API的准许序列,以及依照来自API的输入的安全引擎状态变化。对未作为与安全引擎初始化关联的状态列表的准许输入列出的任一API的调用意味着该调用实体部分上的协议错误。
安全引擎状态代理API调用 |
初始化待决 |
初始化 |
Initialize |
正在初始化 |
错误 |
Shutdown |
错误 |
终止待决 |
WriteConfig |
错误 |
OK |
安全引擎API调用 |
|
|
Complete(OK) |
错误 |
运行(无政策) |
Complete(失败) |
错误 |
终止待决 |
ReadAndRegisterNotifyConfig |
错误 |
OK |
以下状态表定义了政策更新过程中准许的API序列,以及关联的安全引擎状态变化。对未作为与政策更新关联的状态列表的准许输入列出的任一API的调用意味着该调用实体部分的协议错误。
安全引擎状态代理API调用 |
运行 |
准备政策 |
PreparePolicy |
准备政策 |
错误 |
WriteConfig |
OK |
OK |
安全引擎API调用 |
|
|
Complete(OK) |
错误 |
政策准备好 |
Complete(失败) |
错误 |
运行(旧政策) |
ReadAndRegisterNotifyConfig |
OK |
OK |
ReadAndRegisterNotifyData |
OK |
OK |
CommitPolicy |
运行(新政策) |
RollbackPolicy |
政策回退(旧政策) |
安全引擎API调用 |
|
Complete(OK) |
错误 |
Complete(失败) |
错误 |
ReadAndRegisterConfig |
OK |
ReadAndRegisterData |
OK |
考虑多个主存的安全引擎,下文描述了总体政策更新序列的一个示例。
1.调用每一安全引擎的PreparePolicy。
2.代理等候每一安全引擎成功或失败地调用Complete。
3.如果任一安全引擎报告失败,每一其它安全引擎将调用其RollbackPolicy方法。
4.如果没有安全引擎报告失败,则对每一安全引擎调用CommitPolicy方法。
5.如果在调用任一CommitPolicy方法之前发现另一失败,或者如果必须Shutdown,则对每一安全引擎调用RollbackPolicy方法。
以下状态表定义了安全引擎关闭过程中准许的API序列,以及依照来自代理的输入的安全引擎状态变化。对未作为与安全引擎关闭关联的状态列表的准许输入列出的任一API的调用意味着调用实体部分的协议错误。
安全引擎状态代理API调用 |
初始化、运行、准备政 策、政策准备好、政策 回退 |
关闭 |
Shutdown |
正在关闭 |
错误 |
安全引擎API调用 |
|
|
Complete |
错误 |
终止待决 |
以下列出了代理所支持的示例集合类型,以及关于每一集合如何作为动态数 据传递通过ReadAndRegisterNotifyData和WriteData方法调用的描述。
可通过传递单个BSTR串,或将无符号整数包装为LONG或LONGLONG变体类型,来处理以下讨论的许多数据项目。不容易适合这一模型的那些项目是:DirecrotySet(目录组)、ProtocolSet(协议组)和IPv4AddressSet(IPv4地址组)。对于这些类型的每一个,建议一种将数据包装成BSTR串的包装系统,以允许SafeArray(安全数组)中的建议传输。
FileSet(文件组)
对每一项目传递的数据“
文件名-串
实现:
BSTR
DirectorySet(目录组)
对每一项目传递的数据:
目录名-串
递归-标志
实现:
包装的BSTR -“递归标志:串”
递归标志是单个字符-
‘R’-递归
‘F’-单调
RegistrySet(注册表组)
为每一项目传递的数据:
注册表键名-串
实现:
包装的BSTR -“递归标志:串”
递归标志是单个字符-
‘R’-递归
‘F’-单调
Protocol(协议)
为每一项目传递的数据:
初级/次级-串或枚举
IP类型-串或枚举
方向-传或枚举
端口或端口范围-一个或两个整型(16位、无符号整数)实现:
包装的LONGLONG:
1字节-初级/次级
1字节-IP类型TCP/UDP
1字节-方向入/出/双向
1字节-未使用
2字节-端口范围末端(或零)
2字节-端口范围始端(或端口)
ProcessSet(进程组)
为每一项目传递的数据:
进程名或路径-串
实现:
BSTR
NetworkPortSet(网络端口组)
为每一项目传递的数据:
端口或端口范围-一个或两个整数(16位、无符号整数)
实现:
包装的LONG:开始=低字,结束=高字。如果不是端口范围,则高字为零。
NetworkIPv4AddressSet(网络IPv4地址组)
为每一项目传递的数据:
以下之一:
IPv4地址-串(可包含通配符)
IPv4地址范围-2个串
FQDN-串
主机名-串
实现:
包装的BSTR:“T:串1:串2”
T-类型-1字符用于地址、地址范围、主机名或FQDN
串1-地址、起始地址、主机名或FQDN
串2-地址范围的结束地址
UserSet(用户组)
为每一项目传递的数据:
用户账号名-串
实现:
BSTR
UserGroupSet(用户组集)
为每一项目传递的数据:
用户组名-串
实现:
BSTR
FileOpSet(文件操作组)
为每一项目传递的数据:
文件操作-串(或枚举)
实现:
BSTR
DirOpSet(目录操作组)
为每一项目传递的数据:
目录操作-串(或枚举)
实现:
BSTR
ProcessOpSet(进程操作组)
为每一项目传递的数据:
进程操作-串(或枚举)
实现:
BSTR
RegKeyOpSet(注册表项组)
为每一项目传递的数据:
注册表键操作-串(或枚举)
实现:
BSTR
RegValueOpSet(注册表值组)
为每一项目传递的数据:
注册表值操作-串(或枚举)
实现:
BSTR
UserOpSet(用户操作组)
为每一项目传递的数据:
用户账号操作-串(或枚举)
实现:
BSTR
UserGroupOpSet(用户组操作组)
为每一项目传递的数据:
用户组操作-串(或枚举)
实现:
BSTR
JobOpSet(作业操作组)
为每一项目传递的数据:
作业操作-串(或枚举)
实现:
BSTR
Generic(通用)
为每一项目传递的数据:
值-串
实现:
BSTR
QuerySet(查询组)
对于安全引擎,QuerySet看似包含对用户的查询结果的单个项目集合。关联的上下文作为单独的参数传递到安全引擎。安全引擎通常不需要QuerySet的内部结构,仅上下文和查询结果需要。
Boolean(boolDefine)(布尔)
为单个项目传递的数据:
布尔-真或假
实现:
LONG -假=0,真=1
图9示出了可用于实现本发明描述的技术的的通用计算系统环境900。计算机环境900仅为合适的计算环境的一个示例,并非建议对计算机和网络体系结构的使用或功能的范围的局限。也不应将计算机环境900解释为对示例性计算机环境900中示出的任一组件或其组合具有依赖或需求。
计算机环境900包括以常规计算机902形式的通用计算装置。可由计算机902执行一个或多个媒体播放器应用程序。计算机902的组件可包括但不限于,一个或多个处理器或处理单元904(可任选地包括密码处理器或协处理器)、系统存储器906以及将包括处理器904的各类系统组件耦合至系统存储器906的系统总线908。
系统总线908可以是若干种总线结构类型的任一种,包括存储器总线或存储器控制器、点对点连接、交换光纤、外围总线、加速图形端口以及使用各类总线结构的处理器或局部总线。作为示例,这类结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强ISA(EISA)总线、视频电子技术标准协会(VESA)局部总线以及外围部件互连(PCI)总线,也称为Mezzanine总线。
计算机902通常包括各种计算机可读媒质。计算机可读媒质可以是可由计算机110访问的任一可用媒质,包括易失和非易失媒质、可移动和不可移动媒质。
系统存储器906包括以易失存储器形式的计算机存储媒质,如随机存取存储器(RAM)910,和/或非易失存储器形式的计算机存储媒质,如只读存储器(ROM)912。基本输入/输出系统(BIOS)914包括如在启动时帮助在计算机902内的元件之间传输信息的基本例程,通常储存在ROM 912中。RAM 910通常包含处理单元904立即可访问或者当前正在操作的数据和/或程序模块。
计算机902也可包括其它可移动/不可移动、易失/非易失计算机存储媒质。作为示例,图9示出了对不可移动、非易失磁媒质(未示出)进行读写的硬盘驱动器916、对可移动、非易失磁盘920(如,“软盘”)进行读写的磁盘驱动器918以及对可移动、非易失光盘924,如CD-ROM、DVD-ROM或其它光媒质进行读写的光盘驱动器922。硬盘驱动器916、磁盘驱动器918以及光盘驱动器922的每一个通过一个或多个数据媒质接口925连接至系统总线908。可选地,硬盘驱动器916、磁盘驱动器918和光盘驱动器922可通过一个或多个接口(未示出)连接至系统总线908。
盘驱动器及其相关的计算机可读媒质为计算机902提供了计算机可读指令、数据结构、程序模块和其它数据的非易失存储。尽管示例示出了硬盘916、可移动 磁盘920以及可移动光盘924,可以理解,也可以使用可储存可由计算机访问的数据的其它类型的计算机可读媒质,如盒式磁带或其它磁存储设备、闪存卡、CD-ROM、数字多功能盘(DVD)或其它光存储、随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)等等,来实现示例计算系统和环境。
任意数量的程序模块可储存在硬盘916、磁盘920、光盘924、ROM 912和/或RAM 910中,作为示例,包括操作系统926、一个或多个应用程序928、其它程序模块930和程序数据932。这类操作系统926、一个或多个应用程序928、其它程序模块930以及程序数据932的每一个(或其某一组合)可实现支持分布式文件系统的常驻组件的所有或部分。
用户可以通过输入设备,如键盘934和定位设备936(如,“鼠标”)向计算机902输入命令和信息。其它输入设备938(未具体示出)可包括麦克风、操纵杆、游戏垫、圆盘式卫星天线、串行端口、扫描仪和/或其类似物。这些和其它输入设备通常通过耦合至系统总线908的输入/输出接口940连接到处理单元904,但也可以通过其它接口和总线结构连接,如并行端口、游戏端口或通用串行总线(USB)。
监视器942或其它类型的显示设备也通过接口,如视频适配器944连接到系统总线908。除监视器之外,其它输出外围设备可包括组件如,扬声器(未示出)和打印机946,可通过输入/输出接口940连接至计算机902。
计算机902可以在使用到一个或多个远程计算机,如远程计算装置948的逻辑连接的网络化环境中操作。远程计算装置948可以是个人计算机、便携式计算机、服务器、路由器、网络计算机、对等设备或其它公用网络节点,游戏控制台等等。示出远程计算装置948为包括此处所描述的与计算机902有关的许多或所有元件和特征的便携式计算机。
计算机902和远程计算机948之间的逻辑连接被描述为局域网(LAN)950和一般广域网(WAN)952。这类网络环境常见于办公室、企业范围计算机网络、内联网以及因特网。
当在LAN网络环境中实现时,计算机902通过网络接口或适配器954连接至局域网950。当在WAN网络环境中实现时,计算机902通常包括调制解调器956或其它装置,用于通过广域网952建立通信。调制解调器956可以对计算机902是内置或外置的,通过输入/输出接口940或其它合适的机制连接至系统总线908。 可以理解,示出的网络连接是示例性的,也可以使用在计算机902和948之间建立通信链路的其它装置。
在网络化环境中,描述的与计算机902相关的程序模块或其部分可储存在远程存储器存储设备中。作为示例,远程应用程序958驻留在远程计算机的存储器设备中。为说明目的,此处示出应用程序和诸如操作系统等其它可执行程序组件为离散的块,尽管可以认识到,这类程序和组件在不同的时刻驻留在计算装置902的不同存储组件中,并由计算机的数据处理器执行。
此处可在计算机可执行指令的一般上下文环境中描述各种模块和技术,计算机可执行指令如程序模块,由一个或多个计算机或其它设备执行。一般而言,程序模块包括例程、程序、对象、组件、数据结构等等,执行特定的任务或实现特定的抽象数据类型。通常,如各种实施例中所描述的,程序模块的功能可组合或分布。
这些模块和技术的实现可储存在某一形式的计算机可读媒质中,或通过其发送。计算机可读媒质可以是可由计算机访问的任一可用媒质。作为示例而非局限,计算机可读媒质包括“计算机存储媒质”和“通信媒质”。
“计算机存储媒质”包括以用于储存信息的任一方法或技术实现的易失和非易失,可移动和不可移动媒质,信息如计算机可读指令、数据结构、程序模块或其它数据。计算机存储媒质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机访问的任一其它媒质。
“通信媒质”通常在诸如载波或其它传输机制的已调制数据信号中包含计算机可读指令、数据结构、程序模块或其它数据。通信媒质也包括任一信息传送媒质。术语“已调制数据信号”指以对信号中的信息进行编码的方式设置或改变其一个或多个特征的信号。作为示例而非局限,通信媒质包括有线媒质,如有线网络或直接连线连接,以及无线媒质,如声学、RF、红外和其它无线媒质。上述任一的组合也应当包括在计算机可读媒质的范围之内。
概念上,编程接口可以被一般地察看,如图10或图11所示的。图10示出了接口“接口1”为管道,第一和第二代码片断通过该管道进行通信。图11示出了接口包括接口对象I1和I2(可以是或不是第一和第二代码片断的部分),它们令系统的第一和第二代码片断能通过媒质M进行通信。在图11中,可以认为接口对 象I1和I2为同一系统的单独接口,并且也可以认为对象I1和I2加上媒质M构成了接口。尽管图10和11示出了双向流程以及该流程的每一侧上的接口,某些实现可仅具有一个方向上的信息流(或如下所述没有信息流),或仅具有一侧的接口对象。作为示例而非局限,诸如应用编程或程序接口(API)、入口点、方法、函数、子例程、远程过程调用和组件对象模型(COM)接口等术语包含在编程接口的定义之内。
这类编程接口的方面可包括第一代码片断向第二代码片断发送信息的方法(其中,“信息”以其最广泛的意义使用,并包括数据、命令、请求等等);第二代码片断接收信息的方法;以及该信息的结构、序列、语法、组织、模式、定时和内容。在这一点上,只要信息以接口所定义的方式传输,底层传输媒质本身可以对接口的操作不重要,无论该媒质是有线还是无线,或两者的组合。在某些情况下,在常规意义上,当一个代码片断仅访问由第二代码片断执行的功能时,信息可不在一个或两个方向上传输,因为信息传输可以是或者通过另一机制(如,信息被放置在与代码片断之间的信息流分离的缓存、文件等中)或者不存在。这些方面的任一个或所有可以在给定的情况下重要,如,取决于代码片断是否是松耦合或紧耦合配置的系统的一部分,并且因此该列表应当被认为是说明性的而非限制。
编程接口的这一概念对本领域的技术人员是已知的,并且可以阅读上述本发明的详细描述而清楚这一概念。然而,有其它方法来实现编程接口,并且除非明显地排除,这些方法也由所附权利要求书包含在内。这些其它方法看似比图10和11的视图更精密或复杂,但是它们仍执行类似的功能来完成同一整体结果。现在简要描述编程接口的某些说明性替换实现。
分解(Factoring)
可以通过将通信分裂成多个离散通信来间接地实现从一个代码片断到另一个的通信。这在图12和13中示意性地描述。如图所示,可以按照功能的可分组来描述某些接口。由此,可以分解图10和11的接口功能来达到相同的结果,如同可以在数学上提供24,或2乘2乘3乘2一样。因此,如图12所示,可以细分由接口“接口1”提供的功能以将该接口的通信变换成多个接口“接口1A”、“接口1B”、“接口1C”等,而达到相同的结果。如图13所示,由接口I1提供的函数可以被细分成多个接口I1a、I1b、I1c等,而达到相同的结果。类似地,从第一代码片断 接收信息的第二代码片断的接口I2可以被分解成多个接口I2a、I2b、I2c等。当分解时,包括在第一代码片断中的接口的数量不需要匹配包括在第二代码片断中的接口的数量。在图12或13的任一情况下,接口“接口1”和I1的功能性精神分别与图10和11的保持相同。接口的分解也可遵从联合、通信和其它数学性质,使得分解较难识别。例如,命令操作可以是不重要的,并且因此由接口完成的功能可以在达到该接口之前由另一段代码或接口较好地完成,或者由系统的单独组件执行。此外,编程领域的普通技术人员可以理解有各种方式来作出不同的函数调用而达到相同的结果。
重定义
在某些情况下,可能忽略、添加或重定义编程接口的某些方面(如参数),而仍达到预期的结果。这在图14和15中示出。例如,假定图10的接口“接口1”包括函数调用Square(input,precision,output)(平方),它包括三个参数,input(输入)、precision(精度)和output(输出),并且由第一代码片断向第二代码片断发布。如果中间参数precision在给定的情形下无关紧要,如图10所示,它也可以被忽略或甚至由meaningless(无意义)(在这一情况下)参数来替换。也可以添加无关紧要的additional(另外)参数。在任一情况下,只要在输入由第二代码片断平方之后返回输出,就可以达到square(平方)的功能。Precision也有可能对计算系统的某一下游或其它部分是极有意义的参数;然而,一旦认识到precision对计算平方这一有限目的不是必需的,它可以被替换或忽略。例如,不是传递一个有效的pricision值,而是在不对结果产生不利地影响的情况下传递诸如出生日期等无意义的值。类似地,如图10所示,接口I1由接口I1′替换,它被重新定义来忽略或向接口添加参数。接口I2可类似地被重定义为接口I2′,它被重定义来忽略不必要的参数,或可在别处处理的参数。此处的要点是在某些情况下,编程接口可包括对某一目的而言所不需要的方面,诸如参数,因此可以忽略或重定义它们,或在别处处理它们用于其它目的。
内嵌代码
合并两个单独的代码模块的一些或全部功能也是可行的,使得它们之间的“接口”改变形式。例如,图10和11的功能可以被分别转化到图16和17的功能。在 图16中,图10的先前的第一和第二代码片断被合并成包含两者的模块。在这一情况下,该代码片断仍可以彼此通信,但是该接口可以适用于更适合单个模块的形式。由此,例如,正式的调用(Call)和返回(Return)状态将不再必需,但是依照接口“接口1”的类似的处理或响应仍是有效的。类似地,如图17所示,图11的部分(或所有)接口I2可以内嵌地写入接口I1来形成接口I1″。如图所示,接口I2被划分成I2a和I2b,并且接口部分I2a内嵌在接口I1中书写代码来形成接口I1″。对于具体的示例,考虑图11的接口1执行函数调用square(input,output),它由接口I2接收,在由第二代码片断处理传递到input的值(对其求平方)之后,它被使用output传递回已求平方的结果。在这一情况下,由第二代码片断执行的处理(对input求平方)可以由第一代码片断在不调用该接口的情况下执行。
脱离
可以通过将通信分裂成多个离散的通信来间接地完成从一个代码片断到另一个的通信。这在图18和19中示意性地描述。如图18所示,提供了中间件的一个或多个片断(脱离接口(Divorce Interface),因为它们从原始的接口脱离的功能和/或接口函数),以转化第一接口“接口1”上的通信,使得它们符合不同的接口,在本情况下为“接口2A”、“接口2B”和“接口2C”。这可以在这样一种情况中完成,例如,依照“接口1”协议设计应用的已安装基础与如操作系统进行通信,但是然后改变该操作系统来使用不同的接口,在本情况下为接口“接口2A”、“接口2B”和“接口2C”。要点是改变了由第二代码片断使用的原始接口,使得它不再与第一代码片断所使用的接口兼容,因此使用中间物来令旧接口和新接口兼容。类似地,如图19所示,可以使用脱离接口DI1引入第三代码片断以从接口I1接收信息,并使用脱离接口DI2引入第三代码片断以向例如接口I2a和I2b发送接口功能,重新设计接口I2a和I2b以使用DI2,但是提供相同的功能性结果。类似地,DI1和DI2可共同工作以将图11的接口I1和I2的功能翻译成一新操作系统,而提供相同或类似的功能性结果。
重写
再一种可能的变化是动态地重写代码,使用别的东西来替换接口的功能,而仍达到相同的总体结果。例如,可以有一种系统,其中,向执行环境(如由.Net 框架提供的环境、Java运行时刻环境或其它类似的运行时刻类型环境)中的及时(Just-in-Time)(JIT)编译器或解释器提供了中间语言(如Microsoft IL、JavaByteCode等)中呈现的代码片断。可以书写JIT编译器以动态地将通信从第一代码片断转化到第二代码片断,即,令它们符合第二代码片断(原始或不同的第二代码片断)所需要的不同接口。这在图20和21中有描述。如图20中所看见的,这一方式类似于上述的脱离情形。它可以在这样一种情况下完成,例如,依照“接口1”协议设计应用的已安装基础操作系统进行通信,然后改变该操作系统以使用不同的接口。JIT编译器可以用于令已安装基础应用的空中通信符合操作系统的新接口。如图21所描述的,可以应用这一动态重写接口的方法以进行动态分解,或者改变接口。
也应当注意,上述通过替换实施例实现与接口相同或相似的结果的情形也可以以各种方式串行、并行或与其它干预代码组合。由此,上文呈现的替换实施例并非相互穷尽,并且可以被混合、匹配和组合以产生与图10和11中所呈现的一般情形相同或等效的情形。也应当注意,如同大多数编程构造,本发明可能未描述达到与接口相同或相似的功能的其它类似的方式,但是它们仍由本发明的精神和范围来表示,即,应当注意,它至少部分地是由作为接口的值的基础的接口表示的功能或由其启用的有利结果。
尽管上文的描述使用了对结构探特征和/或方法行动专用的语言,可以理解,所附权利要求书中定义的本发明不限于所描述的具体特征或行动。相反,揭示了具体特征和行动作为实现本发明的示例性形式。