一种可执行文件的内存执行方法

文档序号:8498623阅读:423来源:国知局
一种可执行文件的内存执行方法
【技术领域】
[0001]本发明涉及程序内存执行技术,尤其涉及一种基于进程空间覆盖的程序内存执行的方法。
【背景技术】
[0002]在嵌入式设备中,为了节约硬件成本,存储介质的空间大小通常非常有限,而内存空间往往比前者大几个数量级。为了解决存储介质空间有限的问题,目前基于Iinux的应用软件经常利用RAM充足的空间来克服可执行程序因存储介质空间不足而无法执行的问题。即,采用内存执行的方式来执行应用程序。
[0003]现有的内存执行方式可归纳为两类。
[0004]第一类是通过ramfs文件系统从网络将可执行文件拷入执行。然而,该方法对宿主平台操作系统依赖性强,需要宿主系统支持ramfs文件系统,应用程序可否成功执行会受到ramfs分配的空间大小影响。应用程序执行后,不可避免地在内存中冗余了一份可执行文件镜像,浪费ram/dram内存空间。
[0005]第二类方法是通过网络文件系统执行应用程序。然而,网络文件系统不够稳定,需要资源多,对底层要求高。而且,该方法仍然对对宿主平台操作系统依赖性强,需要宿主系统支持网络文件系统。此外,该方法执行代码比较不可靠,程序甚至整个系统都可能因为网络环境不稳定而崩溃。
[0006]综上所述,现有的内存执行方法可移植性差、内存开销大、稳定性不佳、同时由于容易被破解而造成保密性不佳。
[0007]因此,亟需一种具有可移植性好、稳定性佳、内存开销小、保密性强的应用程序执行方式。

【发明内容】

[0008]为了克服了现有Iinux内存执行方法稳定性低、可移植性差、内存开销大等方面的不足,本发明提出了一种基于进程内存空间覆盖的内存执行的方法。
[0009]本发明提供了一种目标程序的内存执行方法,所述方法包括以下步骤:
[0010]宿主程序向服务器上请求目标程序,其中所述宿主程序位于目标机器内,所述目标程序位于所述服务器内;
[0011]所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中;
[0012]所述宿主程序解析所述目标程序执行时所需的传入参数,并将所述传入参数存储在所述宿主程序的当前进程的栈地址;
[0013]所述宿主程序在向目标程序移交控制权前,释放本身执行时所占用的运行时内存空间;
[0014]所述目标程序从所述栈地址获得传入参数并执行,所述宿主程序被所述目标程序覆盖。
[0015]在一个实施例中,宿主程序向服务器上请求目标程序包括以下步骤:
[0016]建立所述目标机器与所述服务器之间的通讯连接;
[0017]在所述目标机器中创建软链接文件,其中所述软链接文件指向所述宿主程序,并且所述软链接文件的文件名与所述目标程序的文件名一致;
[0018]宿主程序通过所述软链接启动后,解析所述软链接的文件名,并将所述软链接的文件名作为向所述服务器请求的目标程序的文件名。
[0019]在一个实施例中,宿主程序向服务器上请求目标程序的同时,所述方法还包括以下步骤:
[0020]向所述服务器请求校验文件;
[0021]利用所述校验文件对所述目标程序进行校验。
[0022]在一个实施例中,所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中之前,所述方法还包括:
[0023]所述宿主程序解析是否存在该目标程序执行所依赖的动态链接库文件;
[0024]如果存在所述动态链接库文件,则所述宿主程序向所述服务器请求所述动态链接库文件,并解析装载所述动态链接库文件。
[0025]在一个实施例中,所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中之前,所述方法还包括:
[0026]所述宿主程序解析所述目标程序是否存在INTERP头部;
[0027]如果存在所述INTERP头部,则所述宿主程序向所述服务器请求与所述INTERP头部相关联的解析例程,并解析装载所述解析例程。
[0028]在一个实施例中,所述宿主程序解析所述目标程序执行时所需的传入参数,并将所述传入参数存储在所述宿主程序的当前进程的栈地址包括;
[0029]所述宿主程序定位当前进程的栈地址;
[0030]所述目标程序与所述宿主程序复用所述栈地址。
[0031]在一个实施例中,所述宿主程序在向目标程序移交控制权前,释放本身执行时所占用的运行时内存空间包括:
[0032]所述宿主程序进入宿主汇编代码部分后,所述宿主程序不再对进程栈做任何改动;
[0033]所述宿主程序扫描本身所占用的地址空间,释放掉除了所述栈地址空间以外的地址空间。
[0034]在一个实施例中,所述目标程序从所述栈地址获得传入参数并执行,所述宿主程序被所述目标程序覆盖包括:
[0035]所述宿主汇编代码设置栈寄存器地址,指向宿主程序的原进程的栈顶,以便所述目标程序从所述栈顶获取所述传入参数;
[0036]所述宿主汇编代码编译修改GNU编译器套件的参数,将所述目标程序的默认入口地址做偏移,并且采用静态链接的方式进行编译,从而实现进程控制权的交接。
[0037]在一个实施例中,所述方法基于Linux系统。
【附图说明】
[0038]本发明的以上
【发明内容】
以及下面的【具体实施方式】在结合附图阅读时会得到更好的理解。需要说明的是,附图仅作为所请求保护的发明的示例。在附图中,相同的附图标记代表相同或类似的元素。
[0039]图1示出根据本发明的一实施例的系统环境准备流程;
[0040]图2示出根据本发明的一实施例的宿主程序内存空间覆盖流程;
[0041]图3示出根据本发明的一实施例的流程图。
【具体实施方式】
[0042]以下在【具体实施方式】中详细叙述本发明的详细特征以及优点,其内容足以使任何本领域技术人员了解本发明的技术内容并据以实施,且根据本说明书所揭露的说明书、权利要求及附图,本领域技术人员可轻易地理解本发明相关的目的及优点。
[0043]需要指出的是,本文中所提到的术语“可执行程序”、“可执行文件”、“应用程序”均指代操作系统待执行或者已执行的“目标程序”或“目标可执行文件”。本文中所提到的“目标机器”是要运行目标程序的设备。
[0044]下面将介绍一下本发明的基本思想并随后结合具体实施例来进一步阐述本发明的技术方案。
[0045]在本发明中,宿主程序存放在目标机器上。宿主程序主要用于实现目标程序比特流的网络接收、目标程序运行时内存空间的准备、原宿主进程各代码段占用空间的释放、本进程的控制权转交给目标程序。
[0046]由于存储介质的大小限制,目标机器所需执行的可执行文件(即目标程序或应用程序)被存放至服务器上,目标机器本地只建立一份指向宿主可执行文件(即宿主程序)的软链接,其取名与服务器存放的可执行文件名称一致。该方法使得该软链接被链接执行后,宿主程序将可以获取目标程序的文件名。
[0047]目标程序执行时所需的传入参数,由宿主程序代为接收,后面宿主程序通过将其依次保存至目标程序的栈顶,从而使目标程序获取到传入的参数。
[0048]宿主程序在完成目标代码运行空间的准备工作,向目标程序移交控制权前,将释放本身执行时所占用的运行时内存空间。从内存空间的角度来看,目标程序内存空间与从本地存储启动的空间无异,充分保证了稳定性与对各种复杂程序的适应能力。
[0049]宿主程序编译修改GCC (GNU编译器套件)的Iinkscript默认脚本参数,改变目标可执行文件默认入口地址,并将入口地址做偏移,并且编译采用静态链接的方式。目标代码则不需做该操作,按照正常程序编译即可(即宿主程序能引导执行任意可执行程序)。
[0050]宿主进程通过http/ftp连接方式获取目标代码文件及其相应的md5文件,文件传输完毕进行MD5校验文件完整性,其中http/ftp服务器的URL信息由宿主进程从配置文件获取。
[0051]图1示出根据本发明的一实施例的环境准备流程。该流程包括两方面的流程,一个是服务器端的环境准备流程,另一个是宿主机器端的环境准备流程。
[0052]在服务器端的环境准备流程中,包括以下几个步骤。
[0053]步骤101,搭建http/ftp服务以便文件传输,并启动服务;
[0054]步骤102,将目标可执行文件(例如,example)及用于校验的文件(例如,example.md5)放置在http/ftp服务目录下。
[0055]在宿主机器(目标机器)端的环境准备流程中,包括以下几个步骤。
[0056]步骤103,拷入宿主可执行文件、配置文件;
[0057]步骤104,创建指向宿主可执行文件的软链接文件,链接文件名与服务器上的目标可执行文件名一致。在一个实施例中,还可将该链接文件改为可执行权限。
[0058]图2示出根据本发明的一实施例的宿主可执行文件内存空间覆盖流程。
[0059]步骤201,当用户启动软链接文件后,相当于启动了宿主程序。
[0060]步骤
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1