本申请涉及软件领域,更具体地说,涉及一种基于跳转表定位arm固件装载基址的方法和装置。
背景技术:
嵌入式设备已经在生活变得越来越常见,比如数码摄像机、打印机、智能手表、固态盘等。所有这些设备运行着一个特殊软件,通常称为固件。固件是嵌入式设备的灵魂,因为一些嵌入式设备除了固件以外没有其它软件组成,因此固件也就很大程度上决定着嵌入式设备的功能及性能。
和传统软件一样,嵌入式设备的固件通常有缺陷或者漏洞,可以导致设备失效或者安全威胁。当需要分析固件的安全性或者维护遗留设备时,需要对固件进行逆向工程。逆向工程(reverseengineering)是指从可运行的软件产品出发,运用反汇编、反编译等技术,对软件产品进行逆向拆解和分析,推导出软件产品的设计原理、结构、算法、处理过程、运行方法及相关文档等。
在逆向工程中,当反汇编固件时,需要已知固件的运行环境的处理器类型和固件的装载基址。在对嵌入式系统固件进行逆向工程时,我们通常可以获得嵌入式系统的处理器类型,而无法得到固件的装载基址。
技术实现要素:
有鉴于此,本申请提供一种基于跳转表定位arm固件装载基址的方法和装置,以实现固件装载基址的定位。
为了实现上述目的,现提出的方案如下:
一种基于跳转表定位arm固件装载基址的方法,包括:
获取固件中switch语句编译生成的跳转表;
对所述跳转表中存储的内存地址进行排序,选取最小的内存地址作为所述switch语句中第一个case语句块的内存地址;
确定所述第一个case语句块的偏移量;
根据所述第一个case语句块的内存地址以及所述偏移量,计算并输出所述固件装载基址。
优选的,所述获取固件中switch语句的跳转表,包括:
依次对固件中switch语句的指令代码进行检测,以判断当前位置最前面三条指令代码是否依次为cmp指令、ldrls指令以及b指令;
若是,则继续对所述b指令后的指令代码进行检测,以获取所述跳转表;
若否,则跳过当前指令代码,对下一条指令代码进行检测。
优选的,所述计算并输出所述固件装载基址,之后还包括:
判断固件中switch语句的所有指令代码是否检测完毕;
若是,则结束对固件装载基址的定位过程;
若否,则继续对剩余的指令代码进行检测。
优选的,所述确定所述第一个case语句块偏移量,包括:
依次对固件中switch语句的指令代码进行检测,当检测到所述第一case语句块时,记录所述第一case语句块与固件文件起始位置之间的偏移量。
一种基于跳转表定位arm固件装载基址的装置,包括:
跳转表确定单元,用于获取固件中switch语句编译生成的跳转表;
语句块内存地址确定单元,用于对所述跳转表中存储的内存地址进行排序,选取最小的内存地址作为所述switch语句中第一个case语句块的内存地址;
语句块偏移量确定单元,用于确定所述第一个case语句块与所述固件文件起始位置的偏移量;
根据所述第一个case语句块的内存地址以及所述偏移量,计算并输出所述固件装载基址。
优选的,所述跳转表确定单元具体用于:
依次对固件中switch语句的指令代码进行检测,以判断当前位置最前面三条指令代码是否依次为cmp指令、ldrls指令以及b指令;
若是,则继续对所述b指令后的指令代码进行检测,以获取所述跳转表;
若否,则跳过当前指令代码,对下一条指令代码进行检测。
优选的,还包括:
判断单元,用于判断固件的所有指令代码是否检测完毕;
若是,则结束对固件装载基址的定位过程;
若否,则继续对剩余的指令代码进行检测。
优选的,所述语句块偏移量确定单元具体用于:
依次对固件中switch语句的指令代码进行检测,当检测到所述第一个case语句块时,记录所述第一个case语句块与固件文件起始位置之间的偏移量。
经由上述技术方案可知,本申请公开了一种基于跳转表定位arm固件装载基址的方法和装置。该方法在确定固件中switch语句的跳转表后,对跳转表中存储的内存地址进行排序,并选取最小的内存地址作为switch语句中第一个case语句块的内存地址。进而,确定所述第一个case语句块的偏移量,根据所述第一个case语句块的内存地址以及所述偏移量,计算并输出所述固件装载基址。本发明可实现对固件装载基址的定位,从而实现更加有效地对固件的逆向工程。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1示出了本发明一个实施例公开的一种基于跳转表定位arm固件装载基址的方法的流程示意图;
图2示出了switch语句的汇编模型;
图3示出了本发明公开的固件装载示意图;
图4示出了本发明另一个实施例公开的一种基于跳转表定位arm固件装载基址的装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参见图1示出了本发明一个实施例公开的一种基于跳转表定位arm固件装载基址的方法的流程示意图。
在本实施例中,该方法包括:
s101:获取固件中switch语句编译生成的跳转表。
当固件的源代码中存在switch语句时,并且switch中case的值是连续的并且是稠密的,gcc编译器通常把这些case的值通常存储在一个跳转表中,跳转表中的数字指定了所有的case语句块的内存地址,参见图2示出了switch语句的汇编模型。
由图2可知,一般情况下跳转表之前为b指令,ldrls指令,跳转表之后为case语句块。具体的,可依次对固件中switch语句的指令代码进行检测,判断当前位置最前面三条指令代码是否依次为cmp指令、ldrls指令以及b指令,若是,则继续对所述b指令后的指令代码进行检测,以获取所述跳转表。若否,则跳过当前指令代码,对下一条指令代码进行检测。
s102:对所述跳转表中存储的内存地址进行排序,选取最小的内存地址作为所述switch语句中第一个case语句块的内存地址。
跳转表中包含n个内存地址,分别为addr_1、addr_2、…、addr_n,一般情况下,这n个内存地址中最小的内存地址指向跳转表后第一个case语句块,即jt[0]。
s103:确定所述第一个case语句块的偏移量。
具体的,依次对固件中switch语句编译产生的的指令代码进行检测,当检测到所述第一个case语句块时,记录所述第一个case语句块与固件文件起始位置之间的偏移量,即offset_case1。
s104:根据所述第一个case语句块的内存地址以及所述偏移量,计算并输出所述固件装载基址。
参见图3示出了本发明公开的固件装载示意图。
由图3可知,当case语句块的偏移量和内存地址确定后,即可计算该固件的装载基址,即固件的装载基址等于case语句块的内存地址与偏移量的差。
s105:判断固件的所有指令代码是否检测完毕。
若是,则结束对固件装载基址的定位过程;
若否,则继续对剩余的指令代码进行检测。
由以上实施例可知,本申请公开了一种基于跳转表定位arm固件装载基址的方法。该方法在确定固件中switch语句的跳转表后,对跳转表中存储的内存地址进行排序,并选取最小的内存地址作为switch语句中第一个case语句块的内存地址。进而,确定所述第一case语句块的偏移量,根据所述第一case语句块的内存地址以及所述偏移量,计算并输出所述固件装载基址。本发明可实现对固件装载基址的定位,从而实现更加有效地对固件的逆向工程。
参见图4示出了本发明另一个实施例公开的一种基于跳转表定位arm固件装载基址的装置的结构示意图。
由图4可知,装置包括:跳转表确定单元1、语句块内存地址确定单元2、语句块偏移量确定单元3、计算单元4以及判断单元5。
跳转表确定单元用于获取固件中switch语句的跳转表。具体的依次对固件中switch语句的指令代码进行检测,以判断当前位置最前面三条指令代码是否依次为cmp指令、ldrls指令以及b指令、若是,则继续对所述b指令后的指令代码进行检测,以获取所述跳转表,若否,则跳过当前指令代码,对下一条指令代码进行检测。
语句块内存地址确定单元,用于对所述跳转表中存储的内存地址进行排序,选取最小的内存地址作为所述switch语句中第一个case语句块的内存地址。通常跳转表中包含n个内存地址,分别为addr_1、addr_2、…、addr_n,一般情况下,这n个内存地址中最小的内存地址指向跳转表后第一个case语句块,即jt[0]。
语句块偏移量确定单元,用于确定所述第一个case语句块与所述固件文件起始位置之间的偏移量。
计算单元,根据所述第一个case语句块的内存地址以及所述偏移量,计算并输出所述固件装载基址。
判断单元,用于判断固件中的所有指令代码是否检测完毕,若是,则结束对固件装载基址的定位过程;若否,则继续对剩余的指令代码进行检测。
需要说明的是该系统实施例与方法实施例相对应,其执行过程和执行原理相同,在此不作赘述。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。