一种基于汇编程序构造语义流程图的方法

文档序号:6460405阅读:127来源:国知局
专利名称:一种基于汇编程序构造语义流程图的方法
技术领域
本发明属于软件逆向工程技术领域,主要是实现了一种基于特定硬件平台(C166平台)的,由汇编程序构造语义流程图的方法。
技术背景软件逆向工程是分析已有的程序,寻求比源代码更高级的抽象表现形式。 一般认为,凡是在软件生命周期内的,将软件某种形式的描述转换为更抽象形 式的活动都可称为逆向工程。语义流程图是人们对解决问题的方法、思路或算法的一种描述。由于语义 流程图具有符号规划、画法简单、结构清晰、逻辑性强、便于描述及容易理解 的特点,它在描述程序流程的方面具有十分广泛的运用。由于汇编语言依赖底层硬件,功能抽象层次极低导致了其可读性差的特点, 通过一定的技术手段将可读性差的汇编代码转化为可读性好的语义流程图,有 利于提高开发效率,降低代码维护成本。目前,市场上占有率较高的反编译工具主要有SHUDepb,jad,Reflactor等。 这些反编译工具绝大多数都是针对特定的高级语言,如VB, C#, Delphi, Java等 进行反编译。而对于极其灵活的、多用于编写系统级程序的C语言的反编译工 作,目前还没有非常成熟的工具。尤其是对于某些特定的处理芯片开发的汇编 语言,如C166,HCS12等平台的汇编语言,将其反编译成C语言的难度更大。 同时,多数反编译工具的分析结果不以语义流程图形式展示,仍然没有解决可 读性较差的问题。 发明内容本发明要解决现有反编译工具存在的缺陷,提供一种简单,快速的基于C166硬件平台的汇编程序构造语义流程图的方法。本发明采用的技术方案为 一种基于汇编程序构造语义流程图的方法,其 特征在于该方法包括将所有汇编指令分为关键流程指令与非关键流程指令两种类型; 通过核心语句判定和相邻操作数判定,将汇编指令聚合成不同的汇编指令 块;由汇编指令块生成流程图语义块;将流程图语义块进行连线,绘制流程图。进一步的,所述方法基于C166硬件平台。进一步的,所述核心语句指能够影响C166平台上PSW寄存器,并具有实 际计算能力的指令;所述相邻操作数判定指以核心语句为中心,同时顺序和逆 序搜索具有与核心语句相同操作数的非核心语句,直至搜索到有新的核心语句 或无相邻的操作数为止,将遍历到的汇编指令聚合成不同的汇编指令块。更进一步的,所述非核心语句包括赋值,读取等指令。进一步的,具体包括如下步骤1) 建立C166跳转、函数调用返回类指令集合J;2) 搜索C166汇编程序,将属于指令集合J的C166指令加入到关键流程 指令集合K;3) 根据K中跳转类指令的操作数,计算这些跳转指令的目标地址;4) 读取目标地址的指令,加入关键流程指令集合K;5) 对于K中的每一条跳转类指令C (不包括跳转目标指令),执行以下处 理判断是否为无条件跳转指令(跳转指令的第一操作数为cc一UC),若条件成 立,则将指令C加入到已处理指令集合S,并进入7);若条件不成立,则记录 决定跳转与否的C166状态寄存器(PSW)的状态,并逆序搜索与C最近的,有 能力改变该PSW的核心语句X;6) 记录X的操作数,顺序和逆序遍历具有操作数传递关系的非核心语句, 直至遇到新的核心语句,或无相邻操作数,并将所有遍历到的语句加入已处理指令集合S,所述传递关系定义如下在顺序搜索时,该参数与顺序下一句源 操作数相同;逆序搜索时,该参数与逆序上一句目标操作数相同;7) 根据汇编指令块的核心语句确定语义流程图块的语义,生成对应的语义 流程图块;8) 对于尚未处理的指令,从目标汇编程序起始位置顺序搜索核心语句X, 对于每次遇到的核心指令,重复6的步骤,并将遍历到的汇编指令聚合成汇编 指令块,生成语义流程图块;9) 对于余下的指令,每一条汇编指令生成一个语义流程图块;10) 将语义流程图块进行连线,绘制流程图。 下面对本发明作进一步的描述本发明所采用的技术方法将所有C166指令分为两种类型关键流程指令 与非关键流程指令。区分的标志在于前者能够影响程序的顺序执行流程(包括 被这些指令影响的其它指令),而后者则不能。在默认状态下,执行完一条C166 指令后,将继续执行与其相邻的下一条指令, 一旦遇到跳转类指令,则将根据 跳转类指令的操作数计算目标跳转地址。本发明将使用这类跳转指令的C166 语句与跳转目标语句定义为关键流程语句,而将其它语句定义为非关键流程语 句。再根据关键流程语句提取整个程序的流程图框架,即在关键流程语句处有 流程图流向的转出或转入,而在非关键流程语句处只有流程的顺序转移。然后,需要对流程图进行语义生成。从高级语言编译生成汇编语言时,同 一条高级语言编译后得到的汇编代码是相邻的。同理,在反编译时需要搜索相 邻的汇编代码,根据一定原则判断该部分代码是否由一条高级语言编译生成。 判定步骤主要包括两步核心语句判定与相邻操作数判定。核心语句判定指挑 选汇编语言中具有实际运算功能的指令(跳转类指令除外),如加、减、乘、移 位操作等;相邻操作数判定指以核心语句为中心,同时顺序和逆序搜索具有与 核心语句相同操作数的非核心语句,如赋值,读取等,直至搜索到有新的核心 语句,或无相邻的操作数为止。然后将搜索到的汇编指令块进行语义聚合,生成流程图语义块。本发明具有如下优点1、 本发明把汇编指令分为关键流程指令与非关键流程指令,对应地将流 程图的结构划分为跳转执行结构与顺序执行结构,简化了复杂流程图在作 图时的难度。2、 本发明通过特定的语义分析方法,将可读性差的汇编指令聚合成可读 性好的语义流程图块,汇编指令的执行顺序也一目了然,大大提高了阅读 汇编代码的效率。这种效率的提升在分析大量汇编代码时尤其明显。


图1C166指令集划分示意图。 图2相邻操作数判定流程图。 图3相邻操作数判定示例。 图4语义生成模块组成示意图。 图5判断型跳转指令语义生成流程图。 图6判断型跳转指令语义示例。 图7强制跳转指令语义生成流程图。 图8运算类指令语义生成流程图。
具体实施方式
下面结合附图对发明作进一步介绍。图1指出了本发明将C166平台汇编指令划分为多个集合的情况。首先将 C166指令集划分为关键流程语句与非关键流程语句,再将非关键流程语句划分 为核心语句与非核心语句。关键流程语句与非关键流程语句划分的标准为将 所有跳转、函数调用返回类指令以及跳转目标指令划入关键流程语句,其余都 归入非关键流程语句。跳转、函数调用返回类指令包括JB, JNB, JBC, JBNS, JMPA, JMPS, JMPI, JMPR, CALLA, CALLI, CALLR, CALLS, PCALL, TRAP, RET, RETS, RETP,RETI。其次将非关键语句划分为核心语句与非核心语句,两者划分的标准为核心语句为能够影响C166平台上PSW寄存器,并具有实际计算能力的指令,其 余都归入非核心语句。C166平台的核心语句包括计算指令(ADD, ADDB, ADDC, ADDCB, SUB, SUBB, SUBC, SUBCB, MUL, MULU, DIV, DIVL, DIVLU, DIVU, CPL, CPLB, NEG, NEGB,)、逻辑指令(AND, ANDB, OR, ORB, XOR, XORB),布尔位操作指 令(BCLR, BSET, BMOV, BMOVN, BAND, BOR, BXOR, BCMP, BFLDH, BFLDL, CMP,CMPB, CMPD1, CMPD2, CMPIl, CMPI2),移位指令(SHL, SHR, ROL,ROR, ASHR)。C166平台的非核心语句包括数据移动指令(MOV, MOVB, MOVBS, MOVBZ),系统堆栈指令(POP, PUSH, SCXT),系统控制指令(SRST, IDLE, PWRDN, SRVWDT, DISWDT, EINIT, ATOMIC, EXTR, EXTP, EXTPR, EXTS, EXTSR),和杂项指令(NOP)。图2指出了相邻操作数判定的流程。针对一条核心语句,以该语句为中心, 进行逆序(顺序)遍历,若操作数存在逆序(顺序)链式关系,且未遇到新的核心语 句,则遍历继续,直到上述判定条件不成立,由此界定语义生成块的上(下)边 界。图3指出了相邻操作数判定的一个示例。在确定核心语句后,同时顺序和 逆序遍历语句。如图3所示:在确定了核心指令382CC之后,同时逆序(由382CE 向上),顺序(由382CA向下),搜索相邻的,与核心指令的操作数有交集的,保 持操作数逆序(顺序)链式关系的指令。结合图3的例子,具体操作步骤如下1、 建立操作数集合S,将核心指令的操作数置入有序集合S (放入R12, #1);2、 逆序搜索与S有交集的指令,并判断该指令的操作数是否与S呈链 式关系。如对于指令382CA,其操作数为R12, 0F900H,与S存在交集R12;3、 判断R12是否存在链式关系,即在逆序搜索时,交集中的操作数必 须为待判定指令的目标操作数.指令382CA满足要求,则将382CA的目 标操作数,同时也是指令与集合的交集R12从集合中删除,将382CA 的源操作数置入集合S中(图3中为0F900H),继续逆向搜索直至满足 以下两个终止条件(a),待判定指令的操作数与S无交集;(b)待判定 指令操作数与S有交集,但不呈链式关系;4、 顺序搜索与S有交集的指令(这里的S为未经置换操作的原始集合, 即R12,W),并判断该指令的操作数是否与S呈链式关系。与逆序搜索 不同的是,判断链式关系时,有交集时的操作数为待判定指令的源操作 数时方满足链式关系,其余步骤同逆系搜索;5、 最终得到经过多次置换过后的集合S'。图4指出了语义生成的四大模块,包括判断跳转类指令语义生成,强制跳 转类指令语义生成,计算类指令语义生成和其它类指令语义生成。图5指出了判断型跳转指令语义生成的流程,对于判断型跳转指令,逆序 搜索汇编代码,并判断该指令是否有能力影响PSW寄存器,若否则继续逆向 搜索,若是则通过图2所描述的相邻操作数判定方法确定语义生成边界,并进 行语义生成。图6指出了本发明针对判断型跳转语句生成语义流程图块示例。判断型跳 转语句一般由一句条件跳转语句, 一句或多句能够影响程序状态寄存器(决定 是否跳转的条件寄存器)的汇编指令,以后一句或多句相邻代码组成。具体步 骤如下1、 读取条件跳转语句的第一个操作数,跳转判定条件为当程序状态寄存器 中Zero位为1时进行跳转(2DFE0);2、 逆序搜索汇编指令,找到离该跳转语句最近的,并能影响程序状态寄存 器Zero位的指令(2DFDC);3、以2DFDC指令为核心语句,根据相邻操作数判定原则得到的有序集合S',并结合跳转指令的语义,生成语义流程图块。 图7指出了本发明针对强制跳转语句生成语义流程图块示例。强制跳转语 句不需要进行条件判断,当程序执行到该位置时强行跳转,则在生成语义流程 图块时,只需将强制跳转语句与其相邻语句分隔即可。图8指出了本发明针对运算类语句生成语义流程图块示例。运算类语句由 一条核心语句和其相邻语句组成,按相邻操作数判定原则,并结合运算类语句 的语义,生成语义流程图块。对于其它类型指令的语义生成,则按照一条C166指令对应一个流程图语 义块的结构进行生成。本发明的具体实施步骤如下-1、 建立C166跳转、函数调用返回类指令集合J;2、 搜索C166汇编程序,将属于指令集合J的C166指令加入到关键流程指 令集合K;3、 根据K中跳转类指令的操作数,计算这些跳转指令的目标地址;4、 读取目标地址的指令,加入关键流程指令集合K;5、 对于K中的每一条跳转类指令C (不包括跳转目标指令),执行以下处理: 判断是否为无条件跳转指令(跳转指令的第一操作数为cc一UC),若条件成立, 则将指令C加入到已处理指令集合S,并进入7;若条件不成立,则记录决定 跳转与否的C166状态寄存器(PSW)的状态,并逆序搜索与C最近的,有能力 改变该PSW的核心语句X;6、 记录X的操作数,顺序和逆序遍历具有操作数传递关系的非核心语句, 直至遇到新的核心语句,或无相邻操作数,并将所有遍历到的语句加入已处理 指令集合S,所述传递关系定义如下在顺序搜索时,该参数与顺序下一句源 操作数相同;逆序搜索时,该参数与逆序上一句目标操作数相同;7、 根据汇编指令块的核心语句确定语义流程图块的语义,生成对应的语义流程图块;8、 对于尚未处理的指令,从目标汇编程序起始位置顺序搜索核心语句X,对于每次遇到的核心指令,重复6的步骤,并将遍历到的汇编指令聚合成汇编 指令块,生成语义流程图块;9、 对于余下的指令,每一条汇编指令生成一个语义流程图块;10、 将语义流程图块进行连线,绘制流程图。
权利要求
1.一种基于汇编程序构造语义流程图的方法,其特征在于该方法包括将所有汇编指令分为关键流程指令与非关键流程指令两种类型;通过核心语句判定和相邻操作数判定,将汇编指令聚合成不同的汇编指令块;由汇编指令块生成流程图语义块;将流程图语义块进行连线,绘制流程图。
2. 根据权利要求l所述的一种基于汇编程序构造语义流程图的方法,其特征在 于所述方法基于C166硬件平台。
3. 根据权利要求l所述的基于汇编程序构造语义流程图的方法,其特征在于所述核心语句指能够影响C166平台上PSW寄存器,并具有实际计算能力的指 令;所述相邻操作数判定指以核心语句为中心,同时顺序和逆序搜索具有与核 心语句相同操作数的非核心语句,直至搜索到有新的核心语句或无相邻的操作 数为止,将遍历到的汇编指令聚合成不同的汇编指令块。
4. 根据权利要求3所述的基于汇编程序构造语义流程图的方法,其特征在于 所述非核心语句包括赋值,读取等指令。
5. 根据权利要求l所述的基于汇编程序构造语义流程图的方法,其特征在于 具体包括如下步骤1) 建立C166跳转、函数调用返回类指令集合J;2) 搜索C166汇编程序,将属于指令集合J的C166指令加入到关键流程指 令集合K;3) 根据K中跳转类指令的操作数,计算这些跳转指令的目标地址;4) 读取目标地址的指令,加入关键流程指令集合K;5) 对于K中的每一条跳转类指令C,不包括跳转目标指令,执行以下处理: 判断是否为无条件跳转指令,若条件成立,则将指令C加入到已处理指令^合S,并进入7);若条件不成立,则记录决定跳转与否的C166状态PSW寄存器的状态,并逆序搜索与C最近的,有能力改变该PSW的核心语句X;6) 记录X的操作数,顺序和逆序遍历具有操作数传递关系的非核心语句,直至遇到新的核心语句,或无相邻操作数,并将所有遍历到的语句加入已处理指令集合S,所述传递关系定义如下在顺序搜索时,该参数与顺序下一句源 操作数相同;逆序搜索时,该参数与逆序上一句目标操作数相同;7) 根据汇编指令块的核心语句确定语义流程图块的语义,生成对应的^义 流程图块;8) 对于尚未处理的指令,从目标汇编程序起始位置顺序搜索核心语句X, 对于每次遇到的核心指令,.重复6)的步骤,并将遍历到的汇编指令聚合成汇 编指令块,生成语义流程图块;9) 对于余下的指令,每一条汇编指令生成一个语义流程图块; 10) 将语义流程图块进行连线,绘制流程图。
全文摘要
本发明属于软件逆向工程技术领域,主要是实现了一种基于特定硬件平台(C166平台)的,由汇编程序构造语义流程图的方法。本发明要解决现有反编译工具存在的缺陷,提供一种基于汇编程序构造语义流程图的方法,其特征在于该方法包括将所有汇编指令分为关键流程指令与非关键流程指令两种类型;通过核心语句判定和相邻操作数判定,将汇编指令聚合成不同的汇编指令块;由汇编指令块生成流程图语义块;将流程图语义块进行连线,绘制流程图。本发明简化了复杂流程图在作图时的难度;汇编指令的执行顺序也一目了然,大大提高了阅读汇编代码的效率。这种效率的提升在分析大量汇编代码时尤其明显。
文档编号G06F9/45GK101231598SQ200810059628
公开日2008年7月30日 申请日期2008年1月30日 优先权日2008年1月30日
发明者攀 吕, 吴朝晖, 博 胡, 坚 赵, 赵民德, 凯 黄 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1