一种智能电表的软件一致性检测方法

文档序号:9325767阅读:900来源:国知局
一种智能电表的软件一致性检测方法
【技术领域】
[0001] 本发明主要涉及计算机学科中的固件逆向工程技术、反汇编和反编译技术、嵌入 式系统设计技术,特别是其中的反汇编和反编译技术,具体涉及一种智能电表的软件一致 性检测方法。本发明是对逆向工程技术中软件可靠性问题的合理剖析,可以有效解决智能 电表在生产过程中出现的样品表与批量表的运行差异问题。
【背景技术】
[0002] 在智能电表的生产过程中,往往采用公开招标的方式选择生产商为其制造预定规 格的电表。一旦竞标成功,生产商便生产大批量电表用于投入使用。由于各种因素导致很 难保证大批量电表与样品表的规格完全一致,因而在智能电表投入使用时经常出现工作状 态异常、质量不合格的情况。因此对智能电能表进行软件功能检测工作迫在眉睫。由于在 智能电表测试中发现样品表的质量和功能远远优于批量生产的电表。因此,需要提出一种 智能电表的软件一致性检测方法,并设计出一种智能电能表反汇编仪对两种表型进行比较 鉴别,控制批量生产的智能电能表与样品表的功能和质量误差在一定范围内。

【发明内容】

[0003] 本发明主要是解决现有技术所存在的技术问题;提供了一种用以实现两个智能电 表之间的代码功能比对情况。对比目前市场上出现的比较单一依靠反汇编或者反编译的技 术实例,本发明提出的方法将反汇编与反编译结合,系统地实现了智能电表从机器码到高 级语言的处理,在语法和语义层次上均达到了最完整的蕴涵程度的一种智能电表的软件一 致性检测方法。
[0004] 本发明的上述技术问题主要是通过下述技术方案得以解决的:
[0005] -种智能电表的软件一致性检测方法,其特征在于,包括:
[0006] -个对智能电能表内部机器码提取的步骤:提取智能电能表嵌入式主板的 EEPROM和MCU内部基于二进制表示的机器码;
[0007] -个反汇编的步骤:将二进制表示的机器码转换为基于指定处理器的汇编指令; 依据处理器指令集的类型进行选择静态反汇编算法,具体是:
[0008] 选择一:对于定长指令集,根据每条指令的长度将机器码进行划分,进而判断指令 类型并进行处理;
[0009] 选择二:对于变长指令集,从机器码起始地址开始采取操作码遍历的方式获取第 一个有效操作码,根据该操作码确定当前指令的长度,进而得到下一条指令的起始地址;然 后,使用递归的方法根据下一条指令的起始地址确定下下一条指令的长度……如此循环 下去,最终得到所有指令的操作码长度和指令长度,根据这些信息判断指令类型并进行处 理;
[0010] -个中间语言优化的步骤:将指定处理器的不同格式的汇编指令统一为一种中间 指令表示,以便于接下来反编译流程的运作;将反汇编得到的汇编指令按照类别进行处理: 对于赋值类指令(如加、减、乘、除运算等),将其直接转换为相应的运算表达式;对于无条 件转移指令JMP,直接使用C语言中的GOTO语句替代;对于有条件转移指令,保留其语句不 变,直接由程序流分析模块进行处理;对于CALL过程调用,直接构造子函数进行抽象;对于 返回指令RET和堆栈指令PUSH和POP,保留其语句不变,直接由控制流分析模块进行处理; 对于其它指令,由于没有显式的高级语言对应语句,故直接略去;
[0011] 一个反编译的步骤:反编译的目的是进行中间语言到C语言的转换,分为前端, 数据流分析和后端;
[0012] -个代码结构分析的步骤:完成对反编译产生的高级语言(即由反编译步骤7得 到的C语言)中的代码结构的抽象化,即所谓的控制流分析;其实现过程包括:产生一组包 含各类信息的节点结构的中间文件解析模块、在画布特定位置绘制相应的图形,矩形或者 菱形的函数绘制模块、将函数绘制模块绘制出来的图形,按照特定的规则连接起来,从而形 成控制流图函数连线模块;具体方法是:
[0013] 步骤1 :由中间文件解析模块产生一组包含各类信息的节点结构,详细步骤如下:
[0014] 步骤I. 1 :打开输入文件,获取输入文件流;通过调用C++中库函数fopenO,并选 择rt模式,即打开文本文件,允许读与写;
[0015] 步骤1. 2 :初始化节点信息;
[0016] 步骤1. 3 :解析文件的输入流,以while语句进行遍历,直至遍历至文件结束标记 符;
[0017] 步骤1. 4 :在遍历时,碰到换行符时将节点中funid属性加一,并且记录每一行的 起始的空格数目,并将结果作为节点的deep属性;
[0018] 步骤1. 5 :调用私有函数GetName获取每个节点的名字;在GetName函数中我们需 要特殊处理含有if, switch, while, else关键字的节点;在遍历到此类节点的时候,我们去 除这些关键字,而只留下剩余的信息,即判断条件;与此同时,修改节点中的type信息,根 据关键字的不同,修改为 IFTYPE, WHILETYPE, SWITCHTYPE, ELSETYPE ;
[0019] 步骤1. 6 :为ELSETYPE类型的节点找到与其配对的IFTYPE类型的节点;
[0020] 步骤1. 7 :为节点添加父节点和孩子节点信息;其中获取孩子节点信息的方法为, 向下遍历,直到碰到深度比本节点小于等于的节点则停止遍历,否则将深度比自己大一的 节点加入孩子节点数组;获取其父节点信息的方法为,向上遍历,直到找到第一个深度小于 本节点的函数节点,则为双亲节点;
[0021] 步骤I. 8 :IF、WHILE、SWITCH模块结束位置确定;中间文件解析后,产生的结果为 一组包含各类信息的节点结构;
[0022] 步骤2 :函数绘制模块在画布特定位置绘制相应的图形,矩形或者菱形,详细步骤 如下:
[0023] 步骤:2. 1 :遍历经过中间文件解析模块后的节点信息,当此节点拥有孩子节点并 且此节点的类型为FUNTYPE时,将此节点作为新的一行的起始节点;
[0024] 步骤2. 2 :计算每一行起始节点的Y轴方向的偏移量;这个偏移量由两个方面的 因素所主导;其一,起始行节点的序列;其二,在此节点之前,若其他行中含有IFTYPE节点, ELSETYPE节点,WHILETYPE节点,SWITCHTYPE节点,那么需特别计算偏移量,因为以上这些 节点都会在Y轴方向存在增量;
[0025] 步骤2. 3 :计算新行首节点之后,绘制首节点图像,即矩形;
[0026] 步骤2. 4 :将首节点位置信息,填入状态信息结构体中;
[0027] 步骤2. 5 :在步骤三绘制的矩形框中间添加函数名称信息;
[0028] 步骤2. 6 :遍历新行的首节点的子孩子节点,绘制子孩子节点形状;
[0029] 步骤2. 7 :绘制子孩子节点时,首先确定子孩子节点的位置信息,其次判断子孩子 节点的类型信息;子孩子节点的位置信息也会由其之前的IFTYPE节点,ELSETYPE节点, WHILETYPE节点,SWITCHTYPE节点所影响,例如ELSETYPE类型的节点会出现在下面的一行 中,因此ELSETYPE类型节点的子孩子,不应该算在偏移量中;确定位置信息之后,为孩子节 点添加名称;
[0030] 步骤3 :函数连线模块将函数绘制模块绘制出来的图形,按照特定的规则连接起 来,从而形成控制流图,详细步骤如下:
[0031 ] 步骤:3. 1 :寻找每一行的起始节点,并将起始节点的出口坐标传递;
[0032] 步骤3. 2 :遍历起始节点的孩子节点;子孩子节点可能有五种情况,分别是: IFTYPE,WHILETYPE,ELSETYPE,SWITCHTYPE,FUNCTYPE,具体是:
[0033] 条件情况一 =IFTYPE情况下分为两部分,原因是IFTYPE和ELSETYPE不一定成对 出现;在IFTYPE情况下,首先将IFTYPE节点与传递进来的出口坐标相连,接下来对IFTYPE 节点的子孩子进行遍历,遍历之后获取最后一个节点的横坐标,并将该横坐标值与IFTYPE 节点中标记的终止节点相连接;其次处理不含有ELSETYPE节点的IFTYPE节点;先计算此 IF块中含有多少个IFTYPE,多少个WHILETYPE,以及多少个SWITCHTYPE ;将这作为转折点的 纵坐标偏移量;并将此转折点与IFTYPE节点菱形的下部节点相连,代表着不满足IFTYPE节 点的路径;
[0034] 条件情况二:WHILETYPE情况下,首先将WHILETYPE节点与传递进来的出口坐标相 连,接下来对WHILETYPE节点的子孩子进行遍历,遍历之后获取最后一个节点的横坐标,并 将该横坐标值与WHILETYPE节点中标记的终止节点相连接;其次在WHILETYPE类型的菱形 节点的上部作为一个出口节点,接下来计算WHILETYPE类型节点函数域内是否包含有其他 WHILETYPE类型节点,以及这些节点的数目;将WHILETYPE节点的数目作为偏移量,从而在 菱形上部确定转折点纵坐标位置,此条连线代表不满足判断条件所走路径;在菱形下部的 顶点引出一条折线,代表在满足条件之后返回WHILETYPE节点,再次进行判断条件;
[0035] 条件情况三:ELSETYPE情况下,首先找到与其配对的IFTYPE节点,在找到与其配 对的IFTYPE节点之后,再次计算IFTYPE节点块中含有多少个IFTYPE,多少个WHILETYPE, 以及多少个SWITCHTYPE,以这些作为偏移量在IFTYPE节点的下方确定ELSETYPE节点的坐 标;接下来将ELSETYPE节点与IFTYPE菱形节点的下部相连接;随后遍历ELSETYPE节点的 子孩子节点;
[0036] 条件情况四:SWITCHTYPE情况下,首先将SWITCHTYPE节点与传递进来的出口坐标 相连接,接下来对SWITCHTYPE节点的子孩子进行遍历,遍历之后,获取最后一个节点的横 坐标值,并将横坐标值与S
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1