CN105044653A - 一种智能电表的软件一致性检测方法 - Google Patents
一种智能电表的软件一致性检测方法 Download PDFInfo
- Publication number
- CN105044653A CN105044653A CN201510371954.8A CN201510371954A CN105044653A CN 105044653 A CN105044653 A CN 105044653A CN 201510371954 A CN201510371954 A CN 201510371954A CN 105044653 A CN105044653 A CN 105044653A
- Authority
- CN
- China
- Prior art keywords
- node
- code
- iftype
- instruction
- information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明涉及一种智能电表的软件一致性检测方法,主要以计算机学科中的固件逆向工程技术、反汇编和反编译技术、嵌入式系统设计技术为指导理论,针对智能电表在生产过程中出现的样品表和批量表运行时差异问题,深入分析了表征电表运行差异的内部核心代码,进而通过反汇编和反编译手段实现了两种类型电表的软件一致性检测。利用本发明的方法可以有效解决不同的智能电表的软件一致性问题。例如:在维护电力企业已使用电表时,使用本发明中的方法,可以控制拟投产电表与已使用电表功能和质量误差在±20%范围内。
Description
技术领域
本发明主要涉及计算机学科中的固件逆向工程技术、反汇编和反编译技术、嵌入式系统设计技术,特别是其中的反汇编和反编译技术,具体涉及一种智能电表的软件一致性检测方法。本发明是对逆向工程技术中软件可靠性问题的合理剖析,可以有效解决智能电表在生产过程中出现的样品表与批量表的运行差异问题。
背景技术
在智能电表的生产过程中,往往采用公开招标的方式选择生产商为其制造预定规格的电表。一旦竞标成功,生产商便生产大批量电表用于投入使用。由于各种因素导致很难保证大批量电表与样品表的规格完全一致,因而在智能电表投入使用时经常出现工作状态异常、质量不合格的情况。因此对智能电能表进行软件功能检测工作迫在眉睫。由于在智能电表测试中发现样品表的质量和功能远远优于批量生产的电表。因此,需要提出一种智能电表的软件一致性检测方法,并设计出一种智能电能表反汇编仪对两种表型进行比较鉴别,控制批量生产的智能电能表与样品表的功能和质量误差在一定范围内。
发明内容
本发明主要是解决现有技术所存在的技术问题;提供了一种用以实现两个智能电表之间的代码功能比对情况。对比目前市场上出现的比较单一依靠反汇编或者反编译的技术实例,本发明提出的方法将反汇编与反编译结合,系统地实现了智能电表从机器码到高级语言的处理,在语法和语义层次上均达到了最完整的蕴涵程度的一种智能电表的软件一致性检测方法。
本发明的上述技术问题主要是通过下述技术方案得以解决的:
一种智能电表的软件一致性检测方法,其特征在于,包括:
一个对智能电能表内部机器码提取的步骤:提取智能电能表嵌入式主板的EEPROM和MCU内部基于二进制表示的机器码;
一个反汇编的步骤:将二进制表示的机器码转换为基于指定处理器的汇编指令;依据处理器指令集的类型进行选择静态反汇编算法,具体是:
选择一:对于定长指令集,根据每条指令的长度将机器码进行划分,进而判断指令类型并进行处理;
选择二:对于变长指令集,从机器码起始地址开始采取操作码遍历的方式获取第一个有效操作码,根据该操作码确定当前指令的长度,进而得到下一条指令的起始地址;然后,使用递归的方法根据下一条指令的起始地址确定下下一条指令的长度……如此循环下去,最终得到所有指令的操作码长度和指令长度,根据这些信息判断指令类型并进行处理;
一个中间语言优化的步骤:将指定处理器的不同格式的汇编指令统一为一种中间指令表示,以便于接下来反编译流程的运作;将反汇编得到的汇编指令按照类别进行处理:对于赋值类指令(如加、减、乘、除运算等),将其直接转换为相应的运算表达式;对于无条件转移指令JMP,直接使用C语言中的GOTO语句替代;对于有条件转移指令,保留其语句不变,直接由程序流分析模块进行处理;对于CALL过程调用,直接构造子函数进行抽象;对于返回指令RET和堆栈指令PUSH和POP,保留其语句不变,直接由控制流分析模块进行处理;对于其它指令,由于没有显式的高级语言对应语句,故直接略去;
一个反编译的步骤:反编译的目的是进行中间语言到C语言的转换,分为前端,数据流分析和后端;
一个代码结构分析的步骤:完成对反编译产生的高级语言(即由反编译步骤7得到的C语言)中的代码结构的抽象化,即所谓的控制流分析;其实现过程包括:产生一组包含各类信息的节点结构的中间文件解析模块、在画布特定位置绘制相应的图形,矩形或者菱形的函数绘制模块、将函数绘制模块绘制出来的图形,按照特定的规则连接起来,从而形成控制流图函数连线模块;具体方法是:
步骤1:由中间文件解析模块产生一组包含各类信息的节点结构,详细步骤如下:
步骤1.1:打开输入文件,获取输入文件流;通过调用C++中库函数fopen(),并选择rt模式,即打开文本文件,允许读与写;
步骤1.2:初始化节点信息;
步骤1.3:解析文件的输入流,以while语句进行遍历,直至遍历至文件结束标记符;
步骤1.4:在遍历时,碰到换行符时将节点中funid属性加一,并且记录每一行的起始的空格数目,并将结果作为节点的deep属性;
步骤1.5:调用私有函数GetName获取每个节点的名字;在GetName函数中我们需要特殊处理含有if,switch,while,else关键字的节点;在遍历到此类节点的时候,我们去除这些关键字,而只留下剩余的信息,即判断条件;与此同时,修改节点中的type信息,根据关键字的不同,修改为IFTYPE,WHILETYPE,SWITCHTYPE,ELSETYPE;
步骤1.6:为ELSETYPE类型的节点找到与其配对的IFTYPE类型的节点;
步骤1.7:为节点添加父节点和孩子节点信息;其中获取孩子节点信息的方法为,向下遍历,直到碰到深度比本节点小于等于的节点则停止遍历,否则将深度比自己大一的节点加入孩子节点数组;获取其父节点信息的方法为,向上遍历,直到找到第一个深度小于本节点的函数节点,则为双亲节点;
步骤1.8:IF、WHILE、SWITCH模块结束位置确定;中间文件解析后,产生的结果为一组包含各类信息的节点结构;
步骤2:函数绘制模块在画布特定位置绘制相应的图形,矩形或者菱形,详细步骤如下:
步骤:2.1:遍历经过中间文件解析模块后的节点信息,当此节点拥有孩子节点并且此节点的类型为FUNTYPE时,将此节点作为新的一行的起始节点;
步骤2.2:计算每一行起始节点的Y轴方向的偏移量;这个偏移量由两个方面的因素所主导;其一,起始行节点的序列;其二,在此节点之前,若其他行中含有IFTYPE节点,ELSETYPE节点,WHILETYPE节点,SWITCHTYPE节点,那么需特别计算偏移量,因为以上这些节点都会在Y轴方向存在增量;
步骤2.3:计算新行首节点之后,绘制首节点图像,即矩形;
步骤2.4:将首节点位置信息,填入状态信息结构体中;
步骤2.5:在步骤三绘制的矩形框中间添加函数名称信息;
步骤2.6:遍历新行的首节点的子孩子节点,绘制子孩子节点形状;
步骤2.7:绘制子孩子节点时,首先确定子孩子节点的位置信息,其次判断子孩子节点的类型信息;子孩子节点的位置信息也会由其之前的IFTYPE节点,ELSETYPE节点,WHILETYPE节点,SWITCHTYPE节点所影响,例如ELSETYPE类型的节点会出现在下面的一行中,因此ELSETYPE类型节点的子孩子,不应该算在偏移量中;确定位置信息之后,为孩子节点添加名称;
步骤3:函数连线模块将函数绘制模块绘制出来的图形,按照特定的规则连接起来,从而形成控制流图,详细步骤如下:
步骤:3.1:寻找每一行的起始节点,并将起始节点的出口坐标传递;
步骤3.2:遍历起始节点的孩子节点;子孩子节点可能有五种情况,分别是:IFTYPE,WHILETYPE,ELSETYPE,SWITCHTYPE,FUNCTYPE,具体是:
条件情况一:IFTYPE情况下分为两部分,原因是IFTYPE和ELSETYPE不一定成对出现;在IFTYPE情况下,首先将IFTYPE节点与传递进来的出口坐标相连,接下来对IFTYPE节点的子孩子进行遍历,遍历之后获取最后一个节点的横坐标,并将该横坐标值与IFTYPE节点中标记的终止节点相连接;其次处理不含有ELSETYPE节点的IFTYPE节点;先计算此IF块中含有多少个IFTYPE,多少个WHILETYPE,以及多少个SWITCHTYPE;将这作为转折点的纵坐标偏移量;并将此转折点与IFTYPE节点菱形的下部节点相连,代表着不满足IFTYPE节点的路径;
条件情况二:WHILETYPE情况下,首先将WHILETYPE节点与传递进来的出口坐标相连,接下来对WHILETYPE节点的子孩子进行遍历,遍历之后获取最后一个节点的横坐标,并将该横坐标值与WHILETYPE节点中标记的终止节点相连接;其次在WHILETYPE类型的菱形节点的上部作为一个出口节点,接下来计算WHILETYPE类型节点函数域内是否包含有其他WHILETYPE类型节点,以及这些节点的数目;将WHILETYPE节点的数目作为偏移量,从而在菱形上部确定转折点纵坐标位置,此条连线代表不满足判断条件所走路径;在菱形下部的顶点引出一条折线,代表在满足条件之后返回WHILETYPE节点,再次进行判断条件;
条件情况三:ELSETYPE情况下,首先找到与其配对的IFTYPE节点,在找到与其配对的IFTYPE节点之后,再次计算IFTYPE节点块中含有多少个IFTYPE,多少个WHILETYPE,以及多少个SWITCHTYPE,以这些作为偏移量在IFTYPE节点的下方确定ELSETYPE节点的坐标;接下来将ELSETYPE节点与IFTYPE菱形节点的下部相连接;随后遍历ELSETYPE节点的子孩子节点;
条件情况四:SWITCHTYPE情况下,首先将SWITCHTYPE节点与传递进来的出口坐标相连接,接下来对SWITCHTYPE节点的子孩子进行遍历,遍历之后,获取最后一个节点的横坐标值,并将横坐标值与SWITCHTYPE节点中标记的终止节点相连接;
条件情况五:FUNTYPE情况下,直接将上一节点传递进来的出口坐标,与自身的入口坐标相连接,并将本节点的出口坐标传递出去;
一个软件差异率分析的步骤:对于两块不同的智能电表,考察其软件功能差异时,将程序内部调用关系图抽象为树或者图,这样对程序的差异比较转化为对两个树形结构的比较;具体的度量方法如下:将程序抽象为两个树形结构A和B,其中顶点V表示函数,边E表示函数调用关系;分别统计两棵树的顶点个数和边的个数;两端程序的差异率P可以用树A和树B的差异率Tr(p)表示;设定阈值T=20%,若Tr(p)<T,则认为两段程序功能一致;若Tr(p)>T,则认为两段程序功能存在差异。
在上述的一种智能电表的软件一致性检测方法,所述反编译的步骤具体包括以下子步骤:
步骤1,判断输入汇编代码的完整性:对于反编译器,输入的中间指令代码遵循固定的格式,如图3所示;如果输入的中间指令代码不遵循这个格式,可以认为输入只是一个小程序段,而不是完整的电表代码;
步骤2,生成控制流图:这一步的目的是为源程序构造一个调用图,并且为程序的每个子程序构造一个基本块控制流向图;简而言之,这一步的目的是把中间代码分成多个结构,即划分函数以及调用关系;
步骤3,优化中间代码,产生C文件,C文件用于作为步骤4的输入:中间代码优化主要指的是清除无关指令,清除掉低级语言概念之条件码、寄存器和中间过渡的指令,并引进多于两个操作数的表达式高级概念;这一步产生的代码是高级汇编代码,已看不出汇编的语法痕迹,但是还不是C语言代码;这一步的各个步骤如下:
3.1死寄存器清除
如果一个变量的数值在它定义之后没有被使用,那么在程序中该标识符此时是死的;可以认为,定义一个死的标识符的指令是无用的,因此可以从代码中被清除掉;
3.2死条件码清除
类似于死寄存器清除;
3.3寄存器变量清除
用变量代替寄存器,一个例子如图4所示,原汇编指令中的寄存器SI和DI被局部变量loc1和loc2代替;
步骤4,数据流分析:数据流分析的目的是在中间代码基础上进行优化代码的转换,反编译器需要在整个程序中收集关于寄存器和条件码的信息,并且跨不同的基本块传播该信息;该信息的收集是通过一个数据流分析过程,即求解方程式系统——与该程序不同点上的信息相关联的方程式;
步骤5,优化中间代码,产生D文件,D文件用于作为步骤6的输入:这一步的目的就是在第4步分析完毕之后,生成转换后的代码D文件;
步骤6,控制流分析:在第2步已经有了控制流图,相当于函数或者调用关系,但却没有关于高级语言控制结构的信息,比如if...then...else、while()、case等;这一步的目的是通过一个结构化算法能够被转换成一个结构化的高级语言图;
步骤7,生成C语言:这一步就是在第6步的基础上将低级的结构转换成高级的if……then等C语言结构。
因此,本发明具有如下优点:可以有效解决不同的智能电表的软件一致性问题。例如:在维护电力企业已使用电表时,使用本发明中的方法,可以控制拟投产电表与已使用电表功能和质量误差在±20%范围内。
附图说明
图1为本发明的具体流程示意图。
图2为本发明所涉及的MSP430反汇编算法流程图。
图3为本发明所涉及的输入中间指令代码结构图。
图4为本发明所涉及的寄存器变量清除实例。
图5为本发明所涉及的反编译总体流程图。
图6为本发明所涉及的中间文件解析流程图。
图7为本发明所涉及的函数绘制模块流程图。
图8为本发明所涉及的函数连线模块流程图。
具体实施方式
下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。
实施例:
本发明中的方法的目的是解决多处理器情况下智能电表软件一致性的检测问题,目前市场上出现的主流处理器主要有四种,分别是MSP430、RENESASM16C、RENESAS78K/0和INTEL8051。为了讨论方便,选取其中两种(MSP430和RENESASM16C)作为实例具体介绍本发明的实施过程。
1、机器码提取
智能电能表的嵌入式主板中的程序和数据主要集中存储在MCU和EEPROM中,MCU中存储的是智能电能表的主控制程序,该程序的功能是完成智能电能表的计量功能,也是智能电能表反汇编仪软件研发过程中要比较的目标程序。EEPROM中存储的是电表设备的初始化信息和部分调整曲线,主要任务是完成电表正式工作状态前的初始化。
关于对智能电能表嵌入式主板的EEPROM和MCU的内部程序的提取,目前已经找到了一种叫AQ430的软件,它可以方便地EEPROM的内部二进制机器码的提取。对于MCU,由于一般的商业芯片均有加密保护,要想获取芯片内部信息,必须有相应的破解程序。在MCU内部,存在两种调试方式:JTAG和BSL。JTAG调试环境下,若烧录时烧断了内置的Flash的保护熔丝,则无法用JTAG接口访问单片机,此时只能用BSL方式。而在BSL方式下,通常会提供32字节的256位密保加密算法对MCU的信息进行加密,因此需要破解软件破解加密算法。
智能电能表数据通信原理:每只智能电能表都有一个确定的唯一的12位十进制通讯地址。工作时,主站采用DL/T645-2007协议发送命令信息,智能电能表接收到自己地址匹配的信息后便把应答信息及其校验码打包并向上传送给远程主站系统,从而实现数据回抄。
智能电能表的数据通信流程,熟悉此流程后可以用串口调试软件对嵌入式主板进行通信测试并得到反馈信息,将反馈信息与智能电表规范进行对照可以获得相关信息。串口调试方法:取出电表的MCU部分,连线其中的UR接口如SDA和SCL端,接通5V电源,在输入端加一个START信号(包含控制字节如0304),观察输出。
2、反汇编
反汇编的目的即是将二进制表示的机器码转换为基于制定处理器的汇编指令。通过研究发现,不同处理器的指令集的指令格式均不相同,如ARM系列处理器处理的指令长度为固定的32位,而MSP430系列处理器的处理的指令长度为16的整数倍数。因此,需要设计不同处理器环境下的静态反汇编算法。以MSP430为例,MSP430处理器系列的指令比较复杂,其中包括拓展指令MSP430X类指令,该类指令用于将寻址空间拓展到1MB(20位表示的地址),其格式是在非拓展类指令的基础上加上一个16位的拓展字以示区分。鉴于每条指令的长度均为16的整数倍,因此设计的算法为每次扫描并处理当前位置后的16位二进制机器码,通过判断确定指令类型,其算法流程图如图2所示。
3、中间语言优化
由于经过反汇编得到的汇编指令存在处理器的差异性,因此需要将不同格式的指令统一为一种中间指令表示,以便于接下来反编译流程的运作。一般地,中间指令的生成依照表一所示的规则进行。
表一汇编指令与中间指令转换规则
4、反编译
反编译的目的是进行中间语言到C语言的转换,分为前端,数据流分析和后端。首先根据判断输入的汇编文件是否为完整的汇编文件,因为智能电表包括四种型号,处理器分为几种,几种处理器的型号不同,采用的汇编语言的样式也存在差异,所以必须进行判断。若输入的文件为完整的汇编文件,则进行第一步处理,第一步的目的是去除汇编指令判定数据类型。第二步是去除伪代码指令,这一步的目的是把汇编语言中的汇编指令包括替换后的都去除掉,为第三步做好准备。第三步判定函数类属与C语言中的函数相对应,这一步是在上一步的基础上进行的,反编译的主要流程图如图5所示,其详细步骤介绍如下:
第1步判断输入汇编代码的完整性
对于反编译器,输入的中间指令代码遵循固定的格式,如图3所示。如果输入的中间指令代码不遵循这个格式,可以认为输入只是一个小程序段,而不是完整的电表代码。
第2步.生成控制流图
这一步的目的是为源程序构造一个调用图,并且为程序的每个子程序构造一个基本块控制流向图。简而言之,这一步的目的是把中间代码分成多个结构,即划分函数以及调用关系。
第3步.优化中间代码,产生C文件
中间代码优化主要指的是清除无关指令,清除掉低级语言概念之条件码、寄存器和中间过渡的指令,并引进多于两个操作数的表达式高级概念。这一步产生的代码是高级汇编代码,已看不出汇编的语法痕迹,但是还不是C语言代码。这一步的各个步骤如下:
3.1死寄存器清除
如果一个变量的数值在它定义之后没有被使用,那么在程序中该标识符此时是死的。可以认为,定义一个死的标识符的指令是无用的,因此可以从代码中被清除掉。
3.2死条件码清除
类似于死寄存器清除。
3.3寄存器变量清除
用变量代替寄存器,一个例子如图4所示,原汇编指令中的寄存器SI和DI被局部变量loc1和loc2代替。
第4步.数据流分析
数据流分析的目的是在中间代码基础上进行优化代码的转换,反编译器需要在整个程序中收集关于寄存器和条件码的信息,并且跨不同的基本块传播该信息。该信息的收集是通过一个数据流分析过程,即求解方程式系统——与该程序不同点上的信息相关联的方程式。
第5步.优化中间代码,产生D文件
这一步的目的就是在第4步分析完毕之后,生成转换后的代码D文件。
第6步.控制流分析
在第2步已经有了控制流图,相当于函数或者调用关系,但却没有关于高级语言控制结构的信息,比如if...then...else、while()、case等。这一步的目的是通过一个结构化算法能够被转换成一个结构化的高级语言图。
第7步.生成C语言
这一步就是在第6步的基础上将低级的结构转换成高级的if……then等C语言结构。
5、代码结构分析
代码结构分析主要完成对反编译产生的高级语言中的代码结构的抽象化,即所谓的控制流分析。其实现过程主要分为三个模块:中间文件解析模块、函数绘制模块、函数连线模块。
中间文件解析模块,其流程如图6所示,详细步骤如下:
步骤一:打开输入文件,获取输入文件流。通过调用C++中库函数fopen(),并选择“rt”模式,即打开文本文件,允许读与写。
步骤二:初始化节点信息。
步骤三:解析文件的输入流,以while语句进行遍历,直至遍历至文件结束标记符。
步骤四:在遍历时,碰到换行符时将节点中funid属性加一,并且记录每一行的起始的空格数目,并将结果作为节点的deep属性。
步骤五:调用私有函数GetName获取每个节点的名字。在GetName函数中我们需要特殊处理含有if,switch,while,else关键字的节点。在遍历到此类节点的时候,我们去除这些关键字,而只留下剩余的信息,即判断条件。与此同时,修改节点中的type信息,根据关键字的不同,修改为IFTYPE,WHILETYPE,SWITCHTYPE,ELSETYPE。
步骤六:为ELSETYPE类型的节点找到与其配对的IFTYPE类型的节点。
步骤七:为节点添加父节点和孩子节点信息。其中获取孩子节点信息的方法为,向下遍历,直到碰到深度比本节点小于等于的节点则停止遍历,否则将深度比自己大一的节点加入孩子节点数组。获取其父节点信息的方法为,向上遍历,直到找到第一个深度小于本节点的函数节点,则为双亲节点。
步骤八:IF、WHILE、SWITCH模块结束位置确定。
中间文件解析后,产生的结果为一组包含各类信息的节点结构。
函数绘制模块的功能是在画布特定位置绘制相应的图形,矩形或者菱形。函数绘制流程如图7所示,函数绘制的详细步骤如下:
步骤一:遍历经过中间文件解析模块后的节点信息,当此节点拥有孩子节点并且此节点的类型为FUNTYPE时,将此节点作为新的一行的起始节点。
步骤二:计算每一行起始节点的Y轴方向的偏移量。这个偏移量由两个方面的因素所主导。其一,起始行节点的序列。其二,在此节点之前,若其他行中含有IFTYPE节点,ELSETYPE节点,WHILETYPE节点,SWITCHTYPE节点,那么需特别计算偏移量,因为以上这些节点都会在Y轴方向存在增量。
步骤三:计算新行首节点之后,绘制首节点图像,即矩形。
步骤四:将首节点位置信息,填入状态信息结构体中。
步骤五:在步骤三绘制的矩形框中间添加函数名称信息。
步骤六:遍历新行的首节点的子孩子节点,绘制子孩子节点形状。
步骤七:绘制子孩子节点时,首先确定子孩子节点的位置信息,其次判断子孩子节点的类型信息。子孩子节点的位置信息也会由其之前的IFTYPE节点,ELSETYPE节点,WHILETYPE节点,SWITCHTYPE节点所影响,例如ELSETYPE类型的节点会出现在下面的一行中,因此ELSETYPE类型节点的子孩子,不应该算在偏移量中。确定位置信息之后,为孩子节点添加名称。
函数连线模块的功能是将函数绘制模块绘制出来的图形,按照特定的规则连接起来,从而形成控制流图。函数连线模块流程如图8所示,函数连线详细步骤如下:
步骤一:寻找每一行的起始节点,并将起始节点的出口坐标传递。
步骤二:遍历起始节点的孩子节点。子孩子节点可能有五种情况,分别是:IFTYPE,WHILETYPE,ELSETYPE,SWITCHTYPE,FUNCTYPE。不同的类型处理起来方法也不相同。
1)IFTYPE情况下分为两部分,原因是IFTYPE和ELSETYPE不一定成对出现。在IFTYPE情况下,首先将IFTYPE节点与传递进来的出口坐标相连,接下来对IFTYPE节点的子孩子进行遍历,遍历之后获取最后一个节点的横坐标,并将该横坐标值与IFTYPE节点中标记的终止节点相连接。其次处理不含有ELSETYPE节点的IFTYPE节点。先计算此IF块中含有多少个IFTYPE,多少个WHILETYPE,以及多少个SWITCHTYPE。将这作为转折点的纵坐标偏移量。并将此转折点与IFTYPE节点菱形的下部节点相连,代表着不满足IFTYPE节点的路径。
2)WHILETYPE情况下,首先将WHILETYPE节点与传递进来的出口坐标相连,接下来对WHILETYPE节点的子孩子进行遍历,遍历之后获取最后一个节点的横坐标,并将该横坐标值与WHILETYPE节点中标记的终止节点相连接。其次在WHILETYPE类型的菱形节点的上部作为一个出口节点,接下来计算WHILETYPE类型节点函数域内是否包含有其他WHILETYPE类型节点,以及这些节点的数目。将WHILETYPE节点的数目作为偏移量,从而在菱形上部确定转折点纵坐标位置,此条连线代表不满足判断条件所走路径。在菱形下部的顶点引出一条折线,代表在满足条件之后返回WHILETYPE节点,再次进行判断条件。
3)ELSETYPE情况下,首先找到与其配对的IFTYPE节点,在找到与其配对的IFTYPE节点之后,再次计算IFTYPE节点块中含有多少个IFTYPE,多少个WHILETYPE,以及多少个SWITCHTYPE,以这些作为偏移量在IFTYPE节点的下方确定ELSETYPE节点的坐标。接下来将ELSETYPE节点与IFTYPE菱形节点的下部相连接。随后遍历ELSETYPE节点的子孩子节点。
4)SWITCHTYPE情况下,首先将SWITCHTYPE节点与传递进来的出口坐标相连接,接下来对SWITCHTYPE节点的子孩子进行遍历,遍历之后,获取最后一个节点的横坐标值,并将横坐标值与SWITCHTYPE节点中标记的终止节点相连接。
5)FUNTYPE情况下,直接将上一节点传递进来的出口坐标,与自身的入口坐标相连接,并将本节点的出口坐标传递出去。
6、软件差异率分析
对于两块不同的智能电表,考察其软件功能差异时,将程序内部调用关系图抽象为树或者图,这样对程序的差异比较转化为对两个树形结构的比较。具体的度量方法如下:将程序抽象为两个树形结构A和B,其中顶点V表示函数,边E表示函数调用关系。分别统计两棵树的顶点个数和边的个数。两端程序的差异率P可以用树A和树B的差异率Tr(p)表示。设定阈值T=20%,若Tr(p)<T,则认为两段程序功能一致;若Tr(p)>T,则认为两段程序功能存在差异。
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
Claims (2)
1.一种智能电表的软件一致性检测方法,其特征在于,包括:
一个对智能电能表内部机器码提取的步骤:提取智能电能表嵌入式主板的EEPROM和MCU内部基于二进制表示的机器码;
一个反汇编的步骤:将二进制表示的机器码转换为基于指定处理器的汇编指令;依据处理器指令集的类型进行选择静态反汇编算法,具体是:
选择一:对于定长指令集,根据每条指令的长度将机器码进行划分,进而判断指令类型并进行处理;
选择二:对于变长指令集,从机器码起始地址开始采取操作码遍历的方式获取第一个有效操作码,根据该操作码确定当前指令的长度,进而得到下一条指令的起始地址;然后,使用递归的方法根据下一条指令的起始地址确定下下一条指令的长度……如此循环下去,最终得到所有指令的操作码长度和指令长度,根据这些信息判断指令类型并进行处理;
一个中间语言优化的步骤:将指定处理器的不同格式的汇编指令统一为一种中间指令表示,以便于接下来反编译流程的运作;将反汇编得到的汇编指令按照类别进行处理:对于赋值类指令,将其直接转换为相应的运算表达式;对于无条件转移指令JMP,直接使用C语言中的GOTO语句替代;对于有条件转移指令,保留其语句不变,直接由程序流分析模块进行处理;对于CALL过程调用,直接构造子函数进行抽象;对于返回指令RET和堆栈指令PUSH和POP,保留其语句不变,直接由控制流分析模块进行处理;对于其它指令,由于没有显式的高级语言对应语句,故直接略去;
一个反编译的步骤:反编译的目的是进行中间语言到C语言的转换,分为前端,数据流分析和后端;
一个代码结构分析的步骤:完成对反编译产生的高级语言中的代码结构的抽象化,即所谓的控制流分析;其实现过程包括:产生一组包含各类信息的节点结构的中间文件解析模块、在画布特定位置绘制相应的图形,矩形或者菱形的函数绘制模块、将函数绘制模块绘制出来的图形,按照特定的规则连接起来,从而形成控制流图函数连线模块;具体方法是:
步骤1:由中间文件解析模块产生一组包含各类信息的节点结构,详细步骤如下:
步骤1.1:打开输入文件,获取输入文件流;通过调用C++中库函数fopen(),并选择rt模式,即打开文本文件,允许读与写;
步骤1.2:初始化节点信息;
步骤1.3:解析文件的输入流,以while语句进行遍历,直至遍历至文件结束标记符;
步骤1.4:在遍历时,碰到换行符时将节点中funid属性加一,并且记录每一行的起始的空格数目,并将结果作为节点的deep属性;
步骤1.5:调用私有函数GetName获取每个节点的名字;在GetName函数中我们需要特殊处理含有if,switch,while,else关键字的节点;在遍历到此类节点的时候,我们去除这些关键字,而只留下剩余的信息,即判断条件;与此同时,修改节点中的type信息,根据关键字的不同,修改为IFTYPE,WHILETYPE,SWITCHTYPE,ELSETYPE;
步骤1.6:为ELSETYPE类型的节点找到与其配对的IFTYPE类型的节点;
步骤1.7:为节点添加父节点和孩子节点信息;其中获取孩子节点信息的方法为,向下遍历,直到碰到深度比本节点小于等于的节点则停止遍历,否则将深度比自己大一的节点加入孩子节点数组;获取其父节点信息的方法为,向上遍历,直到找到第一个深度小于本节点的函数节点,则为双亲节点;
步骤1.8:IF、WHILE、SWITCH模块结束位置确定;中间文件解析后,产生的结果为一组包含各类信息的节点结构;
步骤2:函数绘制模块在画布特定位置绘制相应的图形,矩形或者菱形,详细步骤如下:
步骤:2.1:遍历经过中间文件解析模块后的节点信息,当此节点拥有孩子节点并且此节点的类型为FUNTYPE时,将此节点作为新的一行的起始节点;
步骤2.2:计算每一行起始节点的Y轴方向的偏移量;这个偏移量由两个方面的因素所主导;其一,起始行节点的序列;其二,在此节点之前,若其他行中含有IFTYPE节点,ELSETYPE节点,WHILETYPE节点,SWITCHTYPE节点,那么需特别计算偏移量,因为以上这些节点都会在Y轴方向存在增量;
步骤2.3:计算新行首节点之后,绘制首节点图像,即矩形;
步骤2.4:将首节点位置信息,填入状态信息结构体中;
步骤2.5:在步骤三绘制的矩形框中间添加函数名称信息;
步骤2.6:遍历新行的首节点的子孩子节点,绘制子孩子节点形状;
步骤2.7:绘制子孩子节点时,首先确定子孩子节点的位置信息,其次判断子孩子节点的类型信息;子孩子节点的位置信息也会由其之前的IFTYPE节点,ELSETYPE节点,WHILETYPE节点,SWITCHTYPE节点所影响,例如ELSETYPE类型的节点会出现在下面的一行中,因此ELSETYPE类型节点的子孩子,不应该算在偏移量中;确定位置信息之后,为孩子节点添加名称;
步骤3:函数连线模块将函数绘制模块绘制出来的图形,按照特定的规则连接起来,从而形成控制流图,详细步骤如下:
步骤:3.1:寻找每一行的起始节点,并将起始节点的出口坐标传递;
步骤3.2:遍历起始节点的孩子节点;子孩子节点可能有五种情况,分别是:IFTYPE,WHILETYPE,ELSETYPE,SWITCHTYPE,FUNCTYPE,具体是:
条件情况一:IFTYPE情况下分为两部分,原因是IFTYPE和ELSETYPE不一定成对出现;在IFTYPE情况下,首先将IFTYPE节点与传递进来的出口坐标相连,接下来对IFTYPE节点的子孩子进行遍历,遍历之后获取最后一个节点的横坐标,并将该横坐标值与IFTYPE节点中标记的终止节点相连接;其次处理不含有ELSETYPE节点的IFTYPE节点;先计算此IF块中含有多少个IFTYPE,多少个WHILETYPE,以及多少个SWITCHTYPE;将这作为转折点的纵坐标偏移量;并将此转折点与IFTYPE节点菱形的下部节点相连,代表着不满足IFTYPE节点的路径;
条件情况二:WHILETYPE情况下,首先将WHILETYPE节点与传递进来的出口坐标相连,接下来对WHILETYPE节点的子孩子进行遍历,遍历之后获取最后一个节点的横坐标,并将该横坐标值与WHILETYPE节点中标记的终止节点相连接;其次在WHILETYPE类型的菱形节点的上部作为一个出口节点,接下来计算WHILETYPE类型节点函数域内是否包含有其他WHILETYPE类型节点,以及这些节点的数目;将WHILETYPE节点的数目作为偏移量,从而在菱形上部确定转折点纵坐标位置,此条连线代表不满足判断条件所走路径;在菱形下部的顶点引出一条折线,代表在满足条件之后返回WHILETYPE节点,再次进行判断条件;
条件情况三:ELSETYPE情况下,首先找到与其配对的IFTYPE节点,在找到与其配对的IFTYPE节点之后,再次计算IFTYPE节点块中含有多少个IFTYPE,多少个WHILETYPE,以及多少个SWITCHTYPE,以这些作为偏移量在IFTYPE节点的下方确定ELSETYPE节点的坐标;接下来将ELSETYPE节点与IFTYPE菱形节点的下部相连接;随后遍历ELSETYPE节点的子孩子节点;
条件情况四:SWITCHTYPE情况下,首先将SWITCHTYPE节点与传递进来的出口坐标相连接,接下来对SWITCHTYPE节点的子孩子进行遍历,遍历之后,获取最后一个节点的横坐标值,并将横坐标值与SWITCHTYPE节点中标记的终止节点相连接;
条件情况五:FUNTYPE情况下,直接将上一节点传递进来的出口坐标,与自身的入口坐标相连接,并将本节点的出口坐标传递出去;
一个软件差异率分析的步骤:对于两块不同的智能电表,考察其软件功能差异时,将程序内部调用关系图抽象为树或者图,这样对程序的差异比较转化为对两个树形结构的比较;具体的度量方法如下:将程序抽象为两个树形结构A和B,其中顶点V表示函数,边E表示函数调用关系;分别统计两棵树的顶点个数和边的个数;两端程序的差异率P可以用树A和树B的差异率Tr(p)表示;设定阈值T=20%,若Tr(p)<T,则认为两段程序功能一致;若Tr(p)>T,则认为两段程序功能存在差异。
2.根据权利要求1所述的一种智能电表的软件一致性检测方法,其特征在于,所述反编译的步骤具体包括以下子步骤:
步骤1,判断输入汇编代码的完整性:对于反编译器,输入的中间指令代码遵循固定的格式,如图3所示;如果输入的中间指令代码不遵循这个格式,可以认为输入只是一个小程序段,而不是完整的电表代码;
步骤2,生成控制流图:这一步的目的是为源程序构造一个调用图,并且为程序的每个子程序构造一个基本块控制流向图;简而言之,这一步的目的是把中间代码分成多个结构,即划分函数以及调用关系;
步骤3,优化中间代码,产生C文件,C文件用于作为步骤4的输入:中间代码优化主要指的是清除无关指令,清除掉低级语言概念之条件码、寄存器和中间过渡的指令,并引进多于两个操作数的表达式高级概念;这一步产生的代码是高级汇编代码,已看不出汇编的语法痕迹,但是还不是C语言代码;这一步的各个步骤如下:
3.1死寄存器清除
如果一个变量的数值在它定义之后没有被使用,那么在程序中该标识符此时是死的;可以认为,定义一个死的标识符的指令是无用的,因此可以从代码中被清除掉;
3.2死条件码清除
类似于死寄存器清除;
3.3寄存器变量清除
用变量代替寄存器,一个例子如图4所示,原汇编指令中的寄存器SI和DI被局部变量loc1和loc2代替;
步骤4,数据流分析:数据流分析的目的是在中间代码基础上进行优化代码的转换,反编译器需要在整个程序中收集关于寄存器和条件码的信息,并且跨不同的基本块传播该信息;该信息的收集是通过一个数据流分析过程,即求解方程式系统——与该程序不同点上的信息相关联的方程式;
步骤5,优化中间代码,产生D文件,D文件用于作为步骤6的输入:这一步的目的就是在第4步分析完毕之后,生成转换后的代码D文件;
步骤6,控制流分析:在第2步已经有了控制流图,相当于函数或者调用关系,但却没有关于高级语言控制结构的信息,比如if...then...else、while()、case等;这一步的目的是通过一个结构化算法能够被转换成一个结构化的高级语言图;
步骤7,生成C语言:这一步就是在第6步的基础上将低级的结构转换成高级的if……then等C语言结构。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510371954.8A CN105044653A (zh) | 2015-06-30 | 2015-06-30 | 一种智能电表的软件一致性检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510371954.8A CN105044653A (zh) | 2015-06-30 | 2015-06-30 | 一种智能电表的软件一致性检测方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105044653A true CN105044653A (zh) | 2015-11-11 |
Family
ID=54451331
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510371954.8A Pending CN105044653A (zh) | 2015-06-30 | 2015-06-30 | 一种智能电表的软件一致性检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105044653A (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105630678A (zh) * | 2015-12-22 | 2016-06-01 | 国网天津市电力公司 | 一种智能电能表软件的可靠性检测仪及其检测方法 |
CN106066795A (zh) * | 2016-05-31 | 2016-11-02 | 国网冀北电力有限公司电力科学研究院 | 一种采集终端软件程序比对方法及装置 |
CN107402799A (zh) * | 2017-07-25 | 2017-11-28 | 北京计算机技术及应用研究所 | 在x86电脑超高速解释执行tms320c25芯片汇编指令的方法 |
CN107656233A (zh) * | 2017-09-04 | 2018-02-02 | 国家电网公司 | 一种用于电能表软件自动测试的方法 |
CN111221621A (zh) * | 2019-10-11 | 2020-06-02 | 中国电力科学研究院有限公司 | 一种电能表虚拟机的专用指令处理方法及系统 |
CN111767116A (zh) * | 2020-06-03 | 2020-10-13 | 江苏中科重德智能科技有限公司 | 面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法 |
CN112711933A (zh) * | 2020-12-31 | 2021-04-27 | 深轻(上海)科技有限公司 | 一种利用电子表格进行寿险精算模型校验的方法 |
CN116302221A (zh) * | 2023-03-27 | 2023-06-23 | 河南牧业经济学院 | 一种基于浏览器的函数图形绘制方法及系统 |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1818863A (zh) * | 2006-03-13 | 2006-08-16 | 浙江大学 | 嵌入式软件反编译中的静态库函数识别实现方法 |
CN101271398A (zh) * | 2007-03-23 | 2008-09-24 | 北京大学 | 多路分支结构的识别方法 |
CN101393521A (zh) * | 2008-11-13 | 2009-03-25 | 上海交通大学 | Windows应用程序内部固化数据的提取系统 |
CN101763291A (zh) * | 2009-12-30 | 2010-06-30 | 中国人民解放军国防科学技术大学 | 一种程序控制流错误检测方法 |
JP2010244377A (ja) * | 2009-04-08 | 2010-10-28 | Fujitsu Ten Ltd | シミュレーションプログラム生成装置、シミュレーションプログラム生成方法、及び、シミュレーションシステム |
CN102855139A (zh) * | 2012-08-10 | 2013-01-02 | 浙江省电力公司电力科学研究院 | 一种反编译数据流分析中的寄存器清除方法及系统 |
CN102968304A (zh) * | 2012-11-27 | 2013-03-13 | 武汉大学 | 一种实现反汇编自适应反馈调节机制的方法 |
CN102968330A (zh) * | 2012-11-27 | 2013-03-13 | 武汉大学 | 一种固件代码反汇编中端模式差异的处理方法 |
CN103106096A (zh) * | 2012-11-27 | 2013-05-15 | 武汉大学 | 一种针对嵌入式微处理器的反汇编方法 |
CN103164643A (zh) * | 2011-12-08 | 2013-06-19 | 北京深思洛克软件技术股份有限公司 | 一种通过硬件进行反调试的方法和装置 |
CN103279377A (zh) * | 2013-05-09 | 2013-09-04 | 北京百度网讯科技有限公司 | 代码差异度比较方法及装置 |
CN104198979A (zh) * | 2014-08-29 | 2014-12-10 | 国家电网公司 | 一种用于宽频电能表计量运行误差的实时比对方法 |
-
2015
- 2015-06-30 CN CN201510371954.8A patent/CN105044653A/zh active Pending
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1818863A (zh) * | 2006-03-13 | 2006-08-16 | 浙江大学 | 嵌入式软件反编译中的静态库函数识别实现方法 |
CN101271398A (zh) * | 2007-03-23 | 2008-09-24 | 北京大学 | 多路分支结构的识别方法 |
CN101393521A (zh) * | 2008-11-13 | 2009-03-25 | 上海交通大学 | Windows应用程序内部固化数据的提取系统 |
JP2010244377A (ja) * | 2009-04-08 | 2010-10-28 | Fujitsu Ten Ltd | シミュレーションプログラム生成装置、シミュレーションプログラム生成方法、及び、シミュレーションシステム |
CN101763291A (zh) * | 2009-12-30 | 2010-06-30 | 中国人民解放军国防科学技术大学 | 一种程序控制流错误检测方法 |
CN103164643A (zh) * | 2011-12-08 | 2013-06-19 | 北京深思洛克软件技术股份有限公司 | 一种通过硬件进行反调试的方法和装置 |
CN102855139A (zh) * | 2012-08-10 | 2013-01-02 | 浙江省电力公司电力科学研究院 | 一种反编译数据流分析中的寄存器清除方法及系统 |
CN102968304A (zh) * | 2012-11-27 | 2013-03-13 | 武汉大学 | 一种实现反汇编自适应反馈调节机制的方法 |
CN102968330A (zh) * | 2012-11-27 | 2013-03-13 | 武汉大学 | 一种固件代码反汇编中端模式差异的处理方法 |
CN103106096A (zh) * | 2012-11-27 | 2013-05-15 | 武汉大学 | 一种针对嵌入式微处理器的反汇编方法 |
CN103279377A (zh) * | 2013-05-09 | 2013-09-04 | 北京百度网讯科技有限公司 | 代码差异度比较方法及装置 |
CN104198979A (zh) * | 2014-08-29 | 2014-12-10 | 国家电网公司 | 一种用于宽频电能表计量运行误差的实时比对方法 |
Non-Patent Citations (1)
Title |
---|
刘金硕等: "基于反汇编的智能电表软件功能检测模型", 《计算机应用》 * |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105630678A (zh) * | 2015-12-22 | 2016-06-01 | 国网天津市电力公司 | 一种智能电能表软件的可靠性检测仪及其检测方法 |
CN105630678B (zh) * | 2015-12-22 | 2018-10-02 | 国网天津市电力公司 | 一种智能电能表软件的可靠性检测仪及其检测方法 |
CN106066795A (zh) * | 2016-05-31 | 2016-11-02 | 国网冀北电力有限公司电力科学研究院 | 一种采集终端软件程序比对方法及装置 |
CN107402799A (zh) * | 2017-07-25 | 2017-11-28 | 北京计算机技术及应用研究所 | 在x86电脑超高速解释执行tms320c25芯片汇编指令的方法 |
CN107402799B (zh) * | 2017-07-25 | 2020-07-21 | 北京计算机技术及应用研究所 | 在x86电脑超高速解释执行tms320c25芯片汇编指令的方法 |
CN107656233A (zh) * | 2017-09-04 | 2018-02-02 | 国家电网公司 | 一种用于电能表软件自动测试的方法 |
CN111221621A (zh) * | 2019-10-11 | 2020-06-02 | 中国电力科学研究院有限公司 | 一种电能表虚拟机的专用指令处理方法及系统 |
CN111767116A (zh) * | 2020-06-03 | 2020-10-13 | 江苏中科重德智能科技有限公司 | 面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法 |
CN111767116B (zh) * | 2020-06-03 | 2023-09-05 | 江苏中科重德智能科技有限公司 | 面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法 |
CN112711933A (zh) * | 2020-12-31 | 2021-04-27 | 深轻(上海)科技有限公司 | 一种利用电子表格进行寿险精算模型校验的方法 |
CN116302221A (zh) * | 2023-03-27 | 2023-06-23 | 河南牧业经济学院 | 一种基于浏览器的函数图形绘制方法及系统 |
CN116302221B (zh) * | 2023-03-27 | 2023-10-10 | 河南牧业经济学院 | 一种基于浏览器的函数图形绘制方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105044653A (zh) | 一种智能电表的软件一致性检测方法 | |
US10901709B2 (en) | Partitioning based migration of systems to container and microservice based platforms | |
Gupta et al. | Deepfix: Fixing common c language errors by deep learning | |
CN109918294B (zh) | 一种混源软件自主可控性检测方法及系统 | |
JP2017517821A (ja) | ソフトウェアアーチファクトのデータベースのためのシステム及び方法 | |
Krishnan et al. | Unification and refactoring of clones | |
CN103150200B (zh) | 一种c语言到msvl语言的转换方法 | |
CN106371997B (zh) | 一种代码检查方法及装置 | |
CN110147235B (zh) | 一种源代码与二进制代码间的语义比对方法和装置 | |
Basten et al. | M3: A general model for code analytics in rascal | |
EP2141587A1 (en) | Method and system for generating of a control flow graph for representing a program code | |
CN103914379A (zh) | 故障自动注入与故障检测的方法及其系统 | |
Sopeju et al. | Autoscope: Automatic suggestions for code optimizations using perfexpert | |
Husár et al. | Automatic C compiler generation from architecture description language ISAC | |
CN105630678A (zh) | 一种智能电能表软件的可靠性检测仪及其检测方法 | |
Zengler et al. | Encoding the Linux kernel configuration in propositional logic | |
Khatoon et al. | An evaluation of source code mining techniques | |
Romanov et al. | Representing programs with dependency and function call graphs for learning hierarchical embeddings | |
CN109710538A (zh) | 一种用于大规模系统中状态相关缺陷的静态检测方法 | |
Singh et al. | A Study of Code Clone Detection Techniques in Software Systems | |
Hochrainer et al. | A pred-LL (*) Parsable Typed Higher-Order Macro System for Architecture Description Languages | |
Xu et al. | Basic Model Study of Automatic Generation Method | |
Malm et al. | Towards automated analysis of executable models | |
Chen et al. | Semantic Model-based Dynamic Adaptation Method for Heterogeneous Peripherals of Instrument | |
Gerardi et al. | Type 2 clone detection on ASCET models |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20151111 |