详细描述
本发明延及用于分析二进制代码的方法、系统和计算机程序产品。在某些实施例中,接收二进制代码和代码分析规则。至少一个代码分析规则指示与二进制代码的功能有关的查询。用被配置成确定查询结果的分析代码实现查询。确定查询的有效结果不被高速缓存在结果存储中。作为响应,调用分析代码来确定查询的结果。该结果被高速缓存在结果存储中,使得当在将来接收查询时,可从结果存储访问结果而不必调用分析代码来确定结果。返回查询的结果。
在其他实施例中,接收二进制代码和代码分析规则。至少一个代码分析规则指示与二进制代码的功能有关的查询。用被配置成确定查询结果的分析代码实现查询。确定经高速缓存的查询结果被高速缓存在结果存储中。在调用用来确定查询的结果的分析代码之后,经高速缓存的结果被高速缓存到结果存储中。确定结果是有效的。检索经高速缓存的结果,以避免对分析代码的进一步调用。返回经高速缓存的查询的结果。
本发明的实施例可以包括含有计算机硬件的专用或通用计算机,这将在以下做出进一步讨论。本发明的范围内的实施例也包括用于携带或其上储存有计算机可执行指令或数据结构的计算机可读介质。这样的机器可读介质可以是可由通用或专用计算机访问的任何可用介质。作为示例而非限制,计算机可读介质可包括计算机可读存储介质,诸如RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他介质。
在本描述和所附权利要求书中,“网络”被定义为允许电子数据在计算机系统和/或模块之间的传输的一个或多个数据链路。当信息在网络或另一通信连接(硬连线、无线或硬连线或无线的组合)上传输或提供给计算机时,计算机将连接完全视为计算机可读介质。因此,作为示例,而非限制,计算机可读介质可包括可用于携带或存储计算机可执行指令或数据结构形式的所需程序代码装置并可由通用或专用计算机访问的网络或数据链路。
计算机可执行指令例如包括,使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。例如,计算机可执行指令可以是二进制代码、诸如汇编语言等中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。
本领域的技术人员将理解,可以在许多类型的计算机系统配置的网络计算环境中实践本发明,这些计算机系统配置包括个人计算机、膝上型计算机、手持式设备、多处理器系统、基于微处理器的或可编程的消费者电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机等。也可以在分布式系统环境中实践本发明,在分布式系统环境中,通过网络连接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统都执行任务。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备中。
图1示出了便于分析二进制代码的计算机体系结构100的示例。在计算机体系结构100中描述了各种组件,包括代码分析模块107、分析引擎109、高速缓存接口模块111和结果高速缓存112。各个组件中的每一个可以被连接到诸如局域网(“LAN”)、广域网(“WAN”)或甚至因特网等网络。因此,各个组件可对连接至网络的其他组件收发数据。从而,各组件可以通过网络创建消息相关数据并交换消息相关数据(例如,网际协议(“IP”)数据报和利用IP数据报的其他高层协议,诸如传输控制协议(“TCP”)、超文本传输协议(“HTTP”)、简单邮件传输协议(“SMTP”)等)。所示组件可位于同一计算机系统或跨多个不同的计算机系统分布。
一般而言,代码分析模块107被配置成根据分析规则来分析二进制代码(例如,经编译的源代码)。例如,代码分析模块170可分析二进制代码来计算函数可返回的异常或结果代码的闭包,计算调用站点是否可能返回存储器分配,计算函数的调用图,计算变量和参数的约束条件,确定值可不可以为空,聚集安全性许可(例如,用于受管的代码)等。
分析引擎109可例如从正在请求二进制代码分析的另一模块接收二进制代码和相应的分析规则。分析规则中包括的可以是与二进制代码的功能相关的一个或多个代码查询。为了实现针对二进制代码的所接收的代码查询,分析引擎可执行被设计成为所接收的代码查询生成结果的分析代码。
分析代码可以是被包括在代码分析模块107中的内部分析代码。或者,分析代码可以是可由代码分析模块107访问并加载的外部分析代码。例如,在某些实施例中,插件系统组织、描述并管理专用于执行各种分析和推断任务的插件。分析代码(内部和外部的)可被配置成供针对特定程序执行。
在执行分析代码以实现所接收的代码查询之前,分析引擎109可向高速缓存接口模块111提交高速缓存查询。高速缓存查询可请求高速缓存接口模块111检查结果高速缓存112来确定所接收的代码查询的有效结果是否被高速缓存在结果高速缓存112中。如果有效结果被高速缓存在结果高速缓存112中,则高速缓存接口模块111可例如向请求代码分析的其他模块返回经高速缓存的结果。因此,得以避免对(潜在资源密集的)分析代码的调用。
如果有效结果未被高速缓存在结果高速缓存112中,则分析引擎109可执行分析代码以生成所接收的代码查询的结果。生成的结果可被发送给高速缓存接口模块111。高速缓存接口模块111可将所生成的结果高速缓存在结果高速缓存112中,使得所生成的结果可被提供给同一代码查询的后续实例,而无需调用(潜在资源密集的)分析代码。
高速缓存接口模块111可包括用于基于随后对之前分析的二进制代码的修改来使经高速缓存的结果无效的机制。例如,高速缓存接口模块可包括用于验证二进制代码的字节计数和日期/时间戳的试探法。当所生成的指定二进制代码的结果要被高速缓存时,高速缓存接口模块111可计算所指定的二进制代码的字节计数和日期/时间戳,并将字节计数和日期/时间戳随结果一起高速缓存在结果高速缓存112中。响应于对经高速缓存的结果的后续高速缓存查询(由在分析引擎109处接收代码查询引起),高速缓存接口模块111可为该指定的二进制代码重新计算字节计数和日期/时间戳。
高速缓存接口模块111可将经高速缓存的字节计数和经高速的日期/时间戳分别与经重新计算的字节计数和经重新计算的日期/时间戳作比较。如果经高速缓存的字节计数和经重新计算的字节计数匹配(例如,相同)且经高速缓存的日期/时间戳和经重新计算的日期/时间戳匹配(例如,相同),则经高速缓存的结果被确定为有效,并返回经高速缓存的结果作为代码查询的结果。另一方面,如果经高速缓存的字节计数和经重新计算的字节计数不匹配(例如,不相同)和/或经高速缓存的日期/时间戳与经重新计算的日期/时间戳不匹配(例如,不相同),则经高速缓存的结果被无效并从结果高速缓存112中清除。
高速缓存结果也可通过依赖性分析按照更小的粒度来无效(甚至小至单个二进制)。
在某些实施例中,在结果被无效之后无效结果被保留在结果高速缓存112中一定量的时间。从而,在指定的时间间隔或响应于某一事件,可从结果高速缓存112移除被无效的经高速缓存的结果。
图2示出了用于分析二进制代码的示例方法200的流程图。方法200将关于计算机体系结构100中的组件和数据来描述。
方法200包括接收二进制代码的动作(动作201)。例如,分析引擎109可接收二进制代码101。二进制代码101可包括多个过程,例如过程101A、101B和101C,它们互操作以尝试实现所设计的二进制代码101的设计功能。例如,过程101A可调用过程101B,过程101B又可调用过程101C,依此类推。因此,每一调用过程的适当操作依赖于对其调用树的叶子过程的调用链中的每一其他过程的适当操作。例如,过程101C(被调用的过程)中的不适当操作可引起过程101A(进行调用的过程)中相应的不适当操作。
二进制代码包括可在计算机系统处执行的基本上任何代码。例如,二进制代码包括诸如C++、C#、Visual Basic等计算机语言的经编译的源代码指令,编译供由计算机系统的处理器执行。二进制代码也包括要被进一步编译供虚拟机在由硬件处理器执行之前执行的中间语言指令。
方法200包括接收包括与二进制代码的功能有关的查询的代码分析规则的动作(动作202)。例如,分析引擎109可接收分析规则102。分析规则可包括用于检查二进制码的各个不同特性,诸如安全性设置、与设计指导方针的顺应性等的规则,以及指示与二进制代码的功能有关的查询的规则。
例如,分析规则102包括指示与二进制代码101的功能有关的查询的代码查询103。代码查询可通过执行代码分析模块107外部可访问的分析代码,诸如分别包括在插件104A、104B和104C中的分析代码106A、106B和106C来实现。例如,代码查询103可通过执行来自插件104A的分析代码106A实现。或者,代码查询可通过执行被包括在代码分析模块107中的分析代码来实现。例如,代码查询103可通过执行分析代码108来实现。
方法200包括确定该查询的结果是否存在(判定框203)。例如,响应于接收二进制的代码101和分析规则102,分析引擎109可将高速缓存查询131提交给高速缓存接口模块111。响应于高速缓存查询131,高速缓存接口模块111可确定经高速缓存的二进制代码101的代码查询103的结果是被高速缓存在结果高速缓存112中,还是经高速缓存的二进制代码101的代码查询103的结果未被高速缓存在结果高速缓存112中。
作为对分析代码(例如,分析代码106A或分析代码108)之前调用的结果,所生成的二进制代码101的代码查询103的结果可被高速缓存在结果高速缓存112中。因此,方法200可包括确定经高速缓存的查询结果被高速缓存在结果存储中的动作。例如,高速缓存接口模块111可确定结果123是经高速缓存的二进制代码101的代码查询103的结果。当经高速缓存的查询结果存在(判定框203处的是)时,方法200前进至判定框204。
另一方面,可能没有任何对分析代码的之前调用生成了二进制代码101的代码查询103的结果。例如,分析代码106A或分析代码108可能之前从未对二进制代码111进行过调用。或者,可能出于某种原因,对分析代码106A或分析代码108的调用的结果可能不再被高速缓存在结果高速缓存112中。例如,之前存储的结果可被刷新而移出结果高速缓存112。
因此,方法200可包括确定经高速缓存的查询结果未被高速缓存在结果存储中的动作。例如,高速缓存接口模块111可确定针对二进制代码111调用分析代码106A(以实现代码查询103)的结果未被高速缓存在结果高速缓存112中。当经高速缓存的查询结果不存在(判定框203处的否)时,方法200前进至动作205。
方法200包括确定该查询的结果是否有效(判定框204)。例如,响应于找到结果123(对二进制代码101的代码查询103),高速缓存接口模块111可确定结果123是否有效。高速缓存接口模块111可将当前表示二进制代码101的数据(例如,当前时戳和当前校验和)与高速缓存结果123时表示二进制代码101的数据(例如,时戳124和校验和126)进行比较。
作为比较的结果,高速缓存接口模块111可能确定当前时戳和当前校验和分别匹配时戳124和校验和126。因此,方法200可包括确定经高速缓存的结果有效的动作。例如,高速缓存接口模块111可确定结果123有效。当经高速缓存的查询结果有效(判定框204处的是)时,方法200前进至动作206。
方法200包括检索结果的动作(动作206)。例如,高速缓存接口模块111可从结果高速缓存112检索结果123。
另一方面,作为比较的结果,高速缓存接口模块111可能确定当前时戳和/或当前校验和分别与时戳124和/或校验和126不匹配。因此,方法200可包括确定经高速缓存的结果无效的动作。例如,高速缓存接口模块111可确定结果123无效。当经高速缓存的查询结果无效(判定框204处的否)时,方法200前进至动作205。
方法200包括调用分析代码以生成查询的结果的动作(动作205)。例如,分析引擎109可针对二进制代码101调用分析代码106A以生成代码查询103的结果113。分析代码106A可包括用于计算可由过程101A、101B和101C中任何一个返回的异常或结果代码的闭包,计算过程101A、101B和101C中的任何一个可能返回存储器分配,计算过程101A、101B和101C中的任何一个的调用图,计算过程101A、101B和101C中的任何一个的变量和参数约束条件,确定对过程101A、101B和101C中的任何一个值可不可以为空,聚集二进制代码101的安全性许可等。
方法200包括高速缓存结果的动作(动作207)。例如,分析引擎109可将结果113发送给高速缓存接口模块111。高速缓存接口模块111可将结果高速缓存在结果高速缓存112中。在某些实施例中,分析代码(例如,分析代码106A)可向分析引擎109和/或高速缓存接口模块111指示其结果适于高速缓存。例如,当分析代码被配置成执行频繁重复的分析时,分析代码可包括其结果适于高速缓存的指示。在其他实施例中,分析引擎109和/或高速缓存接口模块111包括被执行来确定分析结果要被高速缓存的附加逻辑。
分析引擎109或高速缓存接口模块111也为所生成的结果生成时戳和校验和。例如,分析引擎109可为结果113生成时戳和校验和,并将时戳和校验和(例如,时戳114和校验和116)连同结果113一起发送给高速缓存接口模块111。或者,高速缓存接口模块111可为结果113生成时戳和校验和(例如,时戳114和校验和116)。高速缓存接口模块111可随经高速缓存的结果一起高速缓存时戳和校验和(无论是接收到还是生成的)。例如,高速缓存接口模块111可随结果113高速缓存时戳116和校验和116。
方法200还包括返回结果的动作(动作208)。在某些实施例中,高速缓存接口模块111返回结果。例如,响应于高速缓存查询131,高速缓存接口模块111可在响应132中包括结果123,并向分析引擎109返回响应123。或者或与响应132并行地,高速缓存接口模块111可(例如,向显示设备)输出结果123。
在其他实施例中,分析引擎109返回结果。例如,在生成结果113之后,分析引擎109可(例如,向显示设备)输出结果113。或者,响应于接收响应132,分析引擎109可(例如,向显示设备)输出结果123。
本发明的实施例可包括用于针对目标过程请求对分析问题的回答的系统和应用程序编程接口(“API”)。API可查阅持久结果存储以确定分析结果是否已经存在且有效。如果结果不存在或现有结果是无效的,则系统在运行时调用相关分析代码并将所生成的结果返回给调用者。
在某些实施例中,在每次执行的分析和与计算或推断昂贵分析问题的回答的分析中间加以区分。要每次执行的分析的结果可被高速缓存,使得访问重复分析的结果更高效。
相应地,本发明的实施例在分析和被分析的代码之间建立正式的关系。该正式关系便于在登录之前针对预测的一组代码改变在降低的分析时间成本的情况下在开发人员计算机系统上进行更强大的代码分析。本发明的实施例尤其对其中代码的一部分相对于更大量的静态代码进行改变的实施例有用。例如,实施例可用于在本地系统上建立提供重要的分析值而不损害性能的集中的结果高速缓存。
本发明可具体化为其他具体形式而不背离其精神或本质特征。所述实施例在所有方面都应被认为仅是说明性而非限制性的。从而,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方式的含义和范围内的所有改变应被权利要求书的范围涵盖。