继电保护装置嵌入式软件的反汇编方法和系统的制作方法

文档序号:10686883阅读:438来源:国知局
继电保护装置嵌入式软件的反汇编方法和系统的制作方法
【专利摘要】本发明涉及一种继电保护装置嵌入式软件的反汇编方法和系统。上述继电保护装置嵌入式软件的反汇编方法,包括如下步骤:获取继电保护装置嵌入式软件的反汇编代码中的各个指令,分别识别各个指令的指令类型和指令地址;根据所述指令的指令类型建立用于保存指令地址的二叉树;在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址;获取所述目标地址对应的指令内容,对所述指令内容进行反编译。上述继电保护装置嵌入式软件的反汇编方法和系统,可以覆盖到相应代码中的各个指令,具有较高的反编译效果。
【专利说明】
继电保护装置嵌入式软件的反汇编方法和系统
技术领域
[0001]本发明涉及电力技术领域,特别是涉及一种继电保护装置嵌入式软件的反汇编方法和系统。
【背景技术】
[0002]继电保护设备是整个电力系统中重要的组成部分,在智能电网中起到了关键核心作用,当电力系统元件发生故障时,继电保护设备会对发生故障元件相邻的元件断路器,发出跳闸的指令,及时把故障元件和系统隔开,这样既能在最大程度上保障故障元件免受再次损害,更能减少对电力系统产生的危害,降低因故障产生事故的损失。当电网运行异常时,继电保护设备会及时发出警报,并且能够根据不同异常情况发出不同的信号,以便值班人员进行处理,继电保护设备对于有些异常情况还能自行的调整。在发生故障时,继电保护设备能及时把发生故障的部分与系统隔离,保证没有发生故障部分正常运行,这样能缩小事故的范围,降低给电力系统带来的危害。继电保护设备还可以在电网运行中起到监控作用,它能及时反映系统各个设备的电流电压情况,以此可清晰地判断出设备的运行状态。
[0003]嵌入式软件是继电保护设备的核心部分,如果其出现问题,将会引起严重的后果,因此,为了提高继电保护设备的安全可靠运行,需对嵌入式软件进行安全性检测。嵌入式软件反汇编技术是检测和分析软件安全性是一种有效方法,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机)、外挂技术、病毒分析、逆向工程、软件汉化等领域。现阶段,针对源代码的分析工具很多,包括CodeStr iker、RhodeCode、CodeTEST、VcTester、VectorCast等,但是病毒、木马等恶意代码通常是以二进制文件的形式出现,且嵌入到被攻击的设备中,一旦代码运行,这些恶意软件也就会运行,从而获得系统的控制权,造成重大经济损失。针对二进制文件的分析工具并不多,最主要集中在静态分析上,包括反汇编工具IDA Pro、Windbg等。IDA Pro工具利用的是递归遍历算法原理进行代码反汇编,是如今的主流分析工具,Windbg是利用线性遍历算法原理进行代码反汇编。
[0004]上述反汇编方案应用至继电保护设备的嵌入式软件中时,难以获取相应继电保护设备运行的动态信息,导致反汇编方案的覆盖率低,从而影响反汇编效果。

【发明内容】

[0005]基于此,有必要针对传统方案影响反汇编效果的技术问题,提供一种继电保护装置嵌入式软件的反汇编方法和系统。
[0006]—种继电保护装置嵌入式软件的反汇编方法,包括如下步骤:
[0007]获取继电保护装置嵌入式软件的反汇编代码中的各个指令,分别识别间接转移类型的指令及其指令地址;
[0008]根据所述指令的指令类型建立用于保存指令地址的二叉树;其中所述二叉树中,一个结点保存一个指令地址,所述二叉树左子树的结点用于保存所述间接转移类型的指令的指令地址;
[0009]在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址;
[0010]获取所述目标地址对应的指令内容,对所述指令内容进行反编译。
[0011]—种继电保护装置嵌入式软件的反汇编系统,包括:
[0012]识别模块,用于获取继电保护装置嵌入式软件的反汇编代码中的各个指令,分别识别间接转移类型的指令及其指令地址;
[0013]建立模块,用于根据所述指令的指令类型建立用于保存指令地址的二叉树;其中所述二叉树中,一个结点保存一个指令地址,所述二叉树左子树的结点用于保存所述间接转移类型的指令的指令地址;
[0014]设置模块,用于在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址;
[0015]反编译模块,用于获取所述目标地址对应的指令内容,对所述指令内容进行反编译。
[0016]上述继电保护装置嵌入式软件的反汇编方法和系统,可以识别继电保护装置嵌入式软件的反汇编代码中各个指令的指令类型和指令地址,根据所述指令类型依次建立用于保存指令地址的二叉树,将间接转移类型的指令所对应的指令地址分别保存至上述二叉树左子树的结点,再通过遍历上述二叉树,获取相应的目标地址,对上述目标地址对应的指令进行反编译,其反编译过程可以覆盖到相应代码中的各个指令,具有较高的反编译效果。
【附图说明】
[0017]图1为一个实施例的继电保护装置嵌入式软件的反汇编方法流程图;
[0018]图2为一个实施例的继电保护装置嵌入式软件的反汇编方法流程图;
[0019]图3为一个实施例的继电保护装置嵌入式软件的反汇编系统结构示意图。
【具体实施方式】
[0020]下面结合附图对本发明的继电保护装置嵌入式软件的反汇编方法和系统的【具体实施方式】作详细描述。
[0021 ]参考图1,图1所示表示一个实施例的继电保护装置嵌入式软件的反汇编方法流程图,包括如下步骤:
[0022]S10,获取继电保护装置嵌入式软件的反汇编代码中的各个指令,分别识别间接转移类型的指令及其指令地址;
[0023]上述步骤可以通过相关查找算法从继电保护装置嵌入式软件所对应的系统内部信息中查找反汇编代码所在的存储地址,确定上述反汇编代码的入口点(首地址)。上述反汇编代码可以包括间接转移指令以及数据处理类指令等非间接转移指令,反汇编过程通常难以覆盖到上述间接转移指令。上述间接转移指令为间接转移类型的指令,非间接转移指令为非间接转移类型的指令。
[0024]S20,根据所述指令的指令类型建立用于保存指令地址的二叉树;其中所述二叉树中,一个结点保存一个指令地址,所述二叉树左子树的结点用于保存所述间接转移类型的指令的指令地址;
[0025]上述步骤S20中,可以先建立二叉树,再根据指令类型,将各个指令地址保存至二叉树的各个结点,具体可以将间接转移指令的指令地址保存至二叉树左子树的各个结点,将非间接转移指令的指令地址保存至二叉树右子树的各个结点。这样通过对二叉树的遍历,便可以查找到反汇编程序中各个指令的指令地址,根据上述指令地址对相应的指令内容进行反编译,可以保证反编译的全面性。
[0026]S30,在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址;
[0027]上述步骤可以使用寄存器间接寻址或者存储器间接寻址等寻址方式对相应的二叉树进行遍历寻址。
[0028]S40,获取所述目标地址对应的指令内容,对所述指令内容进行反编译。
[0029]本实施例提供的继电保护装置嵌入式软件的反汇编方法,可以识别继电保护装置嵌入式软件的反汇编代码中各个指令的指令类型和指令地址,根据所述指令类型依次建立用于保存指令地址的二叉树,将间接转移指令的指令地址分别保存至上述二叉树左子树的结点,再通过遍历上述二叉树,获取相应的目标地址,对上述目标地址对应的指令进行反编译,其反编译过程可以覆盖到相应代码中的各个指令,具有较高的反编译效果。
[0030]在一个实施例中,上述根据所述指令的指令类型建立用于保存指令地址的二叉树的步骤后还可以包括:
[0031 ]获取反汇编代码中第一个指令的指令地址;
[0032]将所述第一个指令的指令地址保存至二叉树的根节点。
[0033]本实施例将反汇编代码中指令首地址保存至二叉树的根节点,可以保证指令地址与二叉树各结点对应关系的有序性。
[0034]在一个实施例中,上述根据所述指令的指令类型建立用于保存指令地址的二叉树的步骤可以包括:
[0035]根据所述反汇编代码中间接转移类型的指令个数建立二叉树,所述二叉树中左子树的结点个数等于指令个数;
[0036]判断反汇编代码中的指令是否为间接转移指令;
[0037]若是,则将所述指令的地址保存至二叉树的左子树,若反汇编代码中的指令为非间接转移指令,则将所述指令的地址保存至二叉树的右子树;
[0038]将所述指令的指令地址进行标记,并获取下一个指令,返回执行判断反汇编代码中的指令是否为间接转移指令的步骤。
[0039]本实施例可以根据指令地址的先后顺序依次获取各个指令地址,再根据指令地址读取对应的指令(包括指令内容),以根据具体的指令类容进行指令类型的判断。上述指令地址可以通过寻址公式Addr = Addr+length( Instruct 1n)进行获取,上述Instruct 1n表示指令,length (Instruct 1n)表示指令长度,Addr表示指令地址。将指令地址已保存的指令的指令地址进行标记,表明上述指令地址已被访问,在下一次获取到该指令地址时,可以将其挑个,直接获取下一个指令地址。
[0040]作为一个实施例,上述判断反汇编代码中的指令是否为间接转移指令的步骤前还可以包括:
[0041 ]获取反汇编代码中指令的指令地址;
[0042]判断所述指令地址是否已标记;
[0043]若是,则获取下一个指令。
[0044]本实施例在反汇编代码中指令的指令地址已标记(该指令地址已被访问过)时,直接获取下一个指令以及相应的指令地址,可以提高获取指令以及相应指令地址的效率。
[0045]在一个实施例中,上述判断反汇编代码中的指令是否为间接转移指令的步骤前还可以包括:
[0046]获取反汇编代码中指令的指令地址;
[0047]判断所述指令地址是否在设定的地址范围外;
[0048]若是,则对所述二叉树的结点进行遍历。
[0049]本实施例中,在设定的地址范围外的指令地址对应的指令不是反汇编代码中的指令,若指令地址为从首地址开始依次获取,指令地址是否在设定的地址范围外表明,反汇编代码中的指令已获取完毕,相应的指令地址保存完毕,可以对二叉树的结点进行遍历。上述地址范围可以根据反汇编代码的长度以及其在继电保护装置嵌入式软件中的存储位置进行设置。
[0050]在一个实施例中,上述在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址的步骤可以包括:
[0051]对二叉树进行寄存器间接寻址,回溯扫描各指令地址,寻找各指令地址对应的寄存器号,并根据所述寄存器号计算目标地址。
[0052]在一个实施例中,上述在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址的步骤可以包括:
[0053]对二叉树进行存储器间接寻址,回溯扫描各指令地址,寻找各指令地址对应的存储器变量,并根据所述存储器变量计算目标地址。
[0054]在一个实施例中,上述在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址的步骤后还可以包括:
[0055]检测当前遍历的二叉树结点的后继是否为空;
[0056]若是,则判断所述二叉树遍历完毕。
[0057]本实施例,在对二叉树遍历完毕,获取其中所有结点以及各结点所保存的指令地址后,可以对上述各个指令地址对应的指令内容进行反编译。
[0058]在一个实施例中,所述指令类型包括非间接转移指令类型;所述获取所述目标地址对应的指令内容,对所述指令内容进行反编译的步骤后还包括:
[0059]将非间接转移类型的指令所对应的指令地址分别保存至二叉树中右子树的各个结点;
[0060]在对嵌入式软件进行反汇编时,查找所述二叉树的右子树,获取所述右子树中各个结点保存的指令地址;
[0061 ]对右子树中各个结点保存的指令地址所对应的指令内容进行反编译。
[0062]作为一个实施例,上述继电保护装置嵌入式软件的反汇编方法的流程图还可以如图2所示,可以通过查看继电保护装置嵌入式软件系统的内部信息,获取反汇编代码所在存储区地址,确定反汇编代码的程序入口点(首地址),根据上述首地址建立二叉树的根节点,从而创建二叉树,当指令的首地址超出程序代码的地址范围或者地址在反汇编过程中被访问过,可以退出反汇编进入间接转移指令定位阶段,否则反汇编该指令并对指令的类型进行判定,若指令为间接转移指令,无法获得指令所指向代码块的目标地址,则生成左子树,上述左子树的前驱为指令的地址,左子树的后继可以设为NULL,然后进入下一条指令,下一条指令的指令地址可以为Addr = Addr+length(Instruct1n),重新对新的地址进行判别。若指令为非间接跳转指令,则可以生成右子树,并判断指令类型是否为数据处理类指令。若是数据处理类指令,则可以将右子树的前驱设为指令的地址,右子树的后继设为转移地址,并按确定的转移地址Addr转移。若为非顺序指令即为条件转移指令,则反汇编该指令并将树前驱设为指令的地址,树的后继设为条件指令的两个后继地址,结束该方向扫描进入下一条指令,下一条指令地址为Addr = Addr+length( Instruct 1n)。下面针对指令的后继为NULL的间接转移指令,对它的转移地址进行定位。若指令的后继为NULL,则根据指令的内容对寻址方式进行判别。若使用存储器间接寻址,可以回溯扫描各程序指令寻找存储器变量,并通过计算得出指令的转移地址,然后将该间接指令的后继设为指令目标地址。若使用寄存器间接寻址,则可以回溯扫描各程序指令寻找寄存器号,并通过计算得出指令的转移地址,然后将该间接指令的后继设为指令目标地址。重复间接转移地址的定位过程,直至没有新的间接转移指令出现。
[0063]参考图3,图3所示为一个实施例的继电保护装置嵌入式软件的反汇编系统结构示意图,包括:
[0064]识别模块10,用于获取继电保护装置嵌入式软件的反汇编代码中的各个指令,分别识别间接转移类型的指令及其指令地址;
[0065]建立模块20,用于根据所述指令的指令类型建立用于保存指令地址的二叉树;其中所述二叉树中,一个结点保存一个指令地址,所述二叉树左子树的结点用于保存所述间接转移类型的指令的指令地址;
[0066]设置模块30,用于在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址;
[0067]反编译模块40,用于获取所述目标地址对应的指令内容,对所述指令内容进行反编译。
[0068]本发明提供的继电保护装置嵌入式软件的反汇编系统与本发明提供的继电保护装置嵌入式软件的反汇编方法一一对应,在所述继电保护装置嵌入式软件的反汇编方法的实施例阐述的技术特征及其有益效果均适用于继电保护装置嵌入式软件的反汇编系统的实施例中,特此声明。
[0069]以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0070]以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
【主权项】
1.一种继电保护装置嵌入式软件的反汇编方法,其特征在于,包括如下步骤: 获取继电保护装置嵌入式软件的反汇编代码中的各个指令,分别识别间接转移类型的指令及其指令地址; 根据所述指令的指令类型建立用于保存指令地址的二叉树;其中所述二叉树中,一个结点保存一个指令地址,所述二叉树左子树的结点用于保存所述间接转移类型的指令的指令地址; 在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址; 获取所述目标地址对应的指令内容,对所述指令内容进行反编译。2.根据权利要求1所述的继电保护装置嵌入式软件的反汇编方法,其特征在于,所述根据所述指令的指令类型建立用于保存指令地址的二叉树的步骤后还包括: 获取反汇编代码中第一个指令的指令地址; 将所述第一个指令的指令地址保存至二叉树的根节点。3.根据权利要求1所述的继电保护装置嵌入式软件的反汇编方法,其特征在于,所述根据所述指令的指令类型建立用于保存指令地址的二叉树的步骤包括: 根据所述反汇编代码中间接转移类型的指令个数建立二叉树,所述二叉树中左子树的结点个数等于指令个数; 判断反汇编代码中的指令是否为间接转移指令; 若是,则将所述指令的地址保存至二叉树的左子树,若反汇编代码中的指令为非间接转移指令,则将所述指令的地址保存至二叉树的右子树; 将所述指令的指令地址进行标记,并获取下一个指令,返回执行判断反汇编代码中的指令是否为间接转移指令的步骤。4.根据权利要求3所述的继电保护装置嵌入式软件的反汇编方法,其特征在于,所述判断反汇编代码中的指令是否为间接转移指令的步骤前还包括: 获取反汇编代码中指令的指令地址; 判断所述指令地址是否已标记; 若是,则获取下一个指令。5.根据权利要求3所述的继电保护装置嵌入式软件的反汇编方法,其特征在于,所述判断反汇编代码中的指令是否为间接转移指令的步骤前还包括: 获取反汇编代码中指令的指令地址; 判断所述指令地址是否在设定的地址范围外; 若是,则对所述二叉树的结点进行遍历。6.根据权利要求1所述的继电保护装置嵌入式软件的反汇编方法,其特征在于,所述在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址的步骤包括: 对二叉树进行寄存器间接寻址,回溯扫描各指令地址,寻找各指令地址对应的寄存器号,并根据所述寄存器号计算目标地址。7.根据权利要求1所述的继电保护装置嵌入式软件的反汇编方法,其特征在于,所述在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址的步骤包括: 对二叉树进行存储器间接寻址,回溯扫描各指令地址,寻找各指令地址对应的存储器变量,并根据所述存储器变量计算目标地址。8.根据权利要求1所述的继电保护装置嵌入式软件的反汇编方法,其特征在于,所述在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址的步骤后还包括: 检测当前遍历的二叉树结点的后继是否为空; 若是,则判断所述二叉树遍历完毕。9.根据权利要求1至8任一项所述的继电保护装置嵌入式软件的反汇编方法,其特征在于,所述指令类型包括非间接转移指令类型;所述获取所述目标地址对应的指令内容,对所述指令内容进行反编译的步骤后还包括: 将非间接转移类型的指令所对应的指令地址分别保存至二叉树中右子树的各个结点;在对嵌入式软件进行反汇编时,查找所述二叉树的右子树,获取所述右子树中各个结点保存的指令地址; 对右子树中各个结点保存的指令地址所对应的指令内容进行反编译。10.—种继电保护装置嵌入式软件的反汇编系统,其特征在于,包括: 识别模块,用于获取继电保护装置嵌入式软件的反汇编代码中的各个指令,分别识别间接转移类型的指令及其指令地址; 建立模块,用于根据所述指令的指令类型建立用于保存指令地址的二叉树;其中所述二叉树中,一个结点保存一个指令地址,所述二叉树左子树的结点用于保存所述间接转移类型的指令的指令地址; 设置模块,用于在对嵌入式软件进行反汇编时,遍历所述二叉树的结点,查找所述二叉树的左子树,将所述左子树的后继结点所对应的指令地址设置为目标地址; 反编译模块,用于获取所述目标地址对应的指令内容,对所述指令内容进行反编译。
【文档编号】G06F9/45GK106055378SQ201610396955
【公开日】2016年10月26日
【申请日】2016年6月6日
【发明人】陈华军, 王剑亮, 宾建伟, 张宝林, 刘奕宏, 蒙家晓, 黄建理, 杜金燃
【申请人】中国南方电网有限责任公司电网技术研究中心, 南方电网科学研究院有限责任公司, 工业和信息化部电子第五研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1