一种反编译数据流分析中的寄存器清除方法及系统的制作方法

文档序号:6374741阅读:472来源:国知局
专利名称:一种反编译数据流分析中的寄存器清除方法及系统的制作方法
技术领域
本发明涉及反编译技术领域,特别是涉及ー种反编译数据流分析中的寄存器清除方法及系统。
背景技术
反编译技术作为计算机逆向技术中不可或缺的一部分,在分析系统漏洞、软件安全以及病毒木马等领域得到了广泛应用。反编译技术可以将汇编语言)转换为高级语言(如C语言)。在反编译技术中,最重要、最困难的 部分是数据流分析。数据流分析是ー种用于收集计算机程序在不同点计算的值的信息的技木。具体的,可以使用程序控制流图(CFG,control flow graph)来确定对变量的一次赋值可能传播到程序中的哪些部分。在数据流分析中,主要包括寄存器的清除和条件码的清除两个阶段。其中,现有的寄存器清除阶段一般采用如下方法让两个语句相互映射,然后消去其中叠加的寄存器。这种方法会造成磁盘的频繁读写,耗费了大量时间,执行效率低。

发明内容
为解决上述技术问题,本发明实施例提供一种反编译数据流分析中的寄存器清除方法及系统,以解决现有寄存器清除方法执行效率低的问题,技术方案如下一种反编译数据流分析中的寄存器清除方法,包括打开寄存器清除之前汇编语言的代码文件并读取所述代码文件中的所有函数语句;对所读取的函数语句依次进行判断,判断函数语句中是否包括寄存器名称,如果是,则构建ニ叉树并将该函数语句输入到所述ニ叉树中;对包含有寄存器名称的函数语句依次进行判断,判断该函数语句中是否包括ニ叉树右孩子结束标识,如果是,则对构建的ニ叉树进行消元处理以去除所述ニ叉树中的寄存器名称,生成最简ニ叉树,根据所述最简ニ叉树生成高级语言的函数语句;否则,继续判断后续函数语句中是否包括寄存器名称。优选的,所述寄存器名称为EAX、AX、BX、CX、DX、SP、SI、BP_DI。优选的,所述打开寄存器清除之前汇编语言的代码文件并读取所述代码文件中的所有函数语句,包括打开寄存器清除之前汇编语言的代码文件;根据所述代码文件中的所有函数语句构建单链表;遍历所述单链表。优选的,当所述寄存器名称为EAX时,所述ニ叉树右孩子结束标识为“eax ; ”。优选的,所述构建ニ叉树并将该函数语句输入到所述ニ叉树中,包括构建ニ叉树;将该函数语句中等号左边的代码输入到所述ニ叉树中的左孩子中;
将该函数语句中等号右边的代码输入到所述ニ叉树中的右孩子中。优选的,所述进行消元处理以去除所述ニ叉树中的寄存器名称,生成最简ニ叉树,包括使用顶层根节点的右孩子中的代码替换顶层根节点下一层节点的右孩子中的寄存器名称并删除所述顶层根节点的下ー层节点。一种反编译数据流分析中的寄存器清除系统,包括读取单元、寄存器名称判断单元、ニ叉树构建単元、结束标识判断単元、消元単元和高级语言生成単元,所述读取単元,用于打开寄存器清除之前汇编语言的代码文件并读取所述代码文件中的所有函数语句;所述寄存器名称判断単元,用于对所读取的函数语句依次进行判断,判断函数语句中是否包括寄存器名称,如果是,则触发所述ニ叉树构建単元;所述ニ叉树构建単元,用于构建ニ叉树并将该函数语句输入到所述ニ叉树中;所述结束标识判断単元,用于对包含有寄存器名称的函数语句依次进行判断,判断该函数语句中是否包括ニ叉树右孩子结束标识,如果是,则触发所述消元単元;否则发送一判断指令到所述寄存器名称判断単元,使所述寄存器名称判断単元继续判断后续函数语句中是否包括寄存器名称;所述消元単元,用于对构建的ニ叉树进行消元处理以去除所述ニ叉树中的寄存器名称,生成最简_■叉树;所述高级语言生成単元,用于根据所述最简ニ叉树生成高级语言的函数语句。优选的,所述读取単元包括文件打开单元、单链表构建子単元和单链表遍历子单元,所述文件打开子单元,用于打开寄存器清除之前汇编语言的代码文件;所述单链表构建子単元,用于根据所述代码文件中的所有函数语句构建单链表;所述单链表遍历子単元,用于遍历所述单链表。优选的,所述ニ叉树构建単元包括ニ叉树构建子単元、左孩子子単元和右孩子子单元,所述ニ叉树构建子单元,用于构建ニ叉树;所述左孩子子単元,用于将该函数语句中等号左边的代码输入到所述ニ叉树中的左孩子中;所述右孩子子単元,用于将该函数语句中等号右边的代码输入到所述ニ叉树中的右孩子中。优选的,所述消元単元具体设置为使用顶层根节点的右孩子中的代码替换顶层根节点下一层节点的右孩子中的寄存器名称并删除所述顶层根节点的下ー层节点。通过应用以上技术方案,本发明提供的一种反编译数据流分析中的寄存器清除方法及系统,可以一次读取所有的函数语句,不用再多次进行读写。同吋,由于根据读取的函数语句构建了ニ叉树并对ニ叉树进行消元处理,因此可以很方便、快捷的得到不包含寄存器名称的函数语句,执行效率高。


为了更清除地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图I为本发明实施例提供的一种反编译数据流分析中的寄存器清除方法的流程示意图;图2为本发明实施例提供的ー种汇编语言函数语句的示意图;图3为本发明实施例提供的另ー种反编译数据流分析中的寄存器清除方法的流
程不意图;图4为本发明实施例提供的一种反编译数据流分析中的寄存器清除方法中单链表的不意图;图5为本发明实施例提供的另ー种反编译数据流分析中的寄存器清除方法的流程不意图;图6为本发明实施例提供的汇编语言语句的示意图;图7为本发明实施例提供的ニ叉树的示意图;图8为本发明实施例提供的ニ叉树的示意图;图9为本发明实施例提供的ニ叉树的示意图;图10为本发明实施例提供的ニ叉树的示意图;图11为本发明实施例提供的ニ叉树的示意图;图12为本发明实施例提供的ニ叉树的示意图;图13为本发明实施例提供的一种反编译数据流分析中的寄存器清除系统的结构示意图;图14为本发明实施例提供的另ー种反编译数据流分析中的寄存器清除系统的结构示意图;图15为本发明实施例提供的另ー种反编译数据流分析中的寄存器清除系统的结构示意图。
具体实施例方式为了使本技术领域的人员更好地理解本发明中的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清除、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。如图I所示,本发明实施例提供的一种反编译数据流分析中的寄存器清除方法,可以包括S101、打开寄存器清除之前汇编语言的代码文件并读取所述代码文件中的所有函数语句;其中,寄存器清除之前汇编语言的代码文件被打开后可以如图2所示。可以理解的是,汇编语言以“;”作为函数语句间的标识,每ー个“;”都代表着ー个函数语句的结束。本发明可以在ー个读操作的前提下,将所述代码文件中的函数语句全部读取。S102、对所读取的函数语句依次进行判断,判断函数语句中是否包括寄存器名称,如果是,则执行步骤S103 ;否则执行步骤S107 ;所述寄存器名称可以为EAX、AX、BX、CX、DX、SP、SI、BP或DI。需要说明的一点是,在汇编语言及高级语言中,EAX可以为小写的“eax”。一般而言,在约翰 冯 诺依曼计算机体系结构中,计算机寄存器主要包括AX、BX、CX、DX、SP、SI、BP、DI等。随着低8位、高8位、16位、32位的不同,对寄存器的读取以及名称的叫法也有不同。在汇编代码中,使用最多且具有迭代意义主要是AX中的EAX。例如堆栈寄存器的用处主要是恢复系统环境等。本发明在此并不限定寄存器的具体名称。如图2所示,在读取代码文件的函数语句后,会发现第一句(int a=l ;)中没有寄存器名称,这时,可以直接将该函数语句进行输出处理,不用再进行寄存器清除。S103、构建ニ叉树并将该函数语句输入到所述ニ叉树中;在计算机科学中,ニ叉树是每个结点最多有两个子树的有序树。通常子树的根被称作左子树(left subtree)和右子树(right subtree)。姆个节点的两个子节点分别被称为左孩子和右孩子。在实际应用中,可以将包括寄存器名称的函数语句中等号左边的代码输入到ニ叉树中的左孩子中,将包括寄存器名称的函数语句中等号右边的代码输入到ニ叉树中的右孩子中。由于读取的函数语句为多个,可以按照函数语句的顺序依次构建。如,将第一个包含寄存器名称的函数语句构造为高度为2的ニ叉树,将等号左右边的代码分别输入该ニ叉树的左孩子和右孩子中。将第二个包含寄存器名称的函数语句中等号左边的代码输入上一左孩子的左孩子中,将等号右边的代码输入上一左孩子的右孩子中。按照以上规律,依次对剰余的函数语句进行处理,直到函数语句中出现ニ叉树右孩子结束标识为止。S104、对包含有寄存器名称的函数语句依次进行判断,判断该函数语句中是否包括ニ叉树右孩子结束标识,如果是,则执行步骤S105,否则,继续执行步骤S102 ;由于并不确定哪ー个函数语句中存在ニ叉树右孩子结束标识,因此可以在步骤S103后,进ー步依次判断包含有寄存器名称的函数语句中是否包括有ニ叉树右孩子结束标识。其中,ニ叉树右孩子结束标识可以为“寄存器名称;”,如“eax ; ”或“BX ; ”等。当寄存器名称为eax吋,ニ叉树右孩子结束标识为“eax ; ”。S105、对构建的ニ叉树进行消元处理以去除所述ニ叉树中的寄存器名称,生成最简ニ叉树;具体的,可以使用顶层根节点的右孩子中的代码替换顶层根节点下一层节点的右孩子中的寄存器名称并删除所述顶层根节点的下ー层节点。S106、根据所述最简ニ叉树生成高级语言的函数语句;在实际应用中,可以将最简ニ叉树左孩子中的代码放于等号左边,将最简ニ叉树右孩子中的代码放于等号右边,并和等号一起,形成高级语言的函数语句。S107、进行输出处理。
本发明实施例提供的一种反编译数据流分析中的寄存器清除方法,可以一次读取所有的函数语句,不用再多次进行读写。同吋,由于根据读取的函数语句构建了ニ叉树并对ニ叉树进行消元处理,因此可以很方便、快捷的得到不包含寄存器名称的函数语句,执行效率高。如图3所示,在本发明实施例提供的另ー种反编译数据流分析中的寄存器清除方法中,图I所示实施例中的步骤SlOl可以包括SlOla、打开寄存器清除之前汇编语言的代码文件;SlOlb、根据所述代码文件中的所有函 数语句构建单链表;单链表可以用ー组地址任意的存储单元存放线性表中的数据元素。它以元素(数据元素的映象)加指针(指示后继元素存储位置)来表示结点。与直接读取代码文件中的函数语句相比,使用单链表可以随意改变读取顺序,更为方便。SlOlc、遍历所述单链表。对于图2中的第一个函数语句“int a=l ; ”,可以构建如图4所示的单链表,其中,单链表中每个字符占用ー个节点,“i”为头结点,指针指向头结点“i”,该单链表中包括一首节点。指针可以遍历单链表,同时进行字符匹配操作。如果在指针遇到“;”之前,都未遇到eax,则输出所遍历的代码。在图4中显示为遍历了“ int a=l;”,则将“int a=l;”输出而不进行寄存器删除处理。如图5所示,本发明实施例提供的另ー种反编译数据流分析中的寄存器清除方法中,图I所示实施例中的步骤S103可以包括S103a、构建ニ叉树;S103b、将该函数语句中等号左边的代码输入到所述ニ叉树中的左孩子中;S103c、将该函数语句中等号右边的代码输入到所述ニ叉树中的右孩子中。如图6所示,以图2所示的部分函数语句为例进行说明由于第一句函数语句“int a=l;”中并不包括寄存器名称,因此直接进行输出处理。然后判断第二句,由于第二句中包含寄存器名称“eax”,因此将等号左边的代码“eax”输入ニ叉树的左孩子(节点B)中,将右边的代码“int a”输入ニ叉树的右孩子(节点C)中,其中,该ニ叉树的根节点为节点A。形成如图7所示的ニ叉树,该ニ叉树的高度为2。按照顺序继续对下一函数语句进行判断,第三句中包含“eax”,同理,将“eax”放入B节点的左孩子(节点D)中,将“eax+int a”放入B节点的右孩子(节点E)中,形成如图8所示的ニ叉树,该ニ叉树的高度为3。按照上述方法继续对ニ叉树进行构建,并最终构建形成如图9所示的ニ叉树,该ニ叉树的高度为5。由于图6所示的函数语句中的最后一句中包括有ニ叉树右孩子结束标识“eax; ”,因此在处理完这句函数语句后,该ニ叉树就创建完毕。后续函数语句将形成新的ニ叉树。在创建完ニ叉树后,需要对其进行消元处理,以去除ニ叉树中的寄存器名称。优选的,图I所示实施例中的步骤S 105可以包括使用顶层根节点的右孩子中的代码替换顶层根节点下一层节点的右孩子中的寄存器名称并删除顶层根节点下ー层节点。下面以图9所示的已经创建好的ニ叉树为例进行说明
首先,从图9所示ニ叉树的顶层根节点(节点A)开始,将节点A的右孩子(节点C)中的代码替换下ー层的右孩子(节点E)中的寄存器名称“eax”并删除该层的节点B和节点C,形成如图10所示的ニ叉树。此时,顶层根节点的左孩子变为节点D,右孩子变为节点E。然后,将图10所示ニ叉树中的顶层根节点的右孩子(节点E)中的代码替换下ー层右孩子(节点G)中的寄存器名称,并删除节点D和节点E,形成如图11所示的ニ叉树。此时,顶层根节点的左孩子变为节点F,右孩子变为节点G。最后,将图11所示ニ叉树中的顶层根节点的右孩子(节点G)中的代码替换下ー层右孩子(节点I)中的寄存器名称,并删除节点F和节点G,形成如图12所示的ニ叉树。此时,顶层根节点的左孩子变为节点H,右孩子变为节点I。由于此时ニ叉树的高度已经为2,已经是最简ニ叉树,因此不用再进行消元处理。这时,可以执行步骤S106,根据图12所示的最简ニ叉树,将最简ニ叉树的左孩子作为所要输出函数等号左边的代码,将最简ニ叉树的右孩子作为所要输出的函数等号右边的代码,并最終得到所要输出的高级语言函数语句为“int al=int a+int a+int a ; ”。可以看到,该高级语言函数语句中并不包含寄存器名称,本发明已经成功的将其去除。与本发明提供的方法实施例相对应,本发明还提供了一种反编译数据流分析中的寄存器清除系统。如图13所示,本发明实施例提供的一种反编译数据流分析中的寄存器清除系统,可以包括读取单元100、寄存器名称判断単元200、ニ叉树构建単元300、结束标识判断单元400、消元单元500和高级语言生成单元600,所述读取単元100,用于打开寄存器清除之前汇编语言的代码文件并读取所述代码文件中的所有函数语句;其中,寄存器清除之前汇编语言的代码文件被打开后可以如图2所示。可以理解的是,汇编语言以“;”作为函数语句间的标识,每ー个“;”都代表着ー个函数语句的结束。本发明可以在ー个读操作的前提下,将所述代码文件中的函数语句全部读取。所述寄存器名称判断単元200,用于对所读取的函数语句依次进行判断,判断函数语句中是否包括寄存器名称,如果是,则触发所述ニ叉树构建単元300 ;所述寄存器名称可以为EAX、AX、BX、CX、DX、SP、SI、BP或DI。需要说明的一点是,在汇编语言及高级语言中,EAX可以为小写的“eax”一般而言,在约翰 冯 诺依曼计算机体系结构中,计算机寄存器主要包括AX、BX、CX、DX、SP、SI、BP、DI等。随着低8位、高8位、16位、32位的不同,对寄存器的读取以及名称的叫法也有不同。在汇编代码中,使用最多且具有迭代意义主要是AX中的EAX。例如堆栈寄存器的用处主要是恢复系统环境等。本发明在此并不限定寄存器的具体名称。如图2所示,在读取代码文件的函数语句后,会发现第一句(int a=l ;)中没有寄存器名称,这时,可以直接将该函数语句进行输出处理,不用再进行寄存器清除。所述ニ叉树构建単元300,用于构建ニ叉树并将该函数语句输入到所述ニ叉树中;在计算机科学中,ニ叉树是每个结点最多有两个子树的有序树。通常子树的根被称作左子树(left subtree)和右子树(right subtree)。姆个节点的两个子节点分别被称为左孩子和右孩子。
在实际应用中,可以将包括寄存器名称的函数语句中等号左边的代码输入到ニ叉树中的左孩子中,将包括寄存器名称的函数语句中等号右边的代码输入到ニ叉树中的右孩子中。由于读取的函数语句为多个,可以按照函数语句的顺序依次构建。如,将第一个包含寄存器名称的函数语句构造为高度为2的ニ叉树,将等号左右边的代码分别输入该ニ叉树的左孩子和右孩子中。将第二个包含寄存器名称的函数语句中等号左边的代码输入上一左孩子的左孩子中,将等号右边的代码输入上一左孩子的右孩子中。按照以上规律,依次对剰余的函数语句进行处理,直到函数语句中出现ニ叉树右孩子结束标识为止。所述结束标识判断単元400,用于对包含有寄存器名称的函数语句依次进行判断,判断该函数语句中是否包括ニ叉树右孩子结束标识,如果是,则触发所述消元単元500 ;否则发送一判断指令到所述寄存器名称判断単元200,使所述寄存器名称判断単元200继续
判断后续函数语句中是否包括寄存器名称;其中,ニ叉树右孩子结束标识可以为“寄存器名称;”,如“eax; ”或“BX;,,等。当寄存器名称为eax吋,ニ叉树右孩子结束标识为“eax ; ”。所述消元単元500,用于对构建的ニ叉树进行消元处理以去除所述ニ叉树中的寄存器名称,生成最简ニ叉树;具体的,可以使用顶层根节点的右孩子中的代码替换顶层根节点下一层节点的右孩子中的寄存器名称并删除所述顶层根节点的下ー层节点。所述高级语言生成単元600,用于根据所述最简ニ叉树生成高级语言的函数语句。在实际应用中,可以将最简ニ叉树左孩子中的代码放于等号左边,将最简ニ叉树右孩子中的代码放于等号右边,并和等号一起,形成高级语言的函数语句。可以理解的是,在生成高级语言函数语句后就可以对其进行输出处理。本发明实施例提供的一种反编译数据流分析中的寄存器清除系统,可以一次读取所有的函数语句,不用再多次进行读写。同吋,由于根据读取的函数语句构建了ニ叉树并对ニ叉树进行消元处理,因此可以很方便、快捷的得到不包含寄存器名称的函数语句,执行效率高。如图14所示,本发明实施例提供的另ー种反编译数据流分析中的寄存器清除系统中,所述读取単元100可以包括文件打开单元110、单链表构建子単元120和单链表遍历子单元130,所述文件打开子单元110,用于打开寄存器清除之前汇编语言的代码文件;所述单链表构建子単元120,用于根据所述代码文件中的所有函数语句构建单链表;单链表可以用ー组地址任意的存储单元存放线性表中的数据元素。它以元素(数据元素的映象)加指针(指示后继元素存储位置)来表示结点。与直接读取代码文件中的函数语句相比,使用单链表可以随意改变读取顺序,更为方便。所述单链表遍历子単元130,用于遍历所述单链表。对于图2中的第一个函数语句“int a=l ; ”,可以构建如图4所示的单链表,其中,单链表中每个字符占用ー个节点,“i”为头结点,指针指向头结点“i”,该单链表中包括一首节点。指针可以遍历单链表,同时进行字符匹配操作。如果在指针遇到“;”之前,都未遇到eax,则输出所遍历的代码。在图4中显示为遍历了“ int a=l;”,则将“int a=l;”输出而不进行寄存器删除处理。如图15所示,本发明实施例提供的另ー种反编译数据流分析中的寄存器清除系统中,所述ニ叉树构建単元300可以包括ニ叉树构建子単元310、左孩子子単元320和右孩子子単元330,所述ニ叉树构建子单元310,用于构建ニ叉树;所述左孩子子単元320,用于将该函数语句中等号左边的代码输入到所述ニ叉树中的左孩子中;所述右孩子子単元330,用于将该函数语句中等号右边的代码输入到所述ニ叉树
中的右孩子中。如图6所示,以图2所示的部分函数语句为例进行说明由于第一句函数语句“int a=l;”中并不包括寄存器名称,因此直接进行输出处理。然后判断第二句,由于第二句中包含寄存器名称“eax”,因此将等号左边的代码“eax”输入ニ叉树的左孩子(节点B)中,将右边的代码“int a”输入ニ叉树的右孩子(节点C)中,其中,该ニ叉树的根节点为节点A。形成如图7所示的ニ叉树,该ニ叉树的高度为2。按照顺序继续对下一函数语句进行判断,第三句中包含“ eax”,同理,将“eax”放入B节点的左孩子(节点D)中,将“eax+int a”放入B节点的右孩子(节点E)中,形成如图8所示的ニ叉树,该ニ叉树的高度为3。按照上述方法继续对ニ叉树进行构建,并最终构建形成如图9所示的ニ叉树,该ニ叉树的高度为5。由于图6所示的函数语句中的最后一句中包括有ニ叉树右孩子结束标识“eax; ”,因此在处理完这句函数语句后,该ニ叉树就创建完毕。后续函数语句将形成新的ニ叉树。在创建完ニ叉树后,需要对其进行消元处理,以去除ニ叉树中的寄存器名称。优选的,消元単元500可以具体设置为使用顶层根节点的右孩子中的代码替换顶层根节点下一层节点的右孩子中的寄存器名称并删除所述顶层根节点的下ー层节点。下面以图9所示的已经创建好的ニ叉树为例进行说明首先,从图9所示ニ叉树的顶层根节点(节点A)开始,将节点A的右孩子(节点C)中的代码替换下ー层的右孩子(节点E)中的寄存器名称“eax”并删除该层的节点B和节点C,形成如图10所示的ニ叉树。此时,顶层根节点的左孩子变为节点D,右孩子变为节点E。然后,将图10所示ニ叉树中的顶层根节点的右孩子(节点E)中的代码替换下ー层右孩子(节点G)中的寄存器名称,并删除节点D和节点E,形成如图11所示的ニ叉树。此时,顶层根节点的左孩子变为节点F,右孩子变为节点G。最后,将图11所示ニ叉树中的顶层根节点的右孩子(节点G)中的代码替换下ー层右孩子(节点I)中的寄存器名称,并删除节点F和节点G,形成如图12所示的ニ叉树。此时,顶层根节点的左孩子变为节点H,右孩子变为节点I。由于此时ニ叉树的高度已经为2,已经是最简ニ叉树,因此不用再进行消元处理。这时,可以触发高级语言生成単元600,根据图12所示的最简ニ叉树,将最简ニ叉树的左孩子作为所要输出函数等号左边的代码,将最简ニ叉树的右孩子作为所要输出的函数等号右边的代码,并最終得到所要输出的高级语言函数语句为“int al=int a+inta+int a;”。可以看到,该高级语言函数语句中并不包含寄存器名称,本发明已经成功的将其去除。为了描述的方便,描述以上装置时以功能分为各种単元分别描述。当然,在实施本发明时可以把各单元的功能在同一个或多个软件和/或硬件中实现。通过以上的实施方式的描述可知,本领域的技术人员可以清除地了解到本发明可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如R0M/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行 本发明各个实施例或者实施例的某些部分所述的方法。本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相參见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处參见方法实施例的部分说明即可。以上所描述的系统实施例仅仅是示意性的,其中所述作为分离部件说明的単元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理単元,即可以位于ー个地方,或者也可以分布到多个网络単元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。本发明可用于众多通用或专用的计算系统环境或配置中。例如个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。本发明可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将ー个实体或者操作与另ー个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。以上所述仅是本发明的具体实施方式
,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
权利要求
1.一种反编译数据流分析中的寄存器清除方法,其特征在于,包括 打开寄存器清除之前汇编语言的代码文件并读取所述代码文件中的所有函数语句;对所读取的函数语句依次进行判断,判断函数语句中是否包括寄存器名称,如果是,则构建二叉树并将该函数语句输入到所述二叉树中; 对包含有寄存器名称的函数语句依次进行判断,判断该函数语句中是否包括二叉树右孩子结束标识,如果是,则对构建的二叉树进行消元处理以去除所述二叉树中的寄存器名称,生成最简二叉树,根据所述最简二叉树生成高级语言的函数语句;否则,继续判断后续函数语句中是否包括寄存器名称。
2.根据权利要求I所述的方法,其特征在于,所述寄存器名称为EAX、AX、BX、CX、DX、SP、SI、BP*DI。
3.根据权利要求I或2所述的方法,其特征在于,所述打开寄存器清除之前汇编语言的代码文件并读取所述代码文件中的所有函数语句,包括 打开寄存器清除之前汇编语言的代码文件; 根据所述代码文件中的所有函数语句构建单链表; 遍历所述单链表。
4.根据权利要求I所述的方法,其特征在于,当所述寄存器名称为EAX时,所述二叉树右孩子结束标识为“eax; ”。
5.根据权利要求I所述的方法,其特征在于,所述构建二叉树并将该函数语句输入到所述二叉树中,包括 构建二叉树; 将该函数语句中等号左边的代码输入到所述二叉树中的左孩子中; 将该函数语句中等号右边的代码输入到所述二叉树中的右孩子中。
6.根据权利要求I所述的方法,其特征在于,所述进行消元处理以去除所述二叉树中的寄存器名称,生成最简二叉树,包括 使用顶层根节点的右孩子中的代码替换顶层根节点下一层节点的右孩子中的寄存器名称并删除所述顶层根节点的下一层节点。
7.一种反编译数据流分析中的寄存器清除系统,其特征在于,包括读取单元、寄存器名称判断单元、二叉树构建单元、结束标识判断单元、消元单元和高级语言生成单元, 所述读取单元,用于打开寄存器清除之前汇编语言的代码文件并读取所述代码文件中的所有函数语句; 所述寄存器名称判断单元,用于对所读取的函数语句依次进行判断,判断函数语句中是否包括寄存器名称,如果是,则触发所述二叉树构建单元; 所述二叉树构建单元,用于构建二叉树并将该函数语句输入到所述二叉树中; 所述结束标识判断单元,用于对包含有寄存器名称的函数语句依次进行判断,判断该函数语句中是否包括二叉树右孩子结束标识,如果是,则触发所述消元单元;否则发送一判断指令到所述寄存器名称判断单元,使所述寄存器名称判断单元继续判断后续函数语句中是否包括寄存器名称; 所述消元单元,用于对构建的二叉树进行消元处理以去除所述二叉树中的寄存器名称,生成最简_■叉树;所述高级语言生成单元,用于根据所述最简二叉树生成高级语言的函数语句。
8.根据权利要求7所述的系统,其特征在于,所述读取单元包括文件打开单元、单链表构建子单元和单链表遍历子单元, 所述文件打开子单元,用于打开寄存器清除之前汇编语言的代码文件; 所述单链表构建子单元,用于根据所述代码文件中的所有函数语句构建单链表; 所述单链表遍历子单元,用于遍历所述单链表。
9.根据权利要求7所述的系统,其特征在于,所述二叉树构建单元包括二叉树构建子单元、左孩子子单元和右孩子子单元, 所述二叉树构建子单元,用于构建二叉树; 所述左孩子子单元,用于将该函数语句中等号左边的代码输入到所述二叉树中的左孩子中; 所述右孩子子单元,用于将该函数语句中等号右边的代码输入到所述二叉树中的右孩子中。
10.根据权利要求7所述的系统,其特征在于,所述消元单元具体设置为 使用顶层根节点的右孩子中的代码替换顶层根节点下一层节点的右孩子中的寄存器名称并删除所述顶层根节点的下一层节点。
全文摘要
本发明公开了一种反编译数据流分析中的寄存器清除方法及系统,可以读取代码文件中的所有函数语句并对所读取的函数语句依次进行判断,当函数语句中包括寄存器名称时,构建二叉树并将该函数语句输入到所述二叉树中;进一步对包含有寄存器名称的函数语句依次进行判断,当该函数语句中包括二叉树右孩子结束标识时,对构建的二叉树进行消元处理以去除所述二叉树中的寄存器名称,生成最简二叉树,根据所述最简二叉树生成高级语言的函数语句。由于可以一次将所有语句进行读取,因此本发明不用再多次进行读写。同时,由于根据读取的函数语句构建了二叉树并对二叉树进行消元处理,因此可以很方便、快捷的得到不包含寄存器名称的函数语句,执行效率高。
文档编号G06F17/30GK102855139SQ201210283230
公开日2013年1月2日 申请日期2012年8月10日 优先权日2012年8月10日
发明者姚力, 李少腾, 楼轶, 胡瑛俊, 吴幸, 陆春光, 刘金硕, 郑稳 申请人:浙江省电力公司电力科学研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1