应用程序的加载方法、装置、计算机设备及存储介质与流程

文档序号:16067218发布日期:2018-11-24 12:47阅读:260来源:国知局

本发明涉及计算机技术领域,尤其涉及一种应用程序的加载方法、装置、计算机设备及存储介质。

背景技术

链接器在生成一个应用程序的可执行文件时,会设置该可执行文件被加载时的默认基地址,应用程序的默认基地址一般被设置为0x00400000h,动态链接库的默认基地址一般被设置为0x10000000。在加载应用程序时,应用程序中的一个动态链接库被加载到内存中时,会被优先加载到默认基地址,如果该动态链接库加载时的默认基地址与其它动态链接库的基地址发生冲突,如该默认基地址已分配给其他动态链接库,则需要对该动态链接库的基地址进行重定位,以实现应用程序的正常加载和运行。

目前,在加载应用程序过程中,当判断一个地址是否需要重定位时,需要用到重定位表,重定位表里记录了应用程序的哪些地址需要重定位(重定位地址)以及如何进行重定位的信息。计算机设备可以采用循环查找或者排序查找的方法,循环查找是指枚举重定位表,也即是,将重定位表中所有的重定位地址列出来存储,每判断一个地址是否需要重定位,则循环一次存储了重定位地址的数据结构,如果该地址在该数据结构中,则确定该地址需要重定位,如果该地址不在该数据结构中,则确定该地址不需要重定位。排序查找是指先枚举重定位表,再对重定位表中的重定位地址进行排序,每判断一个地址是否需要重定位,则二分查找一次存储了重定位地址的数据结构。

在实现本发明的过程中,发明人发现相关技术至少存在以下问题:

在加载应用程序时,需要枚举重定位表,每判断一个地址是否需要重定位时,则需要查询存储了重定位地址的数据结构,复杂度高,当需要判断的地址很多时,需要耗费较长的时间。



技术实现要素:

本发明实施例提供了一种应用程序的加载方法、装置、计算机设备及存储介质,可以解决相关技术需要耗费较长的时间的问题。所述技术方案如下:

一方面,提供了一种应用程序的加载方法,所述方法包括:

将应用程序映射到内存缓冲区,所述应用程序的镜像大小是所述内存缓冲区的大小的预设倍数,所述内存缓冲区的每个比特位的取值为第一数值;

将所述应用程序的重定位表中的重定位地址,映射到所述内存缓冲区的对应比特位的取值更改为第二数值,所述重定位地址是指需要重定位的地址;

在加载所述应用程序时,当所述应用程序的地址映射到所述内存缓冲区的对应比特位的取值为所述第一数值时,按照所述地址进行所述应用程序的加载;

当所述应用程序的地址映射到所述内存缓冲区的对应比特位的取值为所述第二数值时,对所述地址进行重定位后,按照重定位后的地址进行所述应用程序的加载。

一方面,提供了一种应用程序的加载装置,所述装置包括:

映射模块,用于将应用程序映射到内存缓冲区,所述应用程序的镜像大小是所述内存缓冲区的大小的预设倍数,所述内存缓冲区的每个比特位的取值为第一数值;

更改模块,用于将所述应用程序的重定位表中的重定位地址,映射到所述内存缓冲区的对应比特位的取值更改为第二数值,所述重定位地址是指需要重定位的地址;

加载模块,用于在加载所述应用程序时,当所述应用程序的地址映射到所述内存缓冲区的对应比特位的取值为所述第一数值时,按照所述地址进行应用程序的加载;

所述加载模块还用于当所述应用程序的地址映射到所述内存缓冲区的对应比特位的取值为所述第二数值时,对所述地址进行重定位后,按照重定位后的地址进行应用程序的加载。

一方面,提供了一种电子设备,所述电子设备包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、至少一段程序、代码集或指令集由所述处理器加载并执行以实现上述应用程序的加载所执行的操作。

一方面,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、至少一段程序、代码集或指令集由处理器加载并执行以实现如上述应用程序的加载所执行的操作。

本发明实施例提供的技术方案带来的有益效果至少包括:

通过预先将应用程序映射到较小的内存缓冲区,并根据重定位表中需要重定位的地址,对内存缓冲区的对应比特位的取值进行标记,这样在加载应用程序时,直接找到应用程序的地址在内存缓冲区的对应比特位,即可根据该比特位的取值,快速地判断该地址是否需要重定位,以保证应用程序的正常加载。特别是当判断大量的地址是否需要重定位时,需要耗费的时间大大减少,效率提升明显。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例提供的一种应用程序的加载方法的流程图;

图2是本发明实施例提供的一种将应用程序映射到内存缓冲区的示意图;

图3是本发明实施例提供的一种数据目标表和重定位表的示意图;

图4是本发明实施例提供的一种初始化过程的示意图;

图5是本发明实施例提供的一种确定地址是否需要重定位的示意图;

图6是本发明实施例提供的一种应用程序的加载装置的结构示意图;

图7是本发明实施例提供的一种应用程序的加载装置的结构示意图;

图8是本发明实施例提供的一种计算机设备800的结构示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。

图1是本发明实施例提供的一种应用程序的加载方法的流程图。该方法由计算机设备执行,参见图1,该方法包括:

101、将应用程序映射到内存缓冲区,该应用程序的镜像大小是该内存缓冲区的大小的预设倍数,该内存缓冲区的每个比特位的取值为第一数值。

其中,应用程序的镜像大小(image_size)是指应用程序正常映射到内存后的大小。

本发明实施例中,计算机设备可以对应用程序进行缩放,将应用程序映射到一个比应用程序的镜像大小更小的内存缓冲区(buffer)中,并且将该内存缓冲区的内容全部初始化为第一数值。例如,第一数值可以是0,预设倍数可以是8,计算机设备将应用程序映射到一个镜像大小/8的内存缓冲区中,也即是,用一个比特位(bit)来代替应用程序的一个字节(byte)。

在一种可能实现方式中,计算机设备将应用程序映射到内存缓冲区之前,可以获取该应用程序的镜像大小,根据应用程序的镜像大小,在内存中为应用程序分配该内存缓冲区;将内存缓冲区的每个比特位的取值初始化为第一数值。通过预先为应用程序分配一个比其镜像大小更小的内存缓冲区,使得计算机设备可以将应用程序映射到该内存缓冲区,并对该内存缓冲区的比特位进行设置。参见图2,提供了一种将应用程序映射到内存缓冲区的示意图,如图2所示,假设应用程序的镜像大小为n,则内存缓冲区大小为n/8,起始位置为缓冲区位置。

102、将该应用程序的重定位表中的重定位地址,映射到该内存缓冲区的对应比特位的取值更改为第二数值,该重定位地址是指需要重定位的地址。

本发明实施例中,计算机设备在将应用程序映射到内存缓冲区时,还可以将重定位表中的重定位地址在内存缓冲区中进行标记。在一种可能实现方式中,计算机设备可以先解析该应用程序的该重定位表,得到重定位地址,该重定位地址可以是一个或多个。进一步地,计算机设备可以将该重定位地址除以该预设倍数,确定该重定位地址映射到该内存缓冲区的对应比特位;将该重定位地址的对应比特位的取值从该第一数值更改为该第二数值。通过解析重定位表,使得计算机设备可以预先将需要重定位的地址在内存缓冲区的对应比特位进行标记。

例如,计算机设备可以根据该应用程序的数据目录表,找到该应用程序的重定位表,其中,应用程序的可执行文件头部信息结构体里包含了查找数据目录表的方法。参见图3,提供了一种数据目录表和重定位表的示意图,图3中的左图是数据目录表(datadirectory),数据目录表的第5项指向重定位表,如图3中的右图。重定位表中的每个重定位块以一个image_base_relocation的结构开头,virtualaddress是指基地址,sizeofblock是指重定位块的大小。

该步骤101至步骤102是计算机设备在确定一个地址是否需要重定位之前的初始化过程。参见图4,提供了一种初始化过程的示意图,如图4所示,初始化开始时,计算机设备先获取应用程序的镜像大小image_size,分配image_size/8的缓冲区,假设首地址为buffer_head,将缓冲区初始化为0,解析重定位表里的地址,将缓冲区的y/8位设置为1,其中,y为重定位表中记录的需要重定位的地址,初始化完毕。

通过将应用程序映射到较小的内存缓冲区,并在内存缓冲区中将需要重定位的地址进行标记,便于计算机设备判断一个地址是否需要重定位。且相比于相关技术中将重定位表中需要重定位的地址列出来存储,可以节省内存空间。

103、在加载该应用程序时,将该应用程序的地址除以该预设倍数,确定该地址映射到该内存缓冲区的对应比特位。

本发明实施例中,计算机设备通过上述步骤101和步骤102,将重定位表中的重定位地址映射到了内存缓冲区的对应比特位,并将这些比特位的取值进行标记,这样,计算机设备在加载应用程序时,当需要判断应用程序的任一地址是否需要重定位时,可以直接根据该地址映射到内存缓冲区的对应比特位的取值进行判断。

对此,计算机设备可以将待确定的地址除以该预设倍数,确定该地址映射到该内存缓冲区的对应比特位。通过在判断一个地址是否需要重定位时,直接将该地址除以预设倍数,即可快速找到内存缓冲区的对应比特位。参见图5,提供了一种确定地址是否需要重定位的示意图,如图5所示,待确定的地址是x,计算机设备可以将x除以8,然后作为索引,读取内存缓冲区的第x/8比特位的取值,就可以确定x是否需要重定位。

对应比特位的取值有两种,一种是第一数值,一种是第二数值,如果是前者,则执行后续步骤104,如果是后者,则执行后续步骤105。

104、当该应用程序的地址映射到该内存缓冲区的对应比特位的取值为该第一数值时,按照该地址进行应用程序的加载,结束。

本发明实施例中,通过上述步骤101和步骤102可知,计算机设备已经将需要重定位的地址映射到内存缓冲区的对应比特位设置为第二数值,而内存缓冲区的其他比特位设置为第一数值,这样,如果应用程序的地址映射到内存缓冲区的对应比特位的取值为第一数值,表明不需要重定位,则计算机设备可以直接按照该地址进行应用程序的加载。

需要说明的是,上述步骤103至步骤104是当该应用程序的地址映射到该内存缓冲区的对应比特位的取值为该第一数值时,按照该地址进行应用程序的加载的一种可能实现方式。通过预先将重定位表中的重定位地址映射到了内存缓冲区的对应比特位,并对这些比特位的取值进行设置,这样在加载应用程序时,直接找到应用程序的地址映射到内存缓冲区的对应比特位,通过该比特位的取值,即可快速判断地址是否需要重定位。

105、当该应用程序的地址映射到该内存缓冲区的对应比特位的取值为该第二数值时,对该地址进行重定位后,按照重定位后的地址进行应用程序的加载。

本发明实施例中,计算机设备通过执行步骤102,已经将需要重定位的地址映射到内存缓冲区的对应比特位设置为第二数值,这样,如果应用程序的地址映射到内存缓冲区的对应比特位的取值为第二数值,表明需要重定位。

考虑到如果不对需要重定位的地址进行重定位,则会导致指令跳转的地址不是实际要跳转的地址,获取不到正确的函数指令,应用程序则不能正常运行。因此,计算机设备在确定一个地址需要重定位后,可以根据重定位表中记录的如何对地址进行重定位的信息,对该需要重定位的地址进行重定位,并对相关的代码进行动态修正,例如,将该地址的默认基地址加上偏移地址,该偏移地址是指新基地址与默认基地址的差。

需要说明的是,上述步骤104和步骤105是根据待确定的地址映射到该内存缓冲区的对应比特位的取值,确定该地址是否需要重定位的两种情况。通过在判断一个地址是否需要重定位时,直接找到该地址映射到内存缓冲区的对应比特位,根据该比特位的取值,即可快速地得知该地址是否需要重定位,整个判断过程只需要常数时间即可完成,在需要判断的地址很多时,相比于相关技术的循环查找法和排序查找法,会有较大的效率提升。

需要说明的是,本发明实施例提供的上述技术方案主要用在需要判断大量的地址是否需要重定位的各工具代码中,比如给应用程序加代码混淆和代码虚拟的工具等(vmprotect类工具),大大提升了执行效率。

本发明实施例提供的方法,通过预先将应用程序映射到较小的内存缓冲区,并根据重定位表中需要重定位的地址,对内存缓冲区的对应比特位的取值进行标记,这样在加载应用程序时,直接找到应用程序的地址在内存缓冲区的对应比特位,即可根据该比特位的取值,快速地判断该地址是否需要重定位,以保证应用程序的正常加载。特别是当判断大量的地址是否需要重定位时,需要耗费的时间大大减少,效率提升明显。

图6是本发明实施例提供的一种应用程序的加载装置的结构示意图。参照图6,该装置包括:

映射模块601,用于将应用程序映射到内存缓冲区,所述应用程序的镜像大小是所述内存缓冲区的大小的预设倍数,所述内存缓冲区的每个比特位的取值为第一数值;

更改模块602,用于将所述应用程序的重定位表中的重定位地址,映射到所述内存缓冲区的对应比特位的取值更改为第二数值,所述重定位地址是指需要重定位的地址;

加载模块603,用于在加载所述应用程序时,当所述应用程序的地址映射到所述内存缓冲区的对应比特位的取值为所述第一数值时,按照所述地址进行应用程序的加载;

所述加载模块603还用于当所述应用程序的地址映射到所述内存缓冲区的对应比特位的取值为所述第二数值时,对所述地址进行重定位后,按照重定位后的地址进行应用程序的加载。

在一种可能实现方式中,所述更改模块602用于:

将所述重定位地址除以所述预设倍数,确定所述重定位地址映射到所述内存缓冲区的对应比特位;

将所述重定位地址的对应比特位的取值从所述第一数值更改为所述第二数值。

在一种可能实现方式中,所述加载模块603用于:

将所述地址除以所述预设倍数,确定所述地址映射到所述内存缓冲区的对应比特位;

当所述地址的对应比特位的取值为所述第一数值时,按照所述地址进行应用程序的加载。

在一种可能实现方式中,所述映射模块601还用于:

获取所述应用程序的镜像大小;

根据所述应用程序的镜像大小,在内存中为所述应用程序分配所述内存缓冲区;

将所述内存缓冲区的每个比特位的取值初始化为所述第一数值。

在一种可能实现方式中,参见图7,所述装置还包括:

解析模块604,用于解析所述应用程序的所述重定位表,得到所述重定位地址。

本发明实施例提供的装置,通过预先将应用程序映射到较小的内存缓冲区,并根据重定位表中需要重定位的地址,对内存缓冲区的对应比特位的取值进行标记,这样在加载应用程序时,直接找到应用程序的地址在内存缓冲区的对应比特位,即可根据该比特位的取值,快速地判断该地址是否需要重定位,以保证应用程序的正常加载。特别是当判断大量的地址是否需要重定位时,需要耗费的时间大大减少,效率提升明显。

需要说明的是:上述实施例提供的应用程序的加载装置在加载应用程序时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的应用程序的加载装置与应用程序的加载方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。

图8是本发明实施例提供的一种计算机设备的结构示意图,该计算机设备800可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(centralprocessingunits,cpu)801和一个或一个以上的存储器802,其中,所述存储器802中存储有至少一条指令,所述至少一条指令由所述处理器801加载并执行以实现上述各个方法实施例提供的方法。当然,该计算机设备还可以具有有线或无线网络接口、键盘以及输入输出接口等部件,以便进行输入输出,该计算机设备还可以包括其他用于实现设备功能的部件,在此不做赘述。

在示例性实施例中,还提供了一种计算机可读存储介质,例如包括至少一条指令、至少一段程序、代码集或指令集的存储器,上述至少一条指令、至少一段程序、代码集或指令集可由处理器加载并执行以完成上述实施例中的应用程序的加载方法。例如,计算机可读存储介质可以是只读存储器(read-onlymemory,rom)、随机存取存储器(random-accessmemory,ram)、只读光盘(compactdiscread-onlymemory,cd-rom)、磁带、软盘和光数据存储设备等。

本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,该程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。

以上仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1