CN104820612A - 一种可执行文件的内存执行方法 - Google Patents
一种可执行文件的内存执行方法 Download PDFInfo
- Publication number
- CN104820612A CN104820612A CN201510268028.8A CN201510268028A CN104820612A CN 104820612 A CN104820612 A CN 104820612A CN 201510268028 A CN201510268028 A CN 201510268028A CN 104820612 A CN104820612 A CN 104820612A
- Authority
- CN
- China
- Prior art keywords
- program
- target program
- target
- host
- host program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Stored Programmes (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明提供了一种目标程序的内存执行方法。该方法包括:宿主程序向服务器上请求目标程序,其中所述宿主程序位于目标机器内,所述目标程序位于所述服务器内;所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中;所述宿主程序解析所述目标程序执行时所需的传入参数,并将所述传入参数存储在所述宿主程序的当前进程的栈地址;所述宿主程序在向目标程序移交控制权前,释放本身执行时所占用的运行时内存空间;所述目标程序从所述栈地址获得传入参数并执行,所述宿主程序被所述目标程序覆盖。
Description
技术领域
本发明涉及程序内存执行技术,尤其涉及一种基于进程空间覆盖的程序内存执行的方法。
背景技术
在嵌入式设备中,为了节约硬件成本,存储介质的空间大小通常非常有限,而内存空间往往比前者大几个数量级。为了解决存储介质空间有限的问题,目前基于linux的应用软件经常利用RAM充足的空间来克服可执行程序因存储介质空间不足而无法执行的问题。即,采用内存执行的方式来执行应用程序。
现有的内存执行方式可归纳为两类。
第一类是通过ramfs文件系统从网络将可执行文件拷入执行。然而,该方法对宿主平台操作系统依赖性强,需要宿主系统支持ramfs文件系统,应用程序可否成功执行会受到ramfs分配的空间大小影响。应用程序执行后,不可避免地在内存中冗余了一份可执行文件镜像,浪费ram/dram内存空间。
第二类方法是通过网络文件系统执行应用程序。然而,网络文件系统不够稳定,需要资源多,对底层要求高。而且,该方法仍然对对宿主平台操作系统依赖性强,需要宿主系统支持网络文件系统。此外,该方法执行代码比较不可靠,程序甚至整个系统都可能因为网络环境不稳定而崩溃。
综上所述,现有的内存执行方法可移植性差、内存开销大、稳定性不佳、同时由于容易被破解而造成保密性不佳。
因此,亟需一种具有可移植性好、稳定性佳、内存开销小、保密性强的应用程序执行方式。
发明内容
为了克服了现有linux内存执行方法稳定性低、可移植性差、内存开销大等方面的不足,本发明提出了一种基于进程内存空间覆盖的内存执行的方法。
本发明提供了一种目标程序的内存执行方法,所述方法包括以下步骤:
宿主程序向服务器上请求目标程序,其中所述宿主程序位于目标机器内,所述目标程序位于所述服务器内;
所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中;
所述宿主程序解析所述目标程序执行时所需的传入参数,并将所述传入参数存储在所述宿主程序的当前进程的栈地址;
所述宿主程序在向目标程序移交控制权前,释放本身执行时所占用的运行时内存空间;
所述目标程序从所述栈地址获得传入参数并执行,所述宿主程序被所述目标程序覆盖。
在一个实施例中,宿主程序向服务器上请求目标程序包括以下步骤:
建立所述目标机器与所述服务器之间的通讯连接;
在所述目标机器中创建软链接文件,其中所述软链接文件指向所述宿主程序,并且所述软链接文件的文件名与所述目标程序的文件名一致;
宿主程序通过所述软链接启动后,解析所述软链接的文件名,并将所述软链接的文件名作为向所述服务器请求的目标程序的文件名。
在一个实施例中,宿主程序向服务器上请求目标程序的同时,所述方法还包括以下步骤:
向所述服务器请求校验文件;
利用所述校验文件对所述目标程序进行校验。
在一个实施例中,所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中之前,所述方法还包括:
所述宿主程序解析是否存在该目标程序执行所依赖的动态链接库文件;
如果存在所述动态链接库文件,则所述宿主程序向所述服务器请求所述动态链接库文件,并解析装载所述动态链接库文件。
在一个实施例中,所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中之前,所述方法还包括:
所述宿主程序解析所述目标程序是否存在INTERP头部;
如果存在所述INTERP头部,则所述宿主程序向所述服务器请求与所述INTERP头部相关联的解析例程,并解析装载所述解析例程。
在一个实施例中,所述宿主程序解析所述目标程序执行时所需的传入参数,并将所述传入参数存储在所述宿主程序的当前进程的栈地址包括;
所述宿主程序定位当前进程的栈地址;
所述目标程序与所述宿主程序复用所述栈地址。
在一个实施例中,所述宿主程序在向目标程序移交控制权前,释放本身执行时所占用的运行时内存空间包括:
所述宿主程序进入宿主汇编代码部分后,所述宿主程序不再对进程栈做任何改动;
所述宿主程序扫描本身所占用的地址空间,释放掉除了所述栈地址空间以外的地址空间。
在一个实施例中,所述目标程序从所述栈地址获得传入参数并执行,所述宿主程序被所述目标程序覆盖包括:
所述宿主汇编代码设置栈寄存器地址,指向宿主程序的原进程的栈顶,以便所述目标程序从所述栈顶获取所述传入参数;
所述宿主汇编代码编译修改GNU编译器套件的参数,将所述目标程序的默认入口地址做偏移,并且采用静态链接的方式进行编译,从而实现进程控制权的交接。
在一个实施例中,所述方法基于Linux系统。
附图说明
本发明的以上发明内容以及下面的具体实施方式在结合附图阅读时会得到更好的理解。需要说明的是,附图仅作为所请求保护的发明的示例。在附图中,相同的附图标记代表相同或类似的元素。
图1示出根据本发明的一实施例的系统环境准备流程;
图2示出根据本发明的一实施例的宿主程序内存空间覆盖流程;
图3示出根据本发明的一实施例的流程图。
具体实施方式
以下在具体实施方式中详细叙述本发明的详细特征以及优点,其内容足以使任何本领域技术人员了解本发明的技术内容并据以实施,且根据本说明书所揭露的说明书、权利要求及附图,本领域技术人员可轻易地理解本发明相关的目的及优点。
需要指出的是,本文中所提到的术语“可执行程序”、“可执行文件”、“应用程序”均指代操作系统待执行或者已执行的“目标程序”或“目标可执行文件”。本文中所提到的“目标机器”是要运行目标程序的设备。
下面将介绍一下本发明的基本思想并随后结合具体实施例来进一步阐述本发明的技术方案。
在本发明中,宿主程序存放在目标机器上。宿主程序主要用于实现目标程序比特流的网络接收、目标程序运行时内存空间的准备、原宿主进程各代码段占用空间的释放、本进程的控制权转交给目标程序。
由于存储介质的大小限制,目标机器所需执行的可执行文件(即目标程序或应用程序)被存放至服务器上,目标机器本地只建立一份指向宿主可执行文件(即宿主程序)的软链接,其取名与服务器存放的可执行文件名称一致。该方法使得该软链接被链接执行后,宿主程序将可以获取目标程序的文件名。
目标程序执行时所需的传入参数,由宿主程序代为接收,后面宿主程序通过将其依次保存至目标程序的栈顶,从而使目标程序获取到传入的参数。
宿主程序在完成目标代码运行空间的准备工作,向目标程序移交控制权前,将释放本身执行时所占用的运行时内存空间。从内存空间的角度来看,目标程序内存空间与从本地存储启动的空间无异,充分保证了稳定性与对各种复杂程序的适应能力。
宿主程序编译修改GCC(GNU编译器套件)的linkscript默认脚本参数,改变目标可执行文件默认入口地址,并将入口地址做偏移,并且编译采用静态链接的方式。目标代码则不需做该操作,按照正常程序编译即可(即宿主程序能引导执行任意可执行程序)。
宿主进程通过http/ftp连接方式获取目标代码文件及其相应的md5文件,文件传输完毕进行MD5校验文件完整性,其中http/ftp服务器的URL信息由宿主进程从配置文件获取。
图1示出根据本发明的一实施例的环境准备流程。该流程包括两方面的流程,一个是服务器端的环境准备流程,另一个是宿主机器端的环境准备流程。
在服务器端的环境准备流程中,包括以下几个步骤。
步骤101,搭建http/ftp服务以便文件传输,并启动服务;
步骤102,将目标可执行文件(例如,example)及用于校验的文件(例如,example.md5)放置在http/ftp服务目录下。
在宿主机器(目标机器)端的环境准备流程中,包括以下几个步骤。
步骤103,拷入宿主可执行文件、配置文件;
步骤104,创建指向宿主可执行文件的软链接文件,链接文件名与服务器上的目标可执行文件名一致。在一个实施例中,还可将该链接文件改为可执行权限。
图2示出根据本发明的一实施例的宿主可执行文件内存空间覆盖流程。
步骤201,当用户启动软链接文件后,相当于启动了宿主程序。
步骤202,在宿主程序通过指向其的软链接文件启动后,解析软链接文件名,以获得目标可执行文件名,从而作为向服务器请求的文件名,同时,解析并获取目标可执行文件的传入参数;
步骤203,宿主程序读取配置文件并获取目标执行文件所在的服务器的地址(例如,http/ftp服务的URL)。
步骤204,判断服务器的地址是否解析成功。若成功,则执行步骤205;若不成功,则执行步骤206。
步骤205,向该服务器请求获取目标执行文件及其校验文件(例如MD5文件)。
步骤206,采用默认的服务器地址,并向该服务器请求获取目标执行文件及其校验文件。
步骤207,对接收到的目标执行文件进行MD5校验,与接收到的MD5文件进行比较。若MD5一致,则进入下一步,否则程序退出。
步骤208,解析目标可执行文件,判断是否需有依赖的动态库文件。如果有,则加载所依赖的动态链接库文件(步骤209)。该动态链接库文件可通过类似步骤201-207向服务器请求获其所依赖动态库文件,并解析装载。在一个实施例中,可通过解析是否存在DYNAMIC头部来判断是否有所依赖的动态库文件。
在一个实施例中,解析目标可执行文件,判断是否存在INTERP头部,存在的话则说明该程序需要相应解析例程,类似步骤201-207向服务器请求获取该解析例程,并解析装载。
步骤210,解析目标可执行文件的LOAD头部,读取文件各个代码段,并依此将其映射到目标机器的内存的对应地址空间中。
步骤211,设置目标可执行文件所对应的上述地址空间的相应读写执行属性。
步骤212,设置各个代码段的mmap的protect界限,禁止越界访问。
步骤213,定位当前进程的栈地址,调整相应传入参数,并调整其他向量表。目标程序将复用宿主程序的堆栈,这使得目标程序继承了宿主程序平台相关环境变量。提高了程序可可移植性。
步骤214,宿主程序进入汇编代码部分,解除宿主程序对进程栈的依赖,宿主程序不再对进程栈做任何改动。
步骤215,宿主程序扫描本身所占用的地址空间,释放掉除了栈空间以外的地址空间。
步骤216,宿主汇编代码设置栈寄存器地址,指向原宿主进程的栈顶,为目标程序的执行做准备,使得目标程序从而服用宿主程序使用过的栈。
步骤216,宿主汇编代码设置程序控制寄存器为目标程序入口地址,并进行跳转,实现进程控制权的交接。由此,原宿主进程被完全覆盖为新的目标程序。
如此引导的目标程序进程与目标程序在本地存储介质启动没有任何区别。从根本上保证了任意目标程序能够正常运行。同时,通过本发明的目标程序运行方式,宿主程序和目标程序复用堆栈,同时宿主程序在进入汇编代码部分后释放堆栈空间以外的内存空间,大大节省了内存的开销。
需要指出的是,本发明的方法不仅适用于linux,也适用于windows等其他操作系统平台上。对于linux系统,目标可执行文件为ELF文件。对于windows系统,目标可执行文件为EXE文件。
图3示出了根据本发明的一实施例的流程图。本发明的目标程序的内存执行方法包括以下步骤。
步骤301,宿主程序向服务器上请求目标程序,其中所述宿主程序位于目标机器内,所述目标程序位于所述服务器内;
步骤302,所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中;
步骤303,所述宿主程序解析所述目标程序执行时所需的传入参数,并将所述传入参数存储在所述宿主程序的当前进程的栈地址;
步骤304,所述宿主程序在向目标程序移交控制权前,释放本身执行时所占用的运行时内存空间;
步骤305,所述目标程序从所述栈地址获得传入参数并执行,所述宿主程序被所述目标程序覆盖。
这里采用的术语和表述方式只是用于描述,本发明并不应局限于这些术语和表述。使用这些术语和表述并不意味着排除任何示意和描述(或其中部分)的等效特征,应认识到可能存在的各种修改也应包含在权利要求范围内。其他修改、变化和替换也可能存在。相应的,权利要求应视为覆盖所有这些等效物。
同样,需要指出的是,虽然本发明已参照当前的具体实施例来描述,但是本技术领域中的普通技术人员应当认识到,以上的实施例仅是用来说明本发明,在没有脱离本发明精神的情况下还可做出各种等效的变化或替换,因此,只要在本发明的实质精神范围内对上述实施例的变化、变型都将落在本申请的权利要求书的范围内。
Claims (9)
1.一种目标程序的内存执行方法,其特征在于,所述方法包括:
宿主程序向服务器上请求目标程序,其中所述宿主程序位于目标机器内,所述目标程序位于所述服务器内;
所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中;
所述宿主程序解析所述目标程序执行时所需的传入参数,并将所述传入参数存储在所述宿主程序的当前进程的栈地址;
所述宿主程序在向目标程序移交控制权前,释放本身执行时所占用的运行时内存空间;
所述目标程序从所述栈地址获得传入参数并执行,所述宿主程序被所述目标程序覆盖。
2.如权利要求1所述的目标程序的内存执行方法,其特征在于,宿主程序向服务器上请求目标程序包括以下步骤:
建立所述目标机器与所述服务器之间的通讯连接;
在所述目标机器中创建软链接文件,其中所述软链接文件指向所述宿主程序,并且所述软链接文件的文件名与所述目标程序的文件名一致;
宿主程序通过所述软链接启动后,解析所述软链接的文件名,并将所述软链接的文件名作为向所述服务器请求的目标程序的文件名。
3.如权利要求1所述的目标程序的内存执行方法,其特征在于,宿主程序向服务器上请求目标程序的同时,所述方法还包括以下步骤:
向所述服务器请求校验文件;
利用所述校验文件对所述目标程序进行校验。
4.如权利要求1所述的目标程序的内存执行方法,其特征在于,所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中之前,所述方法还包括:
所述宿主程序解析是否存在该目标程序执行所依赖的动态链接库文件;
如果存在所述动态链接库文件,则所述宿主程序向所述服务器请求所述动态链接库文件,并解析装载所述动态链接库文件。
5.如权利要求1所述的目标程序的内存执行方法,其特征在于,所述宿主程序解析所述目标程序的各个代码段,并将所述各个代码段映射到所述目标机器的内存的对应地址空间中之前,所述方法还包括:
所述宿主程序解析所述目标程序是否存在INTERP头部;
如果存在所述INTERP头部,则所述宿主程序向所述服务器请求与所述INTERP头部相关联的解析例程,并解析装载所述解析例程。
6.如权利要求1所述的目标程序的内存执行方法,其特征在于,所述宿主程序解析所述目标程序执行时所需的传入参数,并将所述传入参数存储在所述宿主程序的当前进程的栈地址包括;
所述宿主程序定位当前进程的栈地址;
所述目标程序与所述宿主程序复用所述栈地址。
7.如权利要求1所述的目标程序的内存执行方法,其特征在于,所述宿主程序在向目标程序移交控制权前,释放本身执行时所占用的运行时内存空间包括:
所述宿主程序进入宿主汇编代码部分后,所述宿主程序不再对进程栈做任何改动;
所述宿主程序扫描本身所占用的地址空间,释放掉除了所述栈地址空间以外的地址空间。
8.如权利要求7所述的目标程序的内存执行方法,其特征在于,所述目标程序从所述栈地址获得传入参数并执行,所述宿主程序被所述目标程序覆盖包括:
所述宿主汇编代码设置栈寄存器地址,指向宿主程序的原进程的栈顶,以便所述目标程序从所述栈顶获取所述传入参数;
所述宿主汇编代码编译修改GNU编译器套件的参数,将所述目标程序的默认入口地址做偏移,并且采用静态链接的方式进行编译,从而实现进程控制权的交接。
9.如权利要求1-8中任一项所述的目标程序的内存执行方法,其特征在于,所述方法基于Linux系统。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510268028.8A CN104820612B (zh) | 2015-05-22 | 2015-05-22 | 一种可执行文件的内存执行方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510268028.8A CN104820612B (zh) | 2015-05-22 | 2015-05-22 | 一种可执行文件的内存执行方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104820612A true CN104820612A (zh) | 2015-08-05 |
CN104820612B CN104820612B (zh) | 2018-02-09 |
Family
ID=53730914
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510268028.8A Expired - Fee Related CN104820612B (zh) | 2015-05-22 | 2015-05-22 | 一种可执行文件的内存执行方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104820612B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106648749A (zh) * | 2016-11-11 | 2017-05-10 | 广州华多网络科技有限公司 | 一种可执行程序动态调用方法及系统 |
CN110780940A (zh) * | 2019-09-24 | 2020-02-11 | 维沃移动通信有限公司 | 应用程序加载方法、电子设备和存储介质 |
CN112632536A (zh) * | 2020-12-22 | 2021-04-09 | 四川大学 | 基于pe文件改造的内存加载方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050251583A1 (en) * | 2004-04-26 | 2005-11-10 | Rothman Michael A | System and method to conditionally shrink an executable module |
CN101067789A (zh) * | 2007-06-05 | 2007-11-07 | 上海微电子装备有限公司 | 程序动态加载方法 |
CN102915276A (zh) * | 2012-09-25 | 2013-02-06 | 武汉邮电科学研究院 | 一种用于嵌入式系统的内存控制方法 |
-
2015
- 2015-05-22 CN CN201510268028.8A patent/CN104820612B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050251583A1 (en) * | 2004-04-26 | 2005-11-10 | Rothman Michael A | System and method to conditionally shrink an executable module |
CN101067789A (zh) * | 2007-06-05 | 2007-11-07 | 上海微电子装备有限公司 | 程序动态加载方法 |
CN102915276A (zh) * | 2012-09-25 | 2013-02-06 | 武汉邮电科学研究院 | 一种用于嵌入式系统的内存控制方法 |
Non-Patent Citations (1)
Title |
---|
胡秋琼: ""可执行文件加载技术的研究"", 《中国优秀硕士学位论文全文数据库 信息科技辑》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106648749A (zh) * | 2016-11-11 | 2017-05-10 | 广州华多网络科技有限公司 | 一种可执行程序动态调用方法及系统 |
CN106648749B (zh) * | 2016-11-11 | 2019-12-31 | 广州华多网络科技有限公司 | 一种可执行程序动态调用方法及系统 |
CN110780940A (zh) * | 2019-09-24 | 2020-02-11 | 维沃移动通信有限公司 | 应用程序加载方法、电子设备和存储介质 |
CN112632536A (zh) * | 2020-12-22 | 2021-04-09 | 四川大学 | 基于pe文件改造的内存加载方法 |
CN112632536B (zh) * | 2020-12-22 | 2023-03-21 | 四川大学 | 基于pe文件改造的内存加载方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104820612B (zh) | 2018-02-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10904361B2 (en) | Method, apparatus, and system for implementing JAVA application installation by means of cloud compilation | |
US11599348B2 (en) | Container image building using shared resources | |
US9696989B1 (en) | Systems and methods for generating and applying operating system live updates | |
US10795659B1 (en) | System and method for live patching processes in user space | |
RU2643484C2 (ru) | Генерация собственного кода из кода на промежуточном языке для приложения | |
KR101793306B1 (ko) | 가상 애플리케이션 확장 포인트 | |
US9069931B2 (en) | Extending SELinux policy with enforcement of file name translation | |
US20150229673A1 (en) | Apparatus and method for diagnosing malicious applications | |
KR20200146006A (ko) | 애플리케이션 업그레이드 방법, 장치, 기기 및 저장 매체 | |
US20170286644A1 (en) | Protection Method and Device for Application Data | |
KR101453742B1 (ko) | 웹 어플리케이션 실행을 위한 보안 제공 장치 및 방법 | |
US20140075495A1 (en) | Method and system for facilitating secure file creation using selinux policies | |
US20220405385A1 (en) | Secure container construction device and method executable by android application, and computer-readable recording medium on which program thereof is recorded | |
CN104820612A (zh) | 一种可执行文件的内存执行方法 | |
US20130254832A1 (en) | Security Protection Domain-Based Testing Framework | |
CN115390945A (zh) | 应用程序的运行方法、装置、电子设备及可读存储介质 | |
US20130185626A1 (en) | METHOD, TERMINAL AND COMPUTER-READABLE RECORDING MEDIUM FOR COMPILING JAVASCRIPT INCLUDED IN WEB APPLICATION USING Ahead-Of-Time (AOT) | |
US20170270031A1 (en) | Information processing apparatus, test execution method, and computer-readable recording medium | |
CN111061501B (zh) | 安卓应用的热更新方法及计算机可读存储介质 | |
CN113010195B (zh) | 一种系统升级方法、存储介质及终端设备 | |
CN109597662B (zh) | 移动终端中非公开库的调用方法、装置及电子设备 | |
CN114064176A (zh) | 一种视图交互方法、装置、电子设备及计算机可读介质 | |
CN115113972A (zh) | 应用改造方法、系统、集群、介质及程序产品 | |
WO2019157891A1 (zh) | 应用安装方法、应用安装包的生成方法 | |
KR102626841B1 (ko) | 동적 라이브러리의 자가 무결성 검증 방법 및 이를 위한 장치 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180209 |
|
CF01 | Termination of patent right due to non-payment of annual fee |