




已阅读5页,还剩53页未读, 继续免费阅读
(计算机软件与理论专业论文)逆向工程中动静态结合分析目标系统的研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 摘要 随着软件系统的日益复杂,软件开发、维护以及进化的大部分工作和主要成 本集中在对现有系统的理解上。逆向工程是一种辅助程序理解的重要手段,是软 件工程的一个重要分支,通过抽取目标系统的静态信息和动态信息来抽象其高层 表示,辅助程序理解。 程序依赖图信息对于分析面向对象软件系统中的交互是重要的。静态程序分 析得到的信息庞大,且无法反映面向对象系统中的多态和动态绑定特征;动态分 析则与程序的具体运行轨迹有关,通常无法得到完整的依赖关系。 本文在深入分析反射植入、开放编译等关键技术的基础上,重点研究了逆向 工程中静态程序依赖图模型信息提取的方法,研究了采用带分支静态程序依赖图 减少植入范围的方法,同时提出了静动态结合的思路,分别使用开放编译技术和 反射植入技术获取静态和动态程序依赖信息,并将二者结合起来产生静动态结合 程序依赖图,来辅助用户程序的理解。实验研究表明,动静态结合程序依赖图既 能反映动态运行轨迹,又能全面反映系统整体依赖信息,可以更有效地辅助程序 理解。 论文中提出的所有方法、算法均已在x d r e ( x i d i a nr e v e r s ee n g i n e e r i n g , 西电逆向工程工具集) 中实现 关键字:面向对象逆向工程程序依赖图开放编译反射植入动静态结合 a b s t r a e t a b s t r a c t f o rt h ec o m p l e x i t yo fs o f t w a r es y s t e m s ,t h em a i nw o r k so fs o f t w a r ed e v e l o p m e n t , n l a i l i t e n a n c ea n de v o l u t i o nh a v e b e e nf o c u s e do nt h ec o m p r e h e n s i o no f e x i s t i n gs y s t e m s r e v e r s ee n g i n e e r i n gi sa ne f f e c t i v em e t h o dt ot h ep r o g r a mc o m p r e h e m i o i l a n di ti sa s i g n i f i c a n tr e s e a r c hb r a n c ho fs o f t w a r ee n g i n e e r i n g i tc r e a t e sr e p r e s e n t a t i o n so ft h e s y s t e ma tah i g h e rl e v e lo fa b s t r a c t i o nt o a s s i s tt h ep r o g r a mc o m p r e h e n s i o nb y e x t r a c t i n gt h es t a t i ci n f o r m a t i o na n dd y n a m i ci n f o r m a t i o nf r o mt h et a r g e ts ) r s t e m c a l lg r a p hp l a y sa ni m p o r t a n tr o l ei nt h ea n a l y s i so ft h ei n t e r a c t i o n si na l l o b j e c t - o r i e n t e ds y s t e m s t a t i ci n f o r m a t i o nc a nn o tr e f l e c tp o l y m o l p h i s ma n dd y n a m i c b i n d i n gi n f o r m a t i o nw h i l ed y n a m i ci n f o r m a t i o no n l yo b t a i n st h ee x e c u t i n gt r a c e sa n d c a nn o tg a i nt h ew h o l ed e p e n d e n c yr e l a t i o n s o nt h eb a s i so f t h o r o u g ha n a l y s e so fr e f l e c t i o n a li n s t r u m e n t a t i o nt e c h n i q u e s ,o p e n c o m p i l e rt o c h n o l o g ya n dt h ef r u i to ft h ef o r m e rr e s e a r c h ,t h i st h e s i sm a l n i yf o c u s e so l l t h et o p i co fs m i l ec a l l g r a p hi n f o r m a t i o ne x t r a c t i o ni nr e v e r s ee n g i n e e r i n g a n dt h i s p a p e ra l s od os o m er e s e a r c h e so nh o w t od e c r e a s et h ei n s t r u m e n t a t i o ns c o p eb ya n a l y s i s o ft h eb r a n c hi n f o r m a t i o ni nt h es t a t i cc a l lg r a p h a n dt h e n ,t h i sp a p e rb r i n gf o r w a r da p r o g r a mu n d e r s t a n d i n gt e c h n i q u ew h i c hc o m b i n e ss t a t i ca n dd y n a m i ca n a l y s i st o c o n s t r u c tac a l lg r a p hf o ra s s i s t i n gp r o g r a mc o m p r e h e n s i o n a tl a s t ,t h er e s e a r c ho no n e t e s tc a s es h o w st h a tt h es t a t i ca n dd y n a m i cc o m b i n e dc a l lg r a p hr e a l l yc a ns h o wb o t h i n t e g r a t ea c c u r a t es t a t i cd e p e n d e n c yi n f o r m a t i o na n dd y n a m i ce x e c u t i n gl a a c ea n dd o w e l li na s s i s t a n to np r o g r a mc o m p r e h e n s i o n a l lo f t h e a l g o r i t h m sa n dm e t h o d sp r o v i d e di nt h i sp a p e rh a v eb e e ni m p l e m e n t e di n at o o l k i tn a m e dx d r e ( x i d i a nr e v e r s ee n g i n e e r i n g ) k e y w o r d s :o b j e c t o r i e n t e d r e v e r s ee n g i n e e r i n gc a l lg r a p h o p e nc o m p i l e r r e f l e c t i v ei n s t r u m e n t a t i o n d y n a m i ca n ds t a t i cc o m b i n e da n a l y s i s 创新性声明 本人声明所呈交的论文是我个人在导师指导下进行的研究工作及取得的研究 成果。尽我所知,除了文中特别加以标注和致谢中所罗列的内容以外,论文中不 包含其他人已经发表或撰写过的研究成果;也不包含为获得西安电子科技大学或 其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做 的任何贡献均已在论文中做了明确的说明并表示了谢意。 申请学位论文与资料若有不实之处,本人承担一切相关责任。 关于论文使用授权的说明 本人完全了解西安电子科技大学有关保留和使用学位论文的规定,即:研究生 在校攻读学位期问论文工作的知识产权单位属西安电子科技大学。本人保证毕业 离校后,发表论文或使用论文工作成果时署名单位仍然为西安电子科技大学。学 校有权保留送交论文的复印件,允许查阅和借阅论文;学校可以公布论文的全部 或部分内容。可以允许采用影印、缩印或其它复制手段保存论文。( 保密的论文在 解密后遵守此规定) 本学位论文属于保密,在 年解密后适用本授权书。 本人签名:夔垫适日期1 2 :垒:1 导师签名; t 堑i日期四:i :2 : 第一章绪论 1 1 1 研究背景与意义 第一章绪论 1 1 引言 随着计算机软件技术的发展和社会需求的增长,人们希望计算机能够解决更多 领域的更复杂的问题,软件系统变得同益复杂,遗产系统越来越多,更新速度也 随着越来越快。随之出现了以下问题或需求: 1 软件系统维护成本剧增 随着软件系统的日益复杂和庞大,软件维护占去了大量的时问和费用,据 调查统计i l j ,目前用于软件维护的资源和时间占到了总投入的5 0 * 0 - - - 8 0 。软 件维护的核心问题之一是理解目标系统,约占整个维护时间的一半。 2 遗产系统1 2 j ( l e g a c ys y s t e m s ) 增多 软件技术的快速发展和需求的不断调整导致许多系统成为遗产系统,但由 于这类系统往往承担着业务逻辑实现的关键任务,蕴藏着一个领域多年积累的 宝贵经验与知识,如果对这类系统进行彻底的重新开发,会存在较大的成本和 风险。另外,随着系统的多次维护和演化,原系统的设计文档会发生漂移 ( d r i f t ) ,使得程序源代码成为唯一可靠的理解源。对于这类系统往往采用演 化和再工程技术进行扩充,因此对目标系统的理解就显得格外重要。 3 自由软件再工程 近年来随着互联网络的急剧发展,供人们能够自由使用和修改的自由软件 已经越来越多,自由软件基金项目也越来越多,越来越多的人们投入到自由软 件基金项目的开发中。但由于这类软件往往缺乏文档资料,而且文档资料的更 新也跟不上软件的更新,且没有一个统一的设计标准,所以对它的框架结构的 理解程度限制了使用,这增加了对自由软件的再工程和重构的需求 逆向工程可以帮助解决上述问题和需求,从而越来越受到人们的重视。在这种 背景下,结合项目的实际需求,对逆向工程方法和技术的研究就有着重要的理论 和实践意义。 逆向工程中动静态结合分析日标系统的研究 1 1 2 逆向工程( r e v e r s ee n g i n e e r i n g ) 随着计算机技术的飞速发展,计算机应用的领域不断扩大,人们希望计算机能 够解决各个领域的更多、更复杂的问题,从而也对计算机软件产品的功能、质量、 开发成本和时间提出了越来越高的要求。 2 0 世纪6 0 年代,软件危机的出现促使了软件工程学的诞生和发展。2 0 世纪 8 0 年代初,面向对象技术成为研究的热点,许多面向对象的编程语言问世。2 0 世 纪8 0 年代末以来面向对象方法开始向系统分析、设计阶段延伸,出现了一大批面 向对象的分析与设计方法。1 9 9 7 年,统一建模语言( u m l ,u n i f i e dm o d e l i n g l a n g u a g e ) 被对象管理组织( o m g ) 采纳作为一种标准建模语言。 在传统软件开发的正向工程( f o r w a r de n g i n e e r i n g ) 方法技术继续发展的同时,软 件领域的逆向工程( r e v e r s ee n g i n e e r i n g ) p i 作为软件工程的一个分支开始受到广泛 的关注。 逆向工程的概念起源于商业或军事硬件的分析,目的是在不了解或很少了解最 初生产过程的情况下,从最终产品推断出其设计方案。这项技术也被研究应用于 遗产软件系统,不是出于工业或军事目的,而是为了恢复错误的、不完整的或难 以获得的文档信息。 现在,逆向工程( r e v e r s ee n g i n e e r i n g ) 被定义为分析软件构件和它们的相互关 系从而在较高抽象层次上描述该软件。它通过对程序进行静态和动态分析来抽取 程序的高层表示,与正向工程( f o r w a r de n g i n e e r i n g ) 相对。逆向工程与正向工程 的过程模型见图1 1 。 c h i k o f s k y 和c m s s 对逆向工程有如下定义【4 】:逆向工程是分析目标系统,认定 系统的构件及其交互关系,并且通过高层抽象或其他形式来展现目标系统的过程。 逆向工程的目的是协助用户理解系统,从而便于对系统的文档再生、重构、维护 和演化。 改变 系统a 概念 需求 设计 实现 图1 1 逆向工程与正向t 程的过程模型 第一章绪论 传统软件工程的研究与开发主要集中在提高所开发或所规划系统的效率与质 量上。然而,对现有系统的维护估计要消耗所有软件预算资源的5 0 到8 0 。因此, 为了理解现有系统中有价值的设计思想,就必然要求有相应的工具与方法。逆向 工程能够帮助理解系统,恢复遗产软件系统中错误的、不完整的或难以获得的文 档信息,进行系统的再工程和文档的再生。它有四个主要的应用1 5 1 : 文档再生( r e d o c u m e n m t i o n ) :在同一层次上产生( 如果不存在) 或修正文档。 文档再生不改变系统。 设计再现( d e s i g nr e c o v e r y ) :运用领域知识及可能的外部信息在较高的抽象 层次上产生系统模型。设计再现不改变系统。 结构重组( r e s t r u c t u r i n g ) :在同一抽象层次内对系统的横向转换,包括同一 层次的功能和语义。结构重组改变了系统,但不改变功能。 再工程( r e e n g i n e e r i n g ) :这是最根本和最有深远影响的扩展,涉及到逆向工 程与正向工程的联合使用。逆向工程解决程序的理解问题,正向工程检验哪些功 能需要保留、删除或增加。 1 1 3 逆向工程研究现状 逆向工程的基本原理是抽取软件系统的主要部分而隐藏细节,然后使用抽取 出的实体在高层上描述软件系统。逆向工程抽取的实体应比源代码更容易推理和 接近应用领域,同时在高层上对软件系统的抽象表示要简洁和易于理解。 逆向工程作为软件工程的重要组成部分,很早就引起学术界和工业届的广泛 关注关于逆向工程的国际会议有w c r e ( w o r k i n gc o n f e r e n c e o nr e v e r s e e n g i n e e r i n g ) 和i w p c ( i n t e r n a t i o n a lw o r k s h o po np r o g r a mc o m p r e h e n s i o n ) 。前者从 1 9 9 4 - - 2 0 0 5 年已经召开1 2 次,后者则从9 3 年起连续召开1 3 次。一些科研院所和大 公司也纷纷开展研究,并开发了具有实际应用价值的逆向工程工具。 经过多年的发展,逆向工程主要形成两大类嘲: 代码逆向工程( c o d er e v e r s ee n g i n e e r i n g ) ;通常所讨论逆向工程均属于这一 类。它通过对代码的分析来抽象系统的结构、功能、行为等高层模型。 数据逆向工程( d a t ar e v e r s ee n g i n e e r i n g ) :它主要与数据库系统相关,着力 于处理哪些信息应该保存、这些信息怎么用于不同的系统中等内容。它的出现是 由需求驱动的,例如y 2 k 问题。 目前国际上已经开发出了一些逆向工程工具,对典型的工具简单介绍如下: 1 s c e d 和p , i g i s c e d l 7 1 是一种支持面向对象动态建模的环境,可以产生剧情图( 类似于 u m l 的s e q u e n c e d i a g r a m s ) 和状态图( 类似于u m l 中的s t a t e e h a r t d i a g r a m ) 。 4 逆向工程中动静态结合分析目标系统的研究 s c e d 基于o m t 方法,也可用于其它方法,尤其是以剧情驱动的方法。 r i g i 是一个很有名的可扩展、可裁剪的逆向工程环境,主要由三部分构成: r i g ir e v e r s e r ,主要用于解析程序静态信息,可以支持c 、c o b o l 等语言。r i g i s e r v e r ,是程序静态信息库,用于存储从源代码提取的信息;r i g ie d i t ,是交互 式的图形编辑器,以图形交互方式展示和操纵静态信息。 r i g i 与s c e d 协同使用,可以得出目标系统源程序的静态信息和动态信息。 2 r a t i o n a lr o s e r o s er e a l t u n e r o s e r o s er e a l t i m e ( r o s er t ) 提供了逆向工程工具,可以从多种程序设 计语言源程序中自动产生静态设计模型,但目前只能逆向产生类图。 3 i s v i s i s v i s 2 0 l 的静态分析主要是借助于s o l a r i s 平台的c c 编译器产生的静态信息 库。i s v i s 通过两个p e d 程序来解释该静态信息库中的内容,生成静态信息文件。 i s v i s 通过代码植入的手段获取目标系统的动态信息,采用函数体植入与函 数调用植入相比于,函数体植入插入的代码量少,但获得的调用方信息也较少。 4 b o d a n dt o g e t h e r b o d a n d t o g e t h e r 是b o d a n d 公司的双向工程工具。它既可以进行正向工程, 从模型产生代码,也可以进行逆向工程,从代码抽象出模型。t o g e t h e r 可以逆 向的模型包括静态模型( 如类图) 和动态模型( 如序列图) 。其逆向动态模型 的方法是通过对代码的静态分析完成的。在b o r l a n dt o g e t h e r q ,使用一项专利 技术l i v e s o u r c e t m ( 即:实时双向工程技术,s i m u l t a n e o u sr o u n d - t r i p e n g i n e e r i n g ) ,可以保证模型与代码的同步 5 青鸟程序理解系统j b p a s 青鸟程序理解系统j b p a s 是一个针对c + + 语言的程序理解系统,由一个o h 分析器前端和一组分析工具组成。该系统针对c + + 语言,采用增量分析技术对 程序源代码进行静态分析。用e e r ( e n h a n c e de n t i t y r e l a t i o n s h i p ) 为c - 卧程序 建立概念模型并抽取程序信息,将信息保存在数据库中。然后按照不同的用户 需求组织程序信息,逆向生成源程序的设计文档和r o s e 文档,辅助用户理解 c 抖程序。 从逆向程度来看,以上工具可归纳为两种类型: 1 静态模型逆向工具:这类工具通过对某特定语言的源码或者编译后的目 标码进行静态分析,从中抽象出静态模型表示。这种工具最为普遍,典型 代表有:r a t i o n a lr o s e 、r i g i 和j b p a s 。 2 动态模型逆向工具:这种工具能够获取程序运行过程中的动态信息,从 中抽象出程序的动态模型。由于存在着理论和实现上的瓶颈,这类工具并 不多,典型的代表有:s c e d 和i s v i s 。 第一章绪论 1 2 1 项目背景及意义 1 2 项目介绍 本文论述的主要内容来源于“十五”军事电子预研课题“系统应用软件逆向 工程开发工具研究”中的一部分。该课题的主要工作是研制一套面向军事电子信 息系统的逆向工程工具,并将其无缝地集成n r a t i o n a lr o s e 中。 为了解决开发过程中因需求变化和设计变更而引起的问题,r a t i o n a l 公司推出 了一种以受控的迭代式增量开发为特征的软件开发过程产品r u p ( r a t i o n a lu n i f i e d p r o c e s s ) 和一种面向对象软件开发环境r a t i o n a lr o s e 。然而,r a t i o n a l 环境与工具 的支持理念以正向工程为主,即按照分析建模、设计建模、用静态设计模型自动 产生或修改代码框架、方法函数体的编码、模块系统测试的顺序进行开发,对于 逆向工程,r a t i o n a l 环境与工具仅支持程序到部分静r 态设计模型( 主要是类图,c l a s s d i a g r a m s ) 的自动转换。另一方面,由于理论与技术上的困难,即使像r a t i o n a l 产 品这样在世界上具有高技术水平的面向对象开发环境与工具,也不能用动态设计 模型自动产生或修改代码。 在系统开发初期或者开发时间比较充裕的情况下,以正向工程模式进行建模 和程序设计是合理和可行的,还可以利用环境与工具自动生成各类文档。但是, 由于需求变化和开发周期限制,在实际工程中已经出现了相应的问题1 2 l l : 问题l :一旦发生了需求变化( 此时往往已经到了开发过程的中后期) 或者进 行现场维护时发生了源程序的修改,从而引起了分析、设计模型的相应变化。这 时,虽然通过软件过程管理等手段可以要求开发人员对系统静态模型进行相应的 修改,重新生成源程序代码框架和一部分文档,但对于要费时费力地修改的系统 动态模型部分,则往往由于时问的限制和动态模型不能对源程序产生实质性作用, 而放弃了相应的模型修改。这时,与动态模型相关的文档就很可能与源程序不一 致。 问题2 :由于r a t i o n a l 环境与工具不支持用动态设计模型自动产生或修改代码, 因此即使是开发时间允许,分析、设计人员所建立的动态模型与对应的源程序之 间,也不能保证必然的一致性。因此,用正向建立的动态模型自动生成的文档也 可能没有正确地反映目标系统的动态行为和结构特征。这在相当大的程度上影响 了分析、设计人员建立系统动态模型的积极性,许多出于应付差事而建立的动态 模型与实际系统严重不符。 如果开发一组工具,支持从源程序逆向产生相应的动态模型,如符合u m l 标准 的序列图、状态图、用例图等,并使得逆向产生的上述动态模型在r a t i o n a l 开发环 6 逆向工程中动静态结合分析目标系统的研究 境中与正向建立的动态模型具有相同的表示,以便自动生成文档,那么可以对问 题i 的解决提供计算机辅助手段,对问题2 的解决提供正向与逆向动态模型对比的 基础,这对于软件系统的开发和逆向工程的研究有着现实意义。 1 2 2 项目研究目标和研究现状 本项目的研究目标是研制一组逆向工程工具,以提供符合u m l 标准的动态模 型和静态模型的逆向生成与分层抽象等方面的功能;并将这一组工具无缝集成到 r a t i o n a l 开发环境中,与该环境中的其他工具协同工作,以扩充r a t i o n a l 开发环境在 逆向工程工具方面的支持能力;在将研制结果应用于实际系统开发后,为提高我 国各类军事电子信息系统的面向对象开发、维护和重用水平提供有效的、实用的 支持。 圈1 3 x d r e 体系结构圈 本项目研制的逆向工程工具集简称为x d r e ( x i d i a n r e v e r s ee n g i n e e r i n g ) ,按 功能可以将其划分为四个子系统,它们分别是交互子系统、植入子系统、过滤子 系统、模型生成与抽象子系统。 在x d r e 中,交互予系统主要负责扩充r a t i o n a lr o s e 实现x d r e 与用户的交互。 植入子系统根据用户的要求,获取被分析系统( 本文称为目标系统) 的静态信息, 并植入一些软件触发器,以便在目标系统运行时产生动态信息。过滤子系统按照 第一章绪论 7 一定的算法,对目标系统运行时产生的动态信息进行过滤、收集和持久化,为后 续的动态模型抽象提供支持。模型生成与抽象子系统主要完成目标系统的静态模 型和动态模型的生成和高层抽象,这里的静态模型和动态模型主要包括类图、进 程结构图、用例图、活动图、序列图以及从序列图构建出相应的状态图等。 本项目采用了r u p 开发方法,用循环迭代开发的方式逐步实现各个研究目的。 目前已经完成了七轮迭代,已经能够逆向生成类图、进程结构图、用例图、序列 图、状态图和活动图,并能够对这些模型图进行进一步的抽象。 1 3 本文工作及论文结构 本文论述了) a ) r e 植入子系统程序分析植入模块第八轮迭代的设计与实现工 作。在前七轮迭代中,植入子系统实现了针对w i n d o w s 平台和l i n u x 平台的c + + 程 序静态信息和动态信息抽取的部分功能。实践表明,基于反射和开放编译技术的 程序分析机制是可行的。但在部分技术和实用性方面还有一些欠缺,例如获得的 信息以动态信息为主,尤其是程序依赖关系,单纯依靠反射植入技术通过在目标 系统中植入触发器代码,然后动态运行植入相应触发器代码的目标系统动态收集 动态信息,在某些大型的应用中可能会出现效率瓶颈问题。 本文在x d r e 前七轮迭代的基础上,基于反射植入、开放编译、程序依赖图等 理论、技术的基础上,针对前七轮迭代中存在的问题和未完成的功能,改进和完 善了x d r e 植入子系统程序分析植入模块的设计和功能。在本人所在的迭代工作 中,提出了静态程序分析为主,动态程序分析为辅的思路,并且提出了程序依赖 图来辅助用户理解目标系统的方式。利用开放编译技术在前七轮迭代的基础上提 取出了静态程序依赖图的信息,并且同时根据反射植入技术动态运行植入后目标 系统提起出了目标系统的动态运行信息。同时本文还提出和实现了动态和静态程 序依赖图相结合分析目标系统的手段和思路。所有这些工作的主要作用和意义是 为x d r e 逆向生成静态模型和动态模型提供可靠的数据依据。 本文将在以下几章中详细论述所做工作。在第二章探讨逆向工程中程序分析 及信息抽取的相关理论,第三章主要论述逆向工程中静态程序依赖图的获取和分 析。第四章主要论述逆向工程中静态分析和动态分析相结合分析目标系统的研究, 第五章对具有分析信息的静态程序依赖图在减少植入范围研究方面做出了初步的 分析和研究,在最后一章通过一个具体的实例对提出的方法进行了验证。 1 4 小结 本章首先主要介绍了本文的研究背景和意义,随着软件系统的f i 益复杂,软 逆内工程中动静态结合分析日标系统的研究 件开发、维护以及进化的大部分工作和主要成本集中在对现有系统的理解上。逆 向工程是一种辅助程序理解的重要手段。 然后论述了项目的背景和意义,项目的研究目标和研究现状,最后介绍了本 文的工作内容以及论文的组织结构。 第二章相关理论与技术 9 第二章相关理论与技术 2 1 反射技术 反射的概念最早是i 勾b d a nc s i m t h 在1 9 8 2 年首次提出1 2 1 i ,主要是指程序可以访 问、检测和修改它本身状态或行为的一种能力,当时它仅仅作为一种程序设计方 法被提出。近几年来,由于在j a v a 和n e t 中的成功应用,反射技术已经从理论和 技术研究走向实用化。它能够明确分离描述系统自身结构和行为的信息与系统所 处理的信息,能够建立可动态操纵的因果关联以动态调整系统行为,是开放编译 器的基础。 2 1 1 反射概念 在计算系统中,反射是关于并作用于计算系统本身的推理过程,这一活动涉及 访问并部分地改变整个系统,从而影响自身的计算m i 。反射计算系统具有自我表 示的能力,自我表示使该系统能够回答关于其自身的问题,并支持作用于自身的 动作。 反射技术的基本理念是将一个系统看成是相互依赖的层次化计算系统,改变 下层的计算逻辑,可以动态地影响上层的计算逻辑。从反射的观点看,一个计算 系统可以看作是由两个系统构成。基级系统( b a s e l e v e ls y s t e m ) 负责解决从应用 角度描述计算的外部问题,而元级系统( m e t a - l e v e ls y s t e m ) 负责维护有关基级实 体的信息,以及描述基级计算域上的计算如何借助于元实体实现等问题。 图2 1 通过对象的元模型描述元系统 1 0 逆向工程中动静态结合分析目标系统的研究 反射的关键思想就是访问并修改元级系统,以改变其执行动作的方式。但对 元级系统的直接操纵是不被允许的,因此就有需要建立元级系统的一种带有限制 的表示一元模型( m e t a - m o d e l ) 。元模型允许在抽象层次上通过编程访问实现的状 态( 即内省,i n t r o s p e c t i o n ) ,或不通过通用基础接口而是直接调用底层函数( 即调 用,i n v o c a t i o n ) ,也允许增加和改变底层系统的行为和调整实现策略( 即调解, i n t e r c e s s i o n ) 。在元模型上所作的任何修改都将在元级系统的行为上得到体现( 即 反射) 2 1 2 反射模型 反射模型可分为结构反射和计算反射两大类例 1 结构反射( s t r u c t u r a lr e f l e c t i o n ) 此模型所关心的主要是在实现计算时对类和元类( m e t a c l a s s ) 的使用。在 这种模型中,目标计算域上的每个实体都是类的实例,而类则是元类的实例。 动态访问和修改元类的实例值,等同于动态访问和修改目标计算域上相应实体 集合中实体的自身表示。元类又可以是元元类的实例,其自身表示可以用同样 的方法来访问和修改。这种模型侧重于对象的结构方面,以结构的动态变化来 问接地反映语义的变化。 2 计算反射( c o m p u t a t i o n a l r e f l e c t i o n ) 计算反射也称为行为反射( b e h a v i o r a lr e f l e c t i o n ) 。这种模型所依据的事实 是使得每个对象有它自己的元对象。元对象的值是对象的自身表示,显示地表 示出对象的结构、处理消息的方法等一些原来是隐含的信息。元对象还可含有 特殊的解释器以及相应环境,用它们代替母语言解释器后,可使对象施用的操 作产生不同的语义。元对象也可以有元对象,其间的关系类似于对象与元对象, 依次类推。这种模型侧重于对象的行为方面,直接通过对象与其元对象之间的 因果关联来反映语义的变化。 当需要拦截一个操作,比如方法调用,并修改这个操作的行为时,常使用计算 反射模型。如果一个操作被截获,运行系统的扩展部分( 用于实现计算反射) 会 调用元对象上的相应方法,以通知该元对象发生了一个与某个事件对应的操作。 程序员可以定义他们自己版本的元对象,使之按照定制的语义执行被拦截的操作。 行为反射只提供修改程序中操作行为的能力,而没有提供修改程序中数据结构( 这 在编译时就静态决定了) 的能力。因此如果需要修改程序中的数据结构,比如类、 方法和记录的定义时,则常使用结构反射模型。 绝大多数的计算反射都是在运行时完成的,但在实际中,行为反射总是夹杂 着一些运行时的结构反射,或者为了效率的原因被尽量提前到编译阶段进行。但 第二章相关理论与技术 由于无法利用诸如变量值这样的运行时信息,编译时行为反射的能力不如运行时 的强。同样,结构反射既科研在编译时进行( 比如本项目使用的o p e nc + + ) ,也可 以在运行时进行,就像c l o s 、s m a l l t a l k 那样。 2 2 植入技术 只通过静态模型很难理解一个复杂系统的行为,因此监视并获取系统运行时 产生的动态信息是十分重要的。动态信息f 2 5 l 【矧的使用是一个很有吸引力的观点: 首先,执行剧情像一个程序片断,这样可以限制我们的考察范围。其次,关于执 行剧情的动态信息总是准确的。第三,与为了静态获得一个程序片断而进行的控 制流分析相比,获得执行路径相对简单。最后,执行路径提供了从静态分析得不 到的一些信息,例如实例数或者对象之间关系的多样性。 植入法( i n s t r u m e n t a t i o n ) 田】是目前各种工具中收集动态信息主要采用的一种 方法。其主要原理是:利用代码的结构信息,依据固定的规则,将软件触发器添 加到代码中。 所谓软件触发器,是指在源程序中相应的位置添加的一些代码,运行时由这 些代码按特定协议将指定的动态信息传递到指定位置或传递给动态信息收集机 制,从而提供产生动态模型所需的对象之间的消息传递信息。见图z 2 。 源文件,一 囱口臼母 d 口 = = = = = 。星翌$ 团岱口囵 o 口亡= = = = = = : 原有代码亡:= 软件触发器团b 0 0 1 动态信息 图2 2 植入法的原理 从植入时机2 7 l 网上看,植入法可进一步细分为源代码( s o u r c ec o d e ) 级的植 入和目标码( o b j e c tc o d e ) 级的植入。 源代码级的植入通常有两种实现方法:l 、通过包含头文件给应用程序添加一 些支持动态信息的宏;2 、在源代码被送到编译器之前用预处理器进行解析。目标 码级的植入发生在可执行代码生成之后( 对j a v a 这样的语言,是在字节码生成之 后) ,有直接修改和间接修改两种。直接修改类似于调试器设置断点:间接修改通 常分三步实现:转换可执行代码为中间表示;对中间表示进行植入:最后再把植 入过后的中间代码转换回可执行代码。 1 2逆向工程中动静态结合分析目标系统的研究 源代码级植入具有清晰、明了而且易于实现的优点,但这种植入法也存在着 明显的局限性:需要有应用程序的源代码。也就是说,如果没有源代码,这种植 入手段将会毫无用处。 目标码级的植入则没有这样的限制,但显而易见的是,目标码级的植入需要 对编译过程非常了解。只有清楚语言中每一个语法结构在二进制码( 5 时j a v a 是字节 码) 中的组织格式,目标码级的植入才能够准确有效的进行。 鉴于本项目研制的工具就是以c + + 源程序为处理对象的,因此采用的是源代码 级植入。 2 3 开放编译器o p e nc + + 2 3 1o p e nc + + 简介 o p e n c + + 是一个典型的丌放编译器,它将元对象协议( m e t a - o b j e c tp r o t o c o l , m o p ) t s 弓i 入到c + + 源程序的编泽过程中,是一种面向c 抖的源代码转换工具。o p e n c + + 可被用来实现对c + + 语言的各种扩充,如添加新的文法、新的符号、新的对象 行为等1 9 】。所谓开放编译,就是指通过元对象协议将编译过程向用户开放,用户可 以通过元对象协议提供的接口干预编译过程。 元程序( m e ) 图2 3o p e n c + + 概览 o p e nc + + 的扩展特征由元级程序( m e t a - l e v e lp r o g r a m ) 在编译时指定。元级 程序由编程人员按照o p e nc + + 的m o p 1 0 l l l 编写。这个接口把编译器的内部结构 ( 经过面向对象的抽象) 呈现给编程人员。普通c + + 程序称为基级程序( b a s e - l e v e l p r o g r a m ) ,若没有特别注明,后面提到的源程序、程序等均指基级程序。元级程 序经o p e nc + + 编译器编译后被( 动态或静态地) 链接到o p e n c + + 编译器上。链接 后得到的o p e nc + + 编译器按照元程序指明的方式对基级程序进行转换或分析。如 果没有给出元级程序,o p e nc + + 则与普通的c + + 相同。基级程序被o p e nc + + 根据 元级程序转换后,再与运行时支持代码链接( 用于提供基级程序使用的类和函数) , 最终得到可执行程序。 o p e nc + + 是一个用于对c + + 程序进行分析与转换的工具包。如果使用o p e n 第二章相关理论与技术 c + + 来开发c + + 程序的转换器( t r a n s l a t o r ) 和分析器( a n a l y z e r ) ,用户无需考虑解 析器和类型系统这样的细节。o p e nc 忖还可以为许多其他工具的开发提供支持。 例如用户可以利用o p e nc + + 实现c + + 程序类层次关系的源代码分析器。 2 3 2o p e nc 什的工作原理 o p 吼c + + 编译器的工作过程由三个阶段组成【2 4 】:预处理,从o p e nc + + 到c 抖 的源到源( s o u r c e - t o s o u r t 始) 转换,以及标准c + + 编译器的编译和链接【1 0 】。o p e nc + + m o p 是在第二阶段控制转换的接口,指明o p e nc + + 的扩展特征如何转换成普通的 c 抖代码,参见图2 1 。 c + + 预处理器处理后的基级程序,在o p e nc + + 中被分割成许多代码片断。这 些代码片断由元对象转换后,再重新组合成一个完整的c + + 程序。最后o p e nc + + 将转换后的c + + 程序传递给标准c + + 编译器,比如g n uc + + 。 包含元层代码 代码片断。 元对象 图2 4o p e nc + + 工作原理 在o p e nc + + 中,代码片断f l = j p t r e e ( 抽象语法树) 元对象以分析树的形式表示。 虽然元对象与c 抖中的对象类似,但它们只存在于编译器中,并且代表着基级程序 的元状态,因此称它们为元对象,而不能笼统地称为对象。 2 3 3o p e nc + + m o p 分析 o p e n c + + m o p 属于编译时m o p 的一种【9 】。也就是说o p e n c + + 中的元对象不是 在运行时按照某种指定的方式去解释基级程序,而是在编译时转换基级程序,实 现定制行为。因此o p e nc + + m o p 只需在编译时提供对c + + 中一些关键特性的控制 能力即可。针对对象的每一个基本动作,例如方法调用、数据读写、对象创建等, 1 4 逆向丁程中动静态结合分析目标系统的研究 元对象都有对应的方法,用于定制对象的这一种行为。 o p e nc + + m o p 之所以要按照编译时m o p 的原则进行设计,是因为编译时m o p 具有高性能与充分自定制的特点:不会带来运行时代价;提供了为标准c + + 语言添 加扩展特性的能力。 类似于其他m o p ,在o p e nc + + m o p 中也存在元环【8 】【1 1 1 ( m e t a - c i r c u l a r ) 的概 念。从本质上说,元类和类没有差别,元类只不过是一个可以实例化出类的类( 即 元对象对应于类) 。类与元类的关系等价于对象与类的关系。因此,如果程序中包 含元类的定义,m o p 也会为这些元类构建元对象,以用于控制这些元类的编译过 程。这样就必然会出现“类一元类一元类的元类一”无限延续的现象:为了编 译一个类,其元类必须先被编译;为了编译这个元类,这个元类的元类必须先被 编译。 在o p e nc + + 中,m c l a c l a s s 是c l a s s 的元类,同时c l a s s 子类的元类也必须是 m e t a c l a s s ( c l a s s 的子类从c l a s s 继承元类,因此程序员无需显式的为c l a s s 的子类 声明元类) 。由于m e t a c l a s s 是c l a s s 的子类,因此m e t a c l a s s 的元类就是其自身( 图 2 5 ) 。这样就解决了元环的问题。 ,、 ,” im e t a c l a s s c l a s s 一p o i n t 一一p o - 子类( s u b c l a s s - o f ) 实例( i n s t a n c e - o f ) 图2 5 实例化关系 o p e nc + + 主要提供了五种元对象:l t r e e 元对象、e n v 的蛐e n t 元对象、t y p e l n f o 元对象、c l 鹊s 元对象和m e m b e r 元对象n 1 i t 2 l 【1 3 j 。这些元对象呈现了无法在c 抖中访 问的几个方面。大部分的元对象提供的是内省( i n t r o s p e c t i o n ) 的能力,但也有一 些元对象表现了程序行为方面的特征,并使源到源的转换成为可能。在以后的章 节中我们会分别叙述每种元对象的用法。 2 4 轻量级代码分析 x d r e 需要多种类型的静态信息,这其中有些信息并删o p c nc + + 对程 序源码的词法分析和语法分析就能够获取的,例如类和函数的定义路径信息。对 于这类信息,o p e nc + + 一次解析无法获取,如果进行第二次解析又会增加x d r e 的 时间复杂度和实现难度,这时轻量级的代码分析是一种合适的选择。轻量级代码 第二章相关理论与技术 分析无需生成代码的抽象语法树,只要能够从源代码中获取相关信息即可。这种 技术的使用可以大大提高整个静
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考基础题试题及答案
- 焊丝生产制造项目施工方案
- 300MW风力发电项目投资计划书
- 离婚赔偿协议及财产分割及子女抚养权法律文书范本
- 离婚协议书样本:夫妻共同财产分割与子女抚养权安排
- 山场租赁投资合同范本:林业资源投资合作框架协议
- 储能基地建设项目招商引资报告
- 幼儿园快乐教育教案:食塔食物分类与金字塔搭建
- 红砖建筑垃圾清运方案设计
- 校园设计口罩活动策划方案
- 2024年辽宁省地矿集团招聘真题
- 【《基于哈佛分析框架的爱尔眼科公司财务分析(数据图表论文)》13000字】
- 榆林市无人机管理办法
- 建筑公司安全管理制度范本
- 医保飞检培训
- 物流供应链融资方案计划书范文
- 2025年教学设计与评估能力考试试题及答案
- 亚朵酒店培训
- 医院医疗服务培训
- 农田植物养护方案(3篇)
- 破产清算审计管理制度
评论
0/150
提交评论