编译技术研究与逆向工程实践

: 计算机科学的发展离不开编译技术的支持, 编译技术是计算机领城发展非常成熟的一个分支。逆向工程是软件工 程中 一个 新的 发 展方 向, 近 年来 开 始 被人 们关 注, 氏为一个引 人 入胜的 研究 领城。 反汇编是 软件逆向工 程中 十分重 要的内容, 通过对编译原理的透彻理解, 可以更加科学规范地分析和理解软件系统, 从而更加歌捷地实施逆向工程。通过深入探讨编译原理, 及通过编译技术进行逆向工程实戏, 提出了程序理解的一盘思路, 探索出一条进行逆向工程实戏的较好方法。

关键词: 编译原理; 反汇编; 程序理解; 逆向工程

1

计算机语言之所以能由单一的机器语言发展到现今的数千种高级语言, 主要是因为有了编译技术。编译技术是计算机科学发展得非常迅速和成熟的一个分支, 他集中体现了计算机发展的成果与精华。可以说, 如果没有高级语言, 计算机的推广应用是难以实现的; 而没有编译程序,高级语言就无法使用。逆向工程是指对现有系统进行分析, 以最大的努力去建立比代码抽象层次更高的表达形式。如从目标代码分析求出源代码, 由源代码求详细设计与总体设计, 由总体设计求软件需求分析。反汇编技术是属于软件逆向工程的一个部分。不仅如此, 这里面临的可能是除软件本身之外的更严重的问题。比如在一些 “ 灾难性事故” 中造成的资料( 包括源代码) 的丢失; 或者为分析某些被怀疑有“ 其他目的” 的程序员嵌人的一段未知的逻辑炸弹; 对计算机病毒或某些“ 恶意代码” 的分析; 以及分析编译器和优化工具等的需求。因此有必要也应该重视对这一前沿技术的关注和研究。

2 对编译原理的深入探索

2 . 1 编译原理方法探索

词法分析程序的主要任务: 读源程序, 产生单词符号和滤掉空格。逐个读人源程序字符并按照构词规则切分成一系列单词。单词是语言中具有独立意义的最小单位,包括保留字、 标识符、 运算符、 标点符号和常量等。词法分析是编译过程中的一个阶段, 在语法分析前进行。也可以和语法分析结合在一起作为一遍由语法分析程序调用词法分析程序来获得当前单词供语法分析使用.   

词法分析程序的主要功能是从字符流的源程序中识别单词, 他要从左至右逐个字符地扫描源程序, 因此他还可完成其他一些任务.比如, 滤掉源程序中的注释和空白 ( 由空格, 制表或回车换行字符引起的空白) ; 又比如, 为了使编译程序能将发现的错误信息与源程序的出错位置联系起来, 词法分析程序负责记录新读人的字符行的行号,以便行号与出错信息相联; 再有, 在支持宏处理功能的源语言中, 可以由词法分析程序完成其预处理等。    词法分析程序的功能是读人源程序, 输出单词符号。单词符号是一个程序设计语言的基本语法符号。程序设计语言的单词符号一般可分成下列几种:   

保留字,标识符,常数,运算符,界符,符号,字母表,符号串

 2 . 2 一种符号表的组织方法

 在编译程序工作过程中, 符号表所起的作用反映了符号表的行为特征, 符号表的行为通常主要是符号表的初始化、 符号的登录、 符号的查找和有关分程序结构的符号表层次管理。对符号表的这些管理除初始化之外, 都是动态进行的。符号表的初始化, 就是在对语言程序开始编译的时刻, 定义建立符号表的初始状态.首先要非常清楚地知道, 在编译过程中某个时刻, 符号表的状态反映此时刻被编译的语言程序正被编译的位置的状态.对于具有分程序型结构的语言程序, 不同层次分程序中定义的标识符号具有不同的作用域和不同的可视性规则.通常对于具有分程序结构的语言可用2 种方式组织他们的符号表: 对每个分程序建立一个独立的分表结构的符号表; 把各分程序符号组织在一张单表结构的符号表中。

分程序结构的程序示例, 源程序的形

毛 / / 第一层分程序

    】 nta;

    f l o a tb , d ,

    丈 / / 第二层分程序

           I n tC ;

         f l o a ta ,

{ /第三层分程序

    i n td ;

    f l o a tc 书

    ( / / 第四层分程序

         f l o a td ;

       a 二b 十c 十d ;

         )

       }

  }

2 . 3 基于指令模板匹配的代码生成技术探讨

    为了确定起见, 假设指令结构的文法定义如下:

    I n s t r u c t i o 户 o pA d d r, R e g

    A d d , R e g } @ R e g

    Ad d , c ( R e g ) 1 @ c( R e g )

    Ad d r ~#c

    R e g ~R l } R Z …

    O P ~L o a d } so r e } A d d } Mo v e

在这个指令模式中, 第二地址始终是一个寄存器( 若考虑最一般的情形, 则第二地址也可以是一般地址) 。因此, 定义的指令模板是这样一棵树, 即根是操作码, 左儿子是地址模板, 右儿子是一个寄存器。

其中模板的左部表示指令中的第一地址的所有可能模板。在这里地址又有3 种: 立即地址、 变址地址和寄存器地址; 其中除了立即式外都可以是间接的。

 指令模板好比是多元式中间代码的树型表示。 实际上目标码也可视为四元组, 只不过其第二和第三地址一样而已。

3 设计编译程序的一个思路

编译程序完成从源程序到目标程序的翻译工作, 是一个复杂的整体的过程。从概念上来讲, 一个编译程序的整个工作过程是划分成阶段进行的, 每个阶段将源程序的一种表示形式转换成另一种表示形式, 各个阶段进行的操作在逻辑上是紧密连接在一起的。一般一个编译过程划分成词法分析、 语法分析、 语义分析、 中间代码生成, 中间代码优化和目标代码生成6 个阶段, 这是一种典型的划分方法。编译过程中源程序的各种信息被保留在各种不同的表格里, 编译各阶段的工作都涉及到构造、 查找或更新有关的表格, 因此需要有表格管理的工作; 如果编译过程中发现源程序有错误, 编译程序应报告错误的性质和错误发生的地点, 并且将错误所造成的影响限制在尽可能小的范围内, 使得源程序的其余部分能继续被编译下去, 有些编译程序还能自动校正错误, 这些工作称之为出错处理。

 由于一个编译程序的设计与实现, 不仅要考虑源语言与目标语言, 还要考虑实现该编译程序的书写语言。从2 0 世纪7年代开始逐步有不少编译程序是用高级语言编写, 进而又不断推出编译程序的构造工具, 这些技术的发展对编译程序的实现带来极大的方便, 不仅缩短了开发周期, 提高了开发效率, 而且大大增加了可靠性、 可移植性、 可维护性和可扩充性。主要有编译程序的自展技术、交叉编译、 移植和一些编译程序开发工具的应用。    设计一个编译程序时必须考虑上述3 个方面语言的性质, 因为他们对编译程序的结构和具体实现途径都有很大影响, 源语言的设计和定义往往影响到编译程序的结构。目标语言和目标机的性质决定着源语言到目标语言的映射和代码生成的策略, 而实现语言的性质和实现环境及开发工具的应用对编译程序的可读性, 可移植性和可维护性及可扩充性等有很重要的关系。有时候会涉及到如何把已在某机器上实现的一个高级语言的编译程序能否移植到另一个目标机上。当然用自展技术是可以实现的,问题是我们希望能利用A机器上已有的L语言的编译程序, 实现B机器上的编译程序以缩短开发时间。通常把某个机器( 称为宿主机) 上已有的软件移植到另一台机器( 称为目标机) 上的过程称为移植。在移植过程中也常会用到交叉编译的技术。所谓交叉编译是指把一个源语言在宿主机上经过编译产生目标机的汇编语言或机器语言。交叉编译所产生目标机的汇编语言或机器语言在宿主机上是不能运行, 只能在目标机上运行, 因此, 程序调试比较麻烦。现在我们利用A机器上已有的L语言的编译程序使其在B 机器上也能实现。首先用L语言书写L语言的编译程序产生B机器上的汇编语言或机器语言, 通常也把这种用某语言自己书写自己的编译程序称作自编译程序。然后把自编译程序通过编译最后得到一个编译程序。

  

4 通过编译原理进行逆向工程实践

经过以上分析不难发现, 编译程序把源程序翻译成目标程序, 他本质上是一个处理源程序的程序。他帮我们在源程序和目标程序之间架起了一座桥梁, 那么通过他就可以从此岸到达彼岸。人们根据编译原理, 设计出了反编译程序, 反编译程序是对逆向工程的第一个过程的实现, 他描述了逆向工程把二进制文件翻泽成源代码文件的过程,通过对源代码词法分析和语法分析推导出软件的抽象逻辑, 依此逻辑图去更好地理解遗留系统。因此, 反编译程序是对遗留系统实施逆向工程的利器。不同的高级语言有自己不同的编译程序, 通过深入研究一种编译程序, 就能比较透彻地理解编译原理, 如能对这些知识灵活运用,就能构造出针对某一语言的反编译程序, 从而大大减少人工理解程序的时间, 使可以将遗留系统转化到源代码一级来理解, 这将大大降低逆向工程的难度, 极大地缩短周期。    笔者研究了J O D E这一开放源码的J aa 反编译工具.对J a v逆向变换规则与机制进行了研究, 理解了Jv语言向UML的映射规则实现了J aa过程蓝图到抽象逻辑结构图的逆向映射机制。重点研究了在A L S D的三层结构基础上, 通过分析J a v 源代码, 首先构造J a v语言到AL S D实现层的映射机制; 然后构造实现层到逻辑层的语义聚集; 最后构造逻辑层到概念层的逆向映射规则,设计并创建了一个分析工具, 着重于通过相关的分析, 抽取程序信息, 辅助程序理解。这对于加快工程进度具有重要意义。逆向工程的目的是分析软件, 以更容易理解的抽象层次上来表示他。为了 理解现有的软 件系 统, 无论是静态的还是动态的信息都是有用的。静态信息描述软件的结构,他被写在源代码中。另一方面, 动态的信息描述运行时的行为。当检查面向对象的软件时, 提取有关软件的动态行为信息尤其重要。这是由面向对象的动态本质决定的。这是下一步在J a v逆向工程研究中努力的方向。

[ 1 〕So s t RT i l l e y , Dn n i s BS m i t h . C o m i n gA t t r a c t i o n s i nP r-

    g r mUn d e r s t a n d i n g 〔 R 〕 . P A: Sf t w a r e E n g i n e e r i n gl n s t i t u t e

    C a r n e g i eMe l l o nUn i v e r s i t y , 1 9

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金枝玉叶9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值