发明名称 一种智能电表的软件一致性检测方法
摘要 本发明涉及一种智能电表的软件一致性检测方法,主要以计算机学科中的固件逆向工程技术、反汇编和反编译技术、嵌入式系统设计技术为指导理论,针对智能电表在生产过程中出现的样品表和批量表运行时差异问题,深入分析了表征电表运行差异的内部核心代码,进而通过反汇编和反编译手段实现了两种类型电表的软件一致性检测。利用本发明的方法可以有效解决不同的智能电表的软件一致性问题。例如:在维护电力企业已使用电表时,使用本发明中的方法,可以控制拟投产电表与已使用电表功能和质量误差在±20%范围内。
申请公布号 CN105044653A 申请公布日期 2015.11.11
申请号 CN201510371954.8 申请日期 2015.06.30
申请人 武汉大学 发明人 刘金硕;王谢兵;张卫欣;江庄毅;邓娟;郑稳;章岚昕
分类号 G01R35/04(2006.01)I 主分类号 G01R35/04(2006.01)I
代理机构 武汉科皓知识产权代理事务所(特殊普通合伙) 42222 代理人 鲁力
主权项 一种智能电表的软件一致性检测方法,其特征在于,包括:一个对智能电能表内部机器码提取的步骤:提取智能电能表嵌入式主板的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,则认为两段程序功能存在差异。
地址 430072 湖北省武汉市武昌区珞珈山武汉大学