CN107305495A - 实现软件安装包功能修改的方法及终端 - Google Patents
实现软件安装包功能修改的方法及终端 Download PDFInfo
- Publication number
- CN107305495A CN107305495A CN201610243033.8A CN201610243033A CN107305495A CN 107305495 A CN107305495 A CN 107305495A CN 201610243033 A CN201610243033 A CN 201610243033A CN 107305495 A CN107305495 A CN 107305495A
- Authority
- CN
- China
- Prior art keywords
- piece
- sub
- fragment
- character string
- arm structures
- 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.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/61—Installation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例公开了一种实现软件安装包功能修改的方法及终端,其中,该方法包括:在目标软件安装包的解压文件中添加用于实现预设功能的动态库;修改所述解压文件中的可执行文件,以使所述可执行文件运行时从所述动态库中调用实现所述预设功能的方法类;对所述解压文件重新签名并压缩得到修改后的软件安装包。本发明实施例的方法及终端,无需对软件安装包的源代码进行修改及重新编译即可对软件安装包的功能进行修改。
Description
技术领域
本发明涉及应用软件处理技术领域,特别涉及一种实现软件安装包功能修改的方法及终端。
背景技术
随着技术的发展,适用于各类终端及操作***的应用软件的种类和数量不断增加。例如,由美国苹果公司开发的操作***iOS(英文:iPhone Operating System)广泛支持各类应用软件的运行,其中,可以将能够运行于iOS上的应用软件的安装包称为iOS软件安装包,以下将以iOS软件安装包为例对各类应用软件安装包的构建过程进行说明。
具体的,构建iOS软件安装包的方法一般为:根据要实现的应用功能编写程序代码,对编写的程序代码进行编译,编译成功,得到能够实现相应应用功能的iOS软件安装包。
如果需要对iOS软件安装包所实现的功能进行修改,如需要在现有功能的基础上增加一些功能,或者需要对现有功能中的部分独立功能进行删除,通常是对iOS应用软件的源代码进行修改并对修改后的源代码重新编译进而得到修改后的IOS软件安装包,实现过程相对比较繁琐。
发明内容
本发明的发明目的在于提供一种无需对软件安装包的源代码进行修改及重新编译即可对软件安装包的功能进行修改的实现软件安装包功能修改的方法及终端。
本发明实施例公开了如下技术方案:
第一方面,本发明实施例提供了一种实现软件安装包功能修改的方法,包括:
在目标软件安装包的解压文件中添加用于实现预设功能的动态库;
修改所述解压文件中的可执行文件,以使所述可执行文件运行时从所述动态库中调用实现所述预设功能的方法类;
对所述解压文件重新签名并压缩得到修改后的软件安装包。
本实现方式通过在目标软件安装包的解压文件中引入可以实现预设功能的动态库,并通过对目标软件安装包的解压文件中的可执行文件进行修改,使得可执行文件运行时从动态库中调用方法类,进而使目标软件安装包能够实现动态库中添加的相关应用功能,达到在不修改应用软件源程序代码及不对源程序代码重新编译的前提下,实现对目标软件安装包功能修改的效果。
结合第一方面,在第一方面的第一种可能的实现方式中,所述可执行文件中包含多个高级精简指令集设备ARM结构运行片段,其中所述多个ARM结构运行片段分别适用于不同系列的ARM处理器。结合第一方面的第一种可能的实现方式,在第一方面的第二种可能的实现方式中,所述修改所述解压文件中的可执行文件,包括:
修改所述可执行文件中的所有所述ARM结构运行片段;
或者,
修改所述多个ARM结构运行片段中的适用于最低版本系列的ARM处理器的ARM结构运行片段。
采用本实现方式,当可执行文件中包括多个ARM结构运行片段时,可以分别对各个ARM结构运行片段进行修改,从而可以得到分别针对不同系列ARM处理器的应用程序运行片段,其中分别针对不同系列ARM处理器的应用程序运行片段均可以独立实现目标应用软件的应用功能。
另外,当可执行文件中包括多个ARM结构运行片段时,可以仅对适用于最低版本系列ARM处理器的ARM结构运行片段进行修改。由于iOS终端使用的ARM CPU都是向下兼容的,因此,仅对适用于最低版本系列ARM处理器的ARM结构运行片段进行修改,得到的ARM结构运行片段也是可以正常运行在其它较高版本系列的ARM CPU上,由此可以在修改内容较少的前提下得到能够适用于各类版本系列的ARM CPU上的IOS软件安装包。结合第一方面的第二种可能的实现方式,在第一方面的第三种可能的实现方式中,若修改的为所述多个ARM结构运行片段中的适用于最低版本系列的ARM处理器的ARM结构运行片段,则所述方法还包括删除所述多个ARM结构运行片段中的未被修改的ARM结构运行片段。
采用本实现方式,当仅对多个ARM结构运行片段中的适用于最低版本系列的ARM处理器的ARM结构运行片段进行修改时,可以将其它不用修改的ARM结构运行片段删除,可以减小目标软件安装包的大小,另外可以保证目标软件运行在版本的ARM CPU上时,均能运行修改后的ARM结构运行片段。
结合第一方面的第一种、第二种或者第三种可能的实现方式,在第一方面的第四种可能的实现方式中,所述修改所述解压文件中的可执行文件,以使所述可执行文件运行时从所述动态库中调用实现所述预设功能的方法类,包括:
在待修改的ARM结构运行片段的加载命令子片段中设置所述动态库的描述序列,其中,所述描述序列包括所述动态库的基本信息命令及所述动态库的搜索路径命令;
将所述待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对所述动态库中第二方法类的引用,其中,所述第一方法类为实现目标软件原有待修改功能的方法类,所述第二方法类为实现所述预设功能的方法类;
在所述待修改的ARM结构运行片段的字符串子片段中增加所述第二方法类的名称字符串;
将所述待修改的ARM结构运行片段的符号表子片段中的所述第一方法类的名称字符串相对于所述字符串子片段起始位置的偏移量修改为所述第二方法类的名称字符串相对于所述字符串子片段起始位置的偏移量。
本实现方式通过对ARM结构运行片段中的相关子片段的修改,使ARM结构运行片段在运行时能够执行动态库中的方法类,实现动态库的预设功能。
结合第一方面的第四种可能的实现方式,在第一方面的第五种可能的实现方式中,所述在待修改的ARM结构运行片段的加载命令子片段中设置所述动态库的描述序列,包括:
在所述加载命令子片段的任意一个命令结尾处设置所述动态库的描述序列。
采用本实现方式,当在加载命令子片段中设置动态库的描述序列时,将该描述序列设置在任意一个命令结尾处,一方面保证加载命令子片段中各命令语句的完整性,另一方面便于各加载命令子片段中的各命令的定位识别。结合第一方面的第五种可能的实现方式,在第一方面的第六种可能的实现方式中,所述在所述加载命令子片段的任意一个命令结尾处设置所述动态库的描述序列之后,删除所述加载命令子片段结尾位置与所述动态加载信息子片段的起始位置之间的一段零字节,其中,删除的所述零字节的长度与所述描述序列的长度相等。
采用本实现方式,可以保证位于加载命令子片段之后的各子片段相对于ARM结构运行片段起始位置的偏移量不变,确保ARM结构运行片段运行时对各子片段的调用。
结合第一方面的第六种可能的实现方式,在第一方面的第七种可能的实现方式中,所述删除所述加载命令子片段结尾位置与所述动态加载信息子片段的起始位置之间的一段零字节之后,所述方法还包括:
根据所述描述序列的长度及所述描述序列中所包括的命令个数,修改所述待修改的ARM结构运行片段的头部子片段中的关于所述加载命令子片段的参数,其中,所述关于所述加载命令子片段的参数包括:所述加载命令子片段中的命令总个数及命令总长度。
为了实现对动态库的正确加载,本实现方式还进一步修改ARM结构运行片段的头部子片段中的关于加载命令子片段的参数,保证ARM结构运行片段的头部子片段中的关于加载命令子片段的参数符合设置动态库描述序列后的实际状况。
结合第一方面的第四种可能的实现方式,在第一方面的第八种可能的实现方式中,所述将所述待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对所述动态库中第二方法类的引用,包括:
从所述动态加载信息子片段的绑定信息片段中确定所述第一方法类的名称字符串的位置;
根据所述第一方法类的名称字符串的起始位置,向低地址方向确定第一特征字节;
在所述第一特征字节所在的位置设置所述动态库的序列号,其中,所述动态库的序列号为在所述加载命令子片段中设置所述描述序列时,为所述动态库分配的序列号;
将所述绑定信息片段中的所述第一方法类的名称字符串替换为所述第二方法类的名称字符串;
根据所述绑定信息片段中所述第二方法类的名称字符串的结尾位置,向高地址方向确定第二特征字节;
在所述第二特征字节所在的位置设置所述***库的序列号,其中,所述***库的序列号为在所述加载命令子片段中加载所述***库时,为所述***库分配的序列号。
采用本实现方式:可以将待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对动态库中第二方法类的引用。
结合第一方面的第八种可能的实现方式,在第一方面的第九种可能的实现方式中,所述在所述第二特征字节所在的位置设置所述***库的序列号之后,所述方法还包括:
在所述动态加载信息子片段的结尾位置与所述符号表子片段的起始位置之间增加或删除一段零字节;
和/或
根据位于所述动态加载信息子片段之后的各信息子片段相对于所述待修改的ARM结构运行片段的偏移量的变化值,分别对所述加载命令子片段中的关于位于所述动态加载信息子片段之后的所述各信息子片段相对于所述待修改的ARM结构运行片段的偏移量参数值进行修改,其中,所述位于所述动态加载信息子片段之后的各信息子片段包括所述符号表子片段、所述字符串子片段及代码签名子片段。
采用本实现方式:可以保证加载命令子片段中的关于位于动态加载信息子片段之后的各信息子片段相对于待修改的ARM结构运行片段的偏移量参数值与实际情况保持一致。结合第一方面的第八种可能的实现方式,在第一方面的第十种可能的实现方式中,所述在所述第二特征字节所在的位置设置所述***库的序列号之后,所述方法还包括:
对所述加载命令子片段中的关于所述绑定信息片段的长度参数值进行修改。
采用本实现方式:可以确保加载命令子片段中的关于绑定信息片段的长度参数与绑定信息片段的实际长度一致。
结合第一方面的第四种可能的实现方式,在第一方面的第十一种可能的实现方式中,所述在所述待修改的ARM结构运行片段的字符串子片段中增加所述第二方法类的名称字符串,包括:
在所述字符串子片段的结尾处增加所述第二方法类的名称字符串。
采用本实现方式:在字符串子片段的结尾处增加第二方法类的名称字符串不会影响字符串子片段中其它代码的结构,也不会引起其它代码的偏移量的变化。
结合第一方面的第四种可能的实现方式,在第一方面的第十二种可能的实现方式中,所述在所述待修改的ARM结构运行片段的字符串子片段中增加所述第二方法类的名称字符串之后,所述方法还包括:
对所述加载命令子片段中的关于所述字符串子片段的长度参数值进行修改;
对所述加载命令子片段中的关于位于所述字符串子片段之后的代码签名子片段相对于所述待修改的ARM结构运行片段的偏移量的参数值进行修改。
采用本实现方式,可以确保加载命令子片段中的关于字符串子片段的长度参数及代码签名子片段的偏移量参数与实际情况保持一致。
第二方面,本发明实施例提供了一种终端,包括:中央处理器CPU、存储器和通信接口,所述CPU、所述存储器及所述通信接口通过通信总线相连;
所述CPU,用于读取所述存储器中存储的程序代码,执行以下操作:
在目标软件安装包的解压文件中添加用于实现预设功能的动态库;
修改所述解压文件中的可执行文件,以使所述可执行文件运行时从所述动态库中调用实现所述预设功能的方法类;
对所述解压文件重新签名并压缩得到修改后的软件安装包。
本发明第二方面还提供所述终端的各种实现方式,以执行第一方面所述的方法以及所述方法的各种实现方式,并达到相同的技术效果。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍。
图1为本发明实施例提供的一种实现软件安装包功能修改的方法的流程示意图;
图2为本发明实施例提供的另一种实现软件安装包功能修改的方法的流程示意图;
图3为iOS软件安装包解压后的文件目录结构示意图;
图4为本发明实施例提供的一种确定Mach-O文件中的ARM结构运行片段个数及位置的方法流程示意图;
图5为Mach-O文件中头部片段的结构示意图;
图6为单个ARM结构运行片段的结构示意图;
图7为本发明实施例提供的一种对单个ARM结构运行片段进行修改的方法流程示意图;
图8为单个ARM结构运行片段的头部子片段的结构示意图;
图9为本发明实施例提供的一种ARM结构运行片段加载动态库的具体方法流程示意图;
图10为本发明实施例提供的一种终端的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行描述。
本发明实施例中提供了一种实现软件安装包功能修改的方法,该方法在不需要修改应用软件的程序源代码以及不需要重新编译程序的前提下,通过修改应用软件已经编译好的安装包,实现对软件安装包的功能进行升级的效果。
以下将结合附图对本发明实施例的实现软件安装包功能修改的方法进行详细说明。
参见图1,为本发明实施例提供的一种实现软件安装包功能修改的方法的流程示意图,该方法的执行主体为各类终端,如手机、电脑等,更具体的为终端中的中央处理器(英文:central processing unit,简称:CPU),图1所示方法的具体处理步骤包括:
步骤S11:在目标软件安装包的解压文件中添加用于实现预设功能的动态库。
各类应用程序的软件安装包通常是一个压缩文件,将目标软件安装包解压后得到目标软件的解压文件,为了在不对目标应用软件的源代码修改的前提下实现对应用软件功能的升级,本发明实施例方法中首先将用于实现预设功能的动态库添加于目标软件安装包的解压文件中。
其中,动态库又称为动态链接库(英文:dynamic link library,简称:DLL),在动态库中存储有可供多个程序调用的函数的可执行代码,但动态库中的这些函数的可执行代码并不属于调用的程序,利用动态库的该特点,本发明实施例将能够实现预设功能的动态库添加于目标软件安装包的解压文件中。
按照目标软件源代码设计,目标软件中的程序在运行时,从***库中调用函数,其中***库是为目标软件设计的原有库,该库中存储有供目标软件中的程序调用的各类函数及相关数据。为了使目标软件能够实现预设功能,本发明实施例通过修改目标软件中的相关代码,使目标软件能够从添加的动态库中调用函数。
本发明实施例中,将动态库、***库中存储的供目标软件调用的函数、代码及数据等统称为方法类。
步骤S12:修改目标软件安装包的解压文件中的可执行文件,以使可执行文件运行时从动态库中调用实现预设功能的方法类。
目标软件安装包的解压文件中一般包括资源文件、配置文件、可执行文件以及其它信息,本发明实施例方法中,通过修改可执行文件的相关代码,使可执行文件运行时从动态库中调用能够实现预设功能的方法类,进而实现目标软件安装包所实现功能的升级。
步骤S13:对解压文件重新签名并压缩得到修改后的软件安装包。
对目标软件安装包的可执行文件修改完成后,对已经添加有动态库且执行文件进行修改后的解压文件重新签名并压缩得到实现功能升级后的软件安装包。
综上可以看出,本发明实施例的方法,通过在目标软件安装包的解压文件中引入可以实现预设功能的动态库,并通过对目标软件安装包的解压文件中的可执行文件进行修改,使得可执行文件运行时从动态库中调用方法类,进而使目标软件安装包能够实现动态库中添加的相关应用功能,达到在不修改应用软件源程序代码及不对源程序代码重新编译的前提下,实现对目标软件安装包功能修改的效果。
本发明实施例的实现软件安装包功能修改的方法适用于能够运行在对软件安装包实现的功能进行升级的方法适用能够运行于各类操作***的软件安装包的功能升级修改,以下将以对iOS软件安装包实现功能的功能进行修改的的升级步骤为例对本发明实施例方法进行更为详细的说明。
参见图2,为本发明实施例提供的另一种实现软件安装包功能修改的方法的流程示意图,该方法的执行主体为操作***是iOS的各类终端,如手机、电脑等,更具体的执行主体是操作***为iOS的终端中的CPU,图2所示方法的具体处理步骤包括:
步骤S21:在目标iOS软件安装包的解压文件中添加用于实现预设功能的动态库。
参见图3,为iOS软件安装包解压后的文件目录结构示意图。iOS软件安装包一般是以.ipa为后缀的压缩文件,对iOS软件安装包解压时,首先将其修改为以.zip为后缀的压缩文件,对以.zip为后缀的压缩文件解压后可以得到一个文件夹,文件夹名称一般为“Payload”。在“Payload”文件夹中,包括一个以软件名命名、以.app为后缀的文件夹,例如为:appName.app,进一步appName.app文件夹中还包括iOS软件的资源文件、配置文件、可执行文件(也称为Mach-O文件)以及其它信息。
根据目标iOS软件安装包欲升级的功能,编写功能代码,并编译所述功能代码得到一个动态库,例如编译得到的动态库为Dylib.framework,将Dylib.framework添加于appName.app文件夹内。
步骤S22:根据目标iOS软件安装包中Mach-O文件的头部片段,确定Mach-O文件中需要修改的ARM结构运行片段。
iOS软件安装包的Mach-O文件有两种结构:1、对iOS应用软件的源代码编译时,如果选择只编译得到唯一高级精简指令集设备(英文:Advanced RISC Machines,简称:ARM)结构运行片段,其中,RISC的英文全拼为reduced instruction set computer,中文名称为精简指令集计算,则Mach-O文件中仅包含一个ARM结构运行片段,例如该唯一ARM结构运行片段为ARM_V7结构运行片段或者ARM_64结构运行片段或者其它ARM结构运行片段,其中,ARM_V7结构运行片段是指适用于ARM_V7系列CPU的运行程序,ARM_64结构运行片段是指适用于ARM_64系列CPU的运行程序,其它ARM结构运行片段是指适用于其它ARM系列CPU的运行程序,另外,由于iOS终端使用的ARM CPU都是向下兼容的,因此,iOS软件安装包中的ARM_V7结构运行片段是可以正常运行在ARM_V7S和ARM_64系列的CPU上的,同理,利用本发明实施例方法对ARM_V7结构运行片段进行修改后得到的ARM结构运行片段也是可以正常运行在ARM_V7S和ARM_64系列的CPU上;2、对iOS应用软件的源代码编译时,如果选择同时编译得到多个ARM结构运行片段,则编译得到的Mach-O文件中包括头部片段(FatHeader)以及多个ARM结构运行片段,例如Mach-O文件中包括的多个ARM结构运行片段可以分别为ARM_V7结构运行片段、ARM_64结构运行片段等。
当Mach-O文件中仅包括一个ARM结构运行片段时,确定仅对该一个ARM结构运行片段进行修改;当Mach-O文件中包括多个ARM结构运行片段时,可以确定对Mach-O文件中包括的所有ARM结构运行片段进行修改,当对Mach-O文件中包括的所有ARM结构运行片段均进行修改时,可以得到分别针对不同系列ARM处理器的应用程序运行片段,其中分别针对不同系列ARM处理器的应用程序运行片段均可以独立实现iOS应用软件的应用功能。
本发明实施例中对Mach-O文件进行修改主要是指对Mach-O文件中包括的ARM结构运行片段进行修改,在对Mach-O文件的ARM结构运行片段进行修改之前,首先需要确定Mach-O文件中包括的ARM结构运行片段的个数以及所包括的ARM结构运行片段在Mach-O文件中的位置。
参见图4,为本发明实施例提供的一种确定Mach-O文件中包括的ARM结构运行片段个数及位置的方法流程示意图,图4所示的具体处理步骤包括:
步骤S221:确定Mach-O文件中是否包含头部片段(FatHeader),若包含则执行步骤S222;若不包含,则执行步骤S224。
参见图5,为Mach-O文件中头部片段的结构示意图。从图5中可以看出,Mach-O文件的头部片段中包括标志字节:0xCA、0xFE、0xBA、0xBE,根据头部片段的此结构特征,本发明实施例中进一步提供一种确定Mach-O文件中是否包含头部片段的具体方法,此方法为:确定Mach-O文件的前4个字节是否为0xCA、0xFE、0xBA、0xBE,若是,则确定Mach-O文件中包含头部片段,否则Mach-O文件中不包含头部片段。
步骤S222:解析头部片段,得到Mach-O文件中各个ARM结构运行片段的长度及各个ARM结构运行片段相对于整个Mach-O文件的偏移量信息。
如图5所示,Mach-O文件的第5至第8字节标识Mach-O文件中包括几种ARM结构运行片段,其中,当该四个字节分别为0x00、0x00、0x00及0x02时代表有2种ARM结构运行片段,当该四个字节分别为0x00、0x00、0x00及0x03时代表有3种ARM结构运行片段,其中,ARM结构运行片段的种类组合包括但不限于ARM_V7+ARM_V7S、ARM_V7+ARM_64以及ARM_V7+ARM_V7S+ARM_64。
如图5所示,Mach-O文件的第9至第28字节标识Mach-O文件所包括的其中一种ARM结构运行片段的长度以及相对于整个Mach-O文件的偏移量信息,以此类推,Mach-O文件中还标识了其它其所包括的ARM结构运行片段的长度及相对于整个Mach-O文件的偏移量信息。
步骤S223:根据得到的各个ARM结构运行片段的长度及各个ARM结构运行片段相对于整个Mach-O文件的偏移量信息,在Mach-O文件中定位各个ARM结构运行片段并确定分别对各个ARM结构运行片段进行修改。
根据Mach-O文件的头部片段确定各个ARM结构片段的长度及相对于整个Mach-O文件的偏移量信息后,可以分别定位到各个ARM结构运行片段的起始字节位置,之后可以分别对每个ARM结构运行片段进行修改。
步骤S224:确定对单一ARM结构运行片段进行修改。
步骤S23:对Mach-O文件中需要修改的ARM结构运行片段进行修改。
步骤S24:对解压文件重新签名并压缩得到修改后的软件安装包。
经过步骤S21~S23对Mach-O文件的改动,目标iOS软件安装包的解压文件中的文件内容已经无法与程序包中原有的签名信息匹配,需要重新用苹果公司的发布程序的证书签名,才能够使程序正常安装到终端上。
具体实施时,采用Mac上的签名命令“codesign”,首先对动态库Dylib.framework进行签名。然后对加入签名后的动态库Dylib.framework并修改了Mach-O文件的程序安装包文件夹appName.app进行签名,最后对签名后的Payload文件夹压缩,得到*.ipa(*代表任意文件名称)。
由于每个ARM结构运行片段的结构类似,修改方法基本相同,本发明实施例中仅以对ARM_V7结构运行片段的修改方法为例来说明各个ARM结构运行片段的修改过程。
参见图6,为单个ARM结构运行片段的结构示意图,单个ARM结构运行片段中包括头部(header)子片段、加载命令(load commands)子片段、动态加载信息(dynamic loaderinformation)子片段、符号表(symbol table)子片段、字符串(string table)子片段以及代码签名(code code signature)子片段,其中在相邻的子片段之间由一个或多个值为0x00的字节填充,以保证每个子片段的起始字节尽量从16进制整数偏移量的位置开始。
参见图7,为对单个ARM结构运行片段进行修改的方法流程示意图,其中,图7所示方法的主要处理步骤包括:
步骤S231:对ARM结构运行片段的头部子片段及加载命令子片段进行修改,实现动态库的加载。
参见图8,为单个ARM结构运行片段的头部子片段的结构示意图,如图8所示,ARM结构运行片段的头部子片段中包含关于加载命令子片段的参数信息,具体的,包括加载命令子片段中的命令个数以及命令总长度。
加载命令子片段主要描述了后续各个子片段的长度、相对于ARM结构运行片段的偏移量以及动态库加载的相关信息,其中,后续各个子片段是指动态加载信息子片段、符号表子片段、字符串子片段以及代码签名子片段。
参见图9,为ARM结构运行片段加载动态库的具体方法流程示意图。如图9所示,在ARM结构运行片段中加载动态库的具体处理步骤包括:
步骤A:在RAM结构运行片段中确定加载命令子片段的起始位置。
例如,在图8所示的ARM结构运行片段中,从ARM结构运行片段的起始位置偏移28个字节,找到加载命令子片段的起始位置。
步骤B:在加载命令子片段中的任意一个命令结尾处设置动态库的描述序列。
例如,在加载命令子片段所包括的任意一个命令结尾处***用于描述动态库Dylib.framework的描述序列S1,进一步,在ARM结构运行片段中位于描述序列***位置及***位置之后的字节顺延到S1之后的位置。
加载命令子片段中***的动态库的描述序列主要包括两个命令,分别为动态库的基本信息命令以及动态库的搜索路径命令,且***的描述序列为ASCII码形式。
例如,在加载命令子片段中,***的描述序列S1可以如下:“(byte)0x0C,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x38,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x18,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x02,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x01,(byte)0x00,(byte)0x40,(byte)0x72,(byte)0x70,(byte)0x61,(byte)0x74,(byte)0x68,(byte)0x2F,(byte)0x44,(byte)0x79,(byte)0x6C,(byte)0x69,(byte)0x62,(byte)0x2E,(byte)0x66,(byte)0x72,(byte)0x61,(byte)0x6D,(byte)0x65,(byte)0x77,(byte)0x6F,(byte)0x72,(byte)0x6B,(byte)0x2F,(byte)0x44,(byte)0x79,(byte)0x6C,(byte)0x69,(byte)0x62,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x1C,(byte)0x00,(byte)0x00,(byte)0x80,(byte)0x20,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x0C,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x40,(byte)0x65,(byte)0x78,(byte)0x65,(byte)0x63,(byte)0x75,(byte)0x74,(byte)0x61,(byte)0x62,(byte)0x6C,(byte)0x65,(byte)0x5F,(byte)0x70,(byte)0x61,(byte)0x74,(byte)0x68,(byte)0x2F,(byte)0x00,(byte)0x00,(byte)0x00”。
其中,在***的字节序列S1中,“(byte)0x40,(byte)0x72,(byte)0x70,(byte)0x61,(byte)0x74,(byte)0x68,(byte)0x2F,(byte)0x44,(byte)0x79,(byte)0x6C,(byte)0x69,(byte)0x62,(byte)0x2E,(byte)0x66,(byte)0x72,(byte)0x61,(byte)0x6D,(byte)0x65,(byte)0x77,(byte)0x6F,(byte)0x72,(byte)0x6B,(byte)0x2F,(byte)0x44,(byte)0x79,(byte)0x6C,(byte)0x69,(byte)0x62,(byte)0x00”是字符串“@rpath/Dylib.framework/Dylib”的ASCII码值,其中“Dylib.framework”是***的动态库的名称,如果***其它名称的动态库,则此处更换成相应动态库名称的ASCII码值。
步骤C:删除加载命令子片段结尾位置与动态加载信息子片段的起始位置之间的一段零字节,其中,删除的零字节的长度与描述序列的长度相等。
例如,加载命令子片段中***的动态库描述序列的长度为L1,,则删除的零字节的长度也为L1,以保证后续子片段相对于ARM结构运行片段的起始位置的偏移量不发生变化。
步骤D:根据设置的描述序列的长度及描述序列中所包括的命令个数,修改ARM结构运行片段的头部子片段中包含的关于加载命令子片段的参数,其中,关于加载命令子片段的参数包括:加载命令子片段中的命令总个数及命令总长度。
具体的,当描述序列的长度为L1,且描述序列中包括动态库的基本信息及动态库的搜索路径两个命令时,对ARM结构运行片段的头部子片段中的关于加载命令子片段的参数进行修改,其中加载命令子片段中的命令总个数加2,命令总长度加L1。
步骤S232:将ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对动态库中第二方法类的引用。
其中,第一方法类为实现目标软件原有待修改功能的方法类,第二方法类为实现预设功能的方法类。
例如,在ARM结构运行片段的加载命令子片段中***动态库Dylib.framework的描述序列之后,还需要将Dylib.framework中的程序接口,在iOS程序中调用起来,才能够实现在程序中***功能逻辑的效果。动态库Dylib.framework中的程序接口被iOS调用起来的原理如下:在动态库Dylib.framework中,实现一个主程序中必然会用到本地***方法类的子类,在子类中继承并重写该***类的一个或若干个方法;修改程序安装包中的Mach-O文件,将Mach-O文件中使用该本地***方法类的位置,替换成使用动态库Dylib.framework中重写之后的子类,从而实现动态库Dylib.framework中功能逻辑被主程序调用的效果。
具体的,将ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对动态库中第二方法类的引用的具体步骤包括:
(1)从动态加载信息子片段的绑定信息片段中确定第一方法类的名称字符串的位置。
动态加载信息子片段中包括绑定信息片段,在绑定信息片段中包含引用的***库中的方法类的名称字符串。
例如,当终端执行目标iOS软件时,引用的是***库UIKit.framework中的方法类“UIViewController”,动态库Dylib.framework中用于替换“UIViewController”的方法类为“MyViewContro”,其中MyViewContro方法类继承UIViewController方法类的功能,并在MyViewContro方法类中对相关方法进行了修改,则绑定信息片段中包含字符串“OBJC_CLASS_UIViewController”的ASCII码。
(2)根据第一方法类的名称字符串的位置的起始位置,向低地址方向确定第一特征字节。
(3)在第一特征字节所在的位置设置动态库Dylib.framework的序列号,其中,动态库Dylib.framework的序列号为在加载命令子片段中设置动态库Dylib.framework的描述序列时,为动态库Dylib.framework分配的序列号。
仍以动态库Dylib.framework中的MyViewContro方法类替换***库UIKit.framework中的UIViewController方法类为例,在绑定信息片段中确定字符串“OBJC_CLASS_UIViewController”的ASCII码的起始位置后,从字符串“OBJC_CLASS_UIViewController”的ASCII码的起始位置,向低地址方向寻找特征字节“0x90、0x40”或者“0x90、0x41”,找到之后,在0x40或者0x41所在的位置,***Dylib.framework在加载命令子片段中加载时的动态库序列号(如,Load Commands中原加载了10个动态库,将Dylib.framework写在这10个动态库之后,则动态库Dylib.framework的序号就是11)。
(4)将绑定信息片段中的第一方法类的名称字符串替换为第二方法类的名称字符串。
具体的,即是将字符串“OBJC_CLASS_UIViewController”的ASCII码替换为字符串“OBJC_CLASS_UIViewContro”的ASCII码。
(5)根据绑定信息片段中第二方法类的名称字符串的结尾位置,向高地址方向确定第二特征字节。
(6)在第二特征字节所在的位置设置***库的序列号,其中,***库的序列号为在加载命令子片段中设置***库时,为***库分配的序列号。
仍以动态库Dylib.framework中的MyViewContro方法类替换***库UIKit.framework中的UIViewController方法类为例,从字符串“OBJC_CLASS_UIViewContro”的ASCII码结尾处,向高地址寻找特征字节“0x90、0x40”或者“0x90、0x41”,找到之后,在字节0x40或者0x41的位置,******库UIKit.framework在加载命令子片段加载时的序列号。
(7)在动态加载信息子片段的结尾位置与符号表子片段的起始位置之间增加或删除一段零字节。
步骤(7)具体是指:在动态加载信息子片段后面增补或者删除相应个数的字节0x00,其中,具体增删的个数,以保证后面的子片段相对于ARM结构运行片段的起始地址的偏移量不发生变化为准。如果待删除的0x00的个数不够,位于动态加载信息子片段后面的子片段长度必须发生变化,则需要执行下述步骤(8)调整负载命令子片段中关于各个片段的描述信息的偏移量值,以保证负载命令子片段中的描述信息与各子片段实际情况一致。
(8)根据位于动态加载信息子片段之后的各信息子片段相对于待修改的ARM结构运行片段的偏移量的变化值,分别对加载命令子片段中包含的关于位于动态加载信息子片段之后的各信息子片段相对于待修改的ARM结构运行片段的偏移量参数值进行修改,其中,位于动态加载信息子片段之后的各信息子片段包括符号表子片段、字符串子片段及代码签名子片段。
另外,在具体实施时,也可以不执行步骤(7)直接执行步骤(8),以保证负载命令子片段中的描述信息与各子片段实际情况一致。
(9)对加载命令子片段中的关于绑定信息片段的长度参数值进行修改。
负载命令子片段中包含关于动态负载信息(dynamic load info)子片段的描述信息,从描述信息的第1个字节算起,第21-24字节代表代表绑定信息(binding info)片段的长度,绑定信息片段中的修改状况,对加载命令子片段中包含的关于绑定信息片段的长度参数值进行修改。
步骤S233:在ARM结构运行片段的字符串子片段中增加第二方法类的名称字符串。
完成上述步骤S232的修改之后,需要进一步修改ARM结构运行片段中的符号表子片段和字符串子片段,才能使得动态库“MyViewContro”方法类完全替代***库中的“UIViewController”方法类。
本步骤中,优选的,在ARM结构运行片段的字符串子片段中增加第二方法类的名称字符串可以为在字符串子片段的结尾处增加第二方法类的名称字符串。
具体实施时,可以在字符串子片段的结尾,增加字符串“OBJC_CLASS_UIViewContro”的ASCII码,其中可以将字符串“OBJC_CLASS_UIViewContro”的ASCII码相对于字符串子片段起始位置的偏移量叫做Offset1,增加的长度为L2个字节。
在字符串子片段的结尾,增加字符串“OBJC_CLASS_UIViewContro”的ASCII码之后,位于字符串子片段之后的代码签名子片段向后偏移L2个字节。
在字符串子片段中,确定字符串“OBJC_CLASS_UIViewController”相对于字符串子片段的起始位置的偏移量,并将该偏移量称为Offset2。
步骤S234:将ARM结构运行片段的符号表子片段中的第一方法类的名称字符串相对于字符串子片段起始位置的偏移量修改为第二方法类的名称字符串相对于字符串子片段起始位置的偏移量。
具体实施时,从符号表子片段的起始位置,遍历查找偏移量Offset2的值(Offset2的值由4字节表示),找到之后,替换成偏移量Offset1的值(Offset1的值也由4字节表示,替换位置之后的字节不需要发生移动),并且由索引“OBJC_CLASS_UIViewController”字符串,替换成索引“OBJC_CLASS_UIViewContro”字符串。
步骤S235:对加载命令子片段中的关于字符串子片段的长度参数值以及关于位于字符串子片段之后的代码签名子片段相对于待修改的ARM结构运行片段的偏移量的参数值进行修改。
其中,在加载命令子片段中,修改关于String Table的描述信息,将String Table的大小,增加L1;修改关于Code signature的描述信息,将Code signature的偏移量,增加L1。
在本发明的另一个实施例中,目标iOS软件安装包的可执行文件中包括多个ARM结构运行片段,当对可执行文件进行修改时,对该多个ARM结构运行片段中的适用于最低版本系列的ARM处理器的ARM结构运行片段进行修改,其中对ARM结构运行片段进行修改的方法与上述实施例中的方法相同,不再赘述。
进一步,当修改的为多个ARM结构运行片段中的适用于最低版本系列的ARM处理器的ARM结构运行片段时,本发明实施例方法还进一步删除多个ARM结构运行片段中的未被修改的ARM结构运行片段。
由于iOS终端使用的ARM CPU都是向下兼容的,因此,仅对适用于最低版本系列ARM处理器的ARM结构运行片段进行修改,得到的ARM结构运行片段也是可以正常运行在其它较高版本系列的ARM CPU上,可见本实施例在修改内容较少的前提下得到能够适用于各类版本系列的ARM CPU上的IOS软件安装包。
参见图10,为本发明实施例提供的一种终端的结构示意图,该终端1000包括CPU1002、存储器1003和通信接口1001,其中,CPU1002、存储器1003及通信接口1001通过通信总线1004相连;通信接口1001、存储器1003和CPU1002,其中,通信接口1001、CPU1002、存储器1003、通过总线1004相互连接;通信总线1004可以是外设部件互连标准(peripheral component interconnect,简称PCI)总线或扩展工业标准结构(extended industry standard architecture,简称EISA)总线等。通信总线1004可以分为地址总线、数据总线、控制总线等。为便于表示,图10中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
通信接口1001用于与发送端通信。存储器1003,用于存放程序。具体地,程序可以包括程序代码,程序代码包括计算机操作指令。存储器1003可能包含随机存取存储器(random access memory,简称RAM),也可能还包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。
CPU1002执行存储器1003所存放的程序,实现本发明前述方法实施例的方法:
包括:
在目标软件安装包的解压文件中添加用于实现预设功能的动态库;
修改解压文件中的可执行文件,以使可执行文件运行时从动态库中调用实现预设功能的方法类;
对解压文件重新签名并压缩得到修改后的软件安装包。
上述CPU1002可以是通用CPU,尤其在iOS终端中,上述CPU1002为ARM CPU。
本发明实施例中,通过在目标软件安装包的解压文件中引入可以实现预设功能的动态库,并通过对目标软件安装包的解压文件中的可执行文件进行修改,使得可执行文件运行时从动态库中调用方法类,进而使目标软件安装包能够实现动态库中添加的相关应用功能,达到在不修改应用软件源程序代码及不对源程序代码重新编译的前提下,实现对目标软件安装包功能修改的效果。
本发明实施例中,可执行文件中包含多个ARM结构运行片段,其中多个ARM结构运行片段分别适用于不同系列的ARM CPU。
本发明实施例中,CPU1002修改解压文件中的可执行文件,包括执行:
修改可执行文件中的所有ARM结构运行片段;
或者,
修改多个ARM结构运行片段中的适用于最低版本系列的ARMCPU1002的ARM结构运行片段。
当可执行文件中包括多个ARM结构运行片段时,可以分别对各个ARM结构运行片段进行修改,从而可以得到分别针对不同系列ARMCPU1002的应用程序运行片段,其中分别针对不同系列ARMCPU1002的应用程序运行片段均可以独立实现目标应用软件的应用功能。
另外,当可执行文件中包括多个ARM结构运行片段时,可以仅对适用于最低版本系列ARM CPU的ARM结构运行片段进行修改。由于iOS终端使用的ARM CPU都是向下兼容的,因此,仅对适用于最低版本系列ARM CPU的ARM结构运行片段进行修改,得到的ARM结构运行片段也是可以正常运行在其它较高版本系列的ARM CPU上,由此可以在修改内容较少的前提下得到能够适用于各类版本系列的ARM CPU上的IOS软件安装包。
本发明实施例中,若CPU1002修改的为多个ARM结构运行片段中的适用于最低版本系列的ARM CPU的ARM结构运行片段,则CPU1002还用于删除多个ARM结构运行片段中的未被修改的ARM结构运行片段。
当仅对多个ARM结构运行片段中的适用于最低版本系列的ARM CPU的ARM结构运行片段进行修改时,可以将其它不用修改的ARM结构运行片段删除,可以减小目标软件安装包的大小,另外可以保证目标软件运行在版本的ARM CPU上时,均能运行修改后的ARM结构运行片段。
本发明实施例中,在第二方面的第四种可能的实现方式中,CPU1002修改解压文件中的可执行文件,以使可执行文件运行时从动态库中调用实现预设功能的方法类,包括执行:
CPU1002在待修改的ARM结构运行片段的加载命令子片段中设置动态库的描述序列,其中,描述序列包括动态库的基本信息命令及动态库的搜索路径命令;
将待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对动态库中第二方法类的引用,其中,第一方法类为实现目标软件原有待修改功能的方法类,第二方法类为实现预设功能的方法类;
在待修改的ARM结构运行片段的字符串子片段中增加第二方法类的名称字符串;
将待修改的ARM结构运行片段的符号表子片段中的第一方法类的名称字符串相对于字符串子片段起始位置的偏移量修改为第二方法类的名称字符串相对于字符串子片段起始位置的偏移量。
本发明中通过对ARM结构运行片段中的相关子片段的修改,使ARM结构运行片段在运行时能够执行动态库中的方法类,实现动态库的预设功能。
本发明实施例中,CPU1002在待修改的ARM结构运行片段的加载命令子片段中设置动态库的描述序列,包括执行:
在加载命令子片段的任意一个命令结尾处设置动态库的描述序列。
当在加载命令子片段中设置动态库的描述序列时,将该描述序列设置在任意一个命令结尾处,一方面保证加载命令子片段中各命令语句的完整性,另一方面便于各加载命令子片段中的各命令的定位识别。
本发明实施例中,CPU1002在加载命令子片段的任意一个命令结尾处设置动态库的描述序列之后,CPU1002还删除加载命令子片段结尾位置与动态加载信息子片段的起始位置之间的一段零字节,其中,删除的零字节的长度与描述序列的长度相等。
本发明实施例中,CPU1002删除加载命令子片段结尾位置与动态加载信息子片段的起始位置之间的一段零字节之后,CPU1002还用于根据描述序列的长度及描述序列中所包括的命令个数,修改待修改的ARM结构运行片段的头部子片段中的关于加载命令子片段的参数,其中,关于加载命令子片段的参数包括:加载命令子片段中的命令总个数及命令总长度。
为了实现对动态库的正确加载,本实现方式还进一步修改ARM结构运行片段的头部子片段中的关于加载命令子片段的参数,保证ARM结构运行片段的头部子片段中的关于加载命令子片段的参数符合设置动态库描述序列后的实际状况。
本发明实施例中,CPU1002将待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对动态库中第二方法类的引用,包括执行:
CPU1002从动态加载信息子片段的绑定信息片段中确定第一方法类的名称字符串的位置;
根据第一方法类的名称字符串的起始位置,向低地址方向确定第一特征字节;
在第一特征字节所在的位置设置动态库的序列号,其中,动态库的序列号为在加载命令子片段中设置描述序列时,为动态库分配的序列号;
将绑定信息片段中的第一方法类的名称字符串替换为第二方法类的名称字符串;
根据绑定信息片段中第二方法类的名称字符串的结尾位置,向高地址方向确定第二特征字节;
在第二特征字节所在的位置设置***库的序列号,其中,***库的序列号为在加载命令子片段中加载***库时,为***库分配的序列号。
采用本实现方式:可以将待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对动态库中第二方法类的引用。
本发明实施例中,CPU1002在第二特征字节所在的位置设置***库的序列号之后:
CPU1002还用于在动态加载信息子片段的结尾位置与符号表子片段的起始位置之间增加或删除一段零字节;
和/或,
CPU1002还用于根据位于动态加载信息子片段之后的各信息子片段相对于待修改的ARM结构运行片段的偏移量的变化值,分别对加载命令子片段中的关于位于动态加载信息子片段之后的各信息子片段相对于待修改的ARM结构运行片段的偏移量参数值进行修改,其中,位于动态加载信息子片段之后的各信息子片段包括符号表子片段、字符串子片段及代码签名子片段。
本发明实施例中,CPU1002在第二特征字节所在的位置设置***库的序列号之后,CPU1002还用于对加载命令子片段中的关于绑定信息片段的长度参数值进行修改。
本发明实施例中,CPU1002在待修改的ARM结构运行片段的字符串子片段中增加第二方法类的名称字符串,包括执行:
CPU1002在字符串子片段的结尾处增加第二方法类的名称字符串。
本发明实施例中,CPU1002在待修改的ARM结构运行片段的字符串子片段中增加第二方法类的名称字符串之后,CPU1002还用于:
对加载命令子片段中的关于字符串子片段的长度参数值进行修改;
对加载命令子片段中的关于位于字符串子片段之后的代码签名子片段相对于待修改的ARM结构运行片段的偏移量的参数值进行修改。
采用本实现方式,可以确保加载命令子片段中的关于字符串子片段的长度参数及代码签名子片段的偏移量参数与实际情况保持一致。
本发明实施例中终端能够实现本发明实施例的上述方法,实现的具体步骤可以参照对方法部分,不再赘述。
应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制。
Claims (26)
1.一种实现软件安装包功能修改的方法,其特征在于,包括:
在目标软件安装包的解压文件中添加用于实现预设功能的动态库;
修改所述解压文件中的可执行文件,以使所述可执行文件运行时从所述动态库中调用实现所述预设功能的方法类;
对所述解压文件重新签名并压缩得到修改后的软件安装包。
2.根据权利要求1所述的方法,其特征在于,所述可执行文件中包含多个高级精简指令集设备ARM结构运行片段,其中所述多个ARM结构运行片段分别适用于不同系列的ARM处理器。
3.根据权利要求2所述的方法,其特征在于,所述修改所述解压文件中的可执行文件,包括:
修改所述可执行文件中的所有所述ARM结构运行片段;
或者,
修改所述多个ARM结构运行片段中的适用于最低版本系列的ARM处理器的ARM结构运行片段。
4.根据权利要求3所述的方法,其特征在于,若修改的为所述多个ARM结构运行片段中的适用于最低版本系列的ARM处理器的ARM结构运行片段,则所述方法还包括删除所述多个ARM结构运行片段中的未被修改的ARM结构运行片段。
5.根据权利要求2~4中任一项所述的方法,其特征在于,所述修改所述解压文件中的可执行文件,以使所述可执行文件运行时从所述动态库中调用实现所述预设功能的方法类,包括:
在待修改的ARM结构运行片段的加载命令子片段中设置所述动态库的描述序列,其中,所述描述序列包括所述动态库的基本信息命令及所述动态库的搜索路径命令;
将所述待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对所述动态库中第二方法类的引用,其中,所述第一方法类为实现目标软件原有待修改功能的方法类,所述第二方法类为实现所述预设功能的方法类;
在所述待修改的ARM结构运行片段的字符串子片段中增加所述第二方法类的名称字符串;
将所述待修改的ARM结构运行片段的符号表子片段中的所述第一方法类的名称字符串相对于所述字符串子片段起始位置的偏移量修改为所述第二方法类的名称字符串相对于所述字符串子片段起始位置的偏移量。
6.根据权利要求5所述的方法,其特征在于,所述在待修改的ARM结构运行片段的加载命令子片段中设置所述动态库的描述序列,包括:
在所述加载命令子片段的任意一个命令结尾处设置所述动态库的描述序列。
7.根据权利要求6所述的方法,其特征在于,所述在所述加载命令子片段的任意一个命令结尾处设置所述动态库的描述序列之后,删除所述加载命令子片段结尾位置与所述动态加载信息子片段的起始位置之间的一段零字节,其中,删除的所述零字节的长度与所述描述序列的长度相等。
8.根据权利要求7所述的方法,其特征在于,所述删除所述加载命令子片段结尾位置与所述动态加载信息子片段的起始位置之间的一段零字节之后,所述方法还包括:
根据所述描述序列的长度及所述描述序列中所包括的命令个数,修改所述待修改的ARM结构运行片段的头部子片段中的关于所述加载命令子片段的参数,其中,所述关于所述加载命令子片段的参数包括:所述加载命令子片段中的命令总个数及命令总长度。
9.根据权利要求5所述的方法,其特征在于,所述将所述待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对所述动态库中第二方法类的引用,包括:
从所述动态加载信息子片段的绑定信息片段中确定所述第一方法类的名称字符串的位置;
根据所述第一方法类的名称字符串的起始位置,向低地址方向确定第一特征字节;
在所述第一特征字节所在的位置设置所述动态库的序列号,其中,所述动态库的序列号为在所述加载命令子片段中设置所述描述序列时,为所述动态库分配的序列号;
将所述绑定信息片段中的所述第一方法类的名称字符串替换为所述第二方法类的名称字符串;
根据所述绑定信息片段中所述第二方法类的名称字符串的结尾位置,向高地址方向确定第二特征字节;
在所述第二特征字节所在的位置设置所述***库的序列号,其中,所述***库的序列号为在所述加载命令子片段中加载所述***库时,为所述***库分配的序列号。
10.根据权利要求9所述的方法,其特征在于,所述在所述第二特征字节所在的位置设置所述***库的序列号之后,所述方法还包括:
在所述动态加载信息子片段的结尾位置与所述符号表子片段的起始位置之间增加或删除一段零字节;
和/或,
根据位于所述动态加载信息子片段之后的各信息子片段相对于所述待修改的ARM结构运行片段的偏移量的变化值,分别对所述加载命令子片段中的关于位于所述动态加载信息子片段之后的所述各信息子片段相对于所述待修改的ARM结构运行片段的偏移量参数值进行修改,其中,所述位于所述动态加载信息子片段之后的各信息子片段包括所述符号表子片段、所述字符串子片段及代码签名子片段。
11.根据权利要求9所述的方法,其特征在于,所述在所述第二特征字节所在的位置设置所述***库的序列号之后,所述方法还包括:
对所述加载命令子片段中的关于所述绑定信息片段的长度参数值进行修改。
12.根据权利要求5所述的方法,其特征在于,所述在所述待修改的ARM结构运行片段的字符串子片段中增加所述第二方法类的名称字符串,包括:
在所述字符串子片段的结尾处增加所述第二方法类的名称字符串。
13.根据权利要求5所述的方法,其特征在于,所述在所述待修改的ARM结构运行片段的字符串子片段中增加所述第二方法类的名称字符串之后,所述方法还包括:
对所述加载命令子片段中的关于所述字符串子片段的长度参数值进行修改;
对所述加载命令子片段中的关于位于所述字符串子片段之后的代码签名子片段相对于所述待修改的ARM结构运行片段的偏移量的参数值进行修改。
14.一种终端,其特征在于,包括:中央处理器CPU、存储器和通信接口,所述CPU、所述存储器及所述通信接口通过通信总线相连;
所述CPU,用于读取所述存储器中存储的程序代码,执行以下操作:
在目标软件安装包的解压文件中添加用于实现预设功能的动态库;
修改所述解压文件中的可执行文件,以使所述可执行文件运行时从所述动态库中调用实现所述预设功能的方法类;
对所述解压文件重新签名并压缩得到修改后的软件安装包。
15.根据权利要求14所述的终端,其特征在于,所述可执行文件中包含多个ARM结构运行片段,其中所述多个ARM结构运行片段分别适用于不同系列的ARM处理器。
16.根据权利要求15所述的终端,其特征在于,所述CPU修改所述解压文件中的可执行文件,包括执行:
修改所述可执行文件中的所有所述ARM结构运行片段;
或者,
修改所述多个ARM结构运行片段中的适用于最低版本系列的ARM处理器的ARM结构运行片段。
17.根据权利要求16所述的终端,其特征在于,若所述CPU修改的为所述多个ARM结构运行片段中的适用于最低版本系列的ARM处理器的ARM结构运行片段,则所述CPU还用于删除所述多个ARM结构运行片段中的未被修改的ARM结构运行片段。
18.根据权利要求15~17中任一项所述的终端,其特征在于,所述CPU修改所述解压文件中的可执行文件,以使所述可执行文件运行时从所述动态库中调用实现所述预设功能的方法类,包括执行:
所述CPU在待修改的ARM结构运行片段的加载命令子片段中设置所述动态库的描述序列,其中,所述描述序列包括所述动态库的基本信息命令及所述动态库的搜索路径命令;
将所述待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对所述动态库中第二方法类的引用,其中,所述第一方法类为实现目标软件原有待修改功能的方法类,所述第二方法类为实现所述预设功能的方法类;
在所述待修改的ARM结构运行片段的字符串子片段中增加所述第二方法类的名称字符串;
将所述待修改的ARM结构运行片段的符号表子片段中的所述第一方法类的名称字符串相对于所述字符串子片段起始位置的偏移量修改为所述第二方法类的名称字符串相对于所述字符串子片段起始位置的偏移量。
19.根据权利要求18所述的终端,其特征在于,所述CPU在待修改的ARM结构运行片段的加载命令子片段中设置所述动态库的描述序列,包括执行:
在所述加载命令子片段的任意一个命令结尾处设置所述动态库的描述序列。
20.根据权利要求19所述的终端,其特征在于,所述CPU在加载命令子片段的任意一个命令结尾处设置所述动态库的描述序列之后,所述CPU还删除所述加载命令子片段结尾位置与所述动态加载信息子片段的起始位置之间的一段零字节,其中,删除的所述零字节的长度与所述描述序列的长度相等。
21.根据权利要求20所述的终端,其特征在于,所述CPU删除所述加载命令子片段结尾位置与所述动态加载信息子片段的起始位置之间的一段零字节之后,所述CPU还用于根据所述描述序列的长度及所述描述序列中所包括的命令个数,修改所述待修改的ARM结构运行片段的头部子片段中的关于所述加载命令子片段的参数,其中,所述关于所述加载命令子片段的参数包括:所述加载命令子片段中的命令总个数及命令总长度。
22.根据权利要求18所述的终端,其特征在于,所述CPU将所述待修改的ARM结构运行片段的动态加载信息子片段中对***库第一方法类的引用修改为对所述动态库中第二方法类的引用,包括执行:
所述CPU从所述动态加载信息子片段的绑定信息片段中确定所述第一方法类的名称字符串的位置;
根据所述第一方法类的名称字符串的起始位置,向低地址方向确定第一特征字节;
在所述第一特征字节所在的位置设置所述动态库的序列号,其中,所述动态库的序列号为在所述加载命令子片段中设置所述描述序列时,为所述动态库分配的序列号;
将所述绑定信息片段中的所述第一方法类的名称字符串替换为所述第二方法类的名称字符串;
根据所述绑定信息片段中所述第二方法类的名称字符串的结尾位置,向高地址方向确定第二特征字节;
在所述第二特征字节所在的位置设置所述***库的序列号,其中,所述***库的序列号为在所述加载命令子片段中加载所述***库时,为所述***库分配的序列号。
23.根据权利要求22所述的终端,其特征在于,所述CPU在所述第二特征字节所在的位置设置所述***库的序列号之后:
所述CPU还用于在所述动态加载信息子片段的结尾位置与所述符号表子片段的起始位置之间增加或删除一段零字节;
和/或,
所述CPU还用于根据位于所述动态加载信息子片段之后的各信息子片段相对于所述待修改的ARM结构运行片段的偏移量的变化值,分别对所述加载命令子片段中的关于位于所述动态加载信息子片段之后的各信息子片段相对于所述待修改的ARM结构运行片段的偏移量参数值进行修改,其中,所述位于所述动态加载信息子片段之后的各信息子片段包括所述符号表子片段、所述字符串子片段及代码签名子片段。
24.根据权利要求22所述的终端,其特征在于,所述CPU在所述第二特征字节所在的位置设置所述***库的序列号之后,所述CPU还用于对所述加载命令子片段中的关于所述绑定信息片段的长度参数值进行修改。
25.根据权利要求18所述的终端,其特征在于,所述CPU在所述待修改的ARM结构运行片段的字符串子片段中增加所述第二方法类的名称字符串,包括执行:
所述CPU在所述字符串子片段的结尾处增加所述第二方法类的名称字符串。
26.根据权利要求18所述的终端,其特征在于,所述CPU在所述待修改的ARM结构运行片段的字符串子片段中增加所述第二方法类的名称字符串之后,所述CPU还用于:
对所述加载命令子片段中的关于所述字符串子片段的长度参数值进行修改;
对所述加载命令子片段中的关于位于所述字符串子片段之后的代码签名子片段相对于所述待修改的ARM结构运行片段的偏移量的参数值进行修改。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610243033.8A CN107305495A (zh) | 2016-04-19 | 2016-04-19 | 实现软件安装包功能修改的方法及终端 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610243033.8A CN107305495A (zh) | 2016-04-19 | 2016-04-19 | 实现软件安装包功能修改的方法及终端 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107305495A true CN107305495A (zh) | 2017-10-31 |
Family
ID=60152170
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610243033.8A Pending CN107305495A (zh) | 2016-04-19 | 2016-04-19 | 实现软件安装包功能修改的方法及终端 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107305495A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108121563A (zh) * | 2017-11-10 | 2018-06-05 | 广州阿里巴巴文学信息技术有限公司 | 应用功能定制方法、装置、计算设备以及存储介质 |
CN108845841A (zh) * | 2018-06-15 | 2018-11-20 | 广州多益网络股份有限公司 | 改变终端应用行为的方法、装置及终端 |
CN109614254A (zh) * | 2018-12-27 | 2019-04-12 | 迅雷计算机(深圳)有限公司 | 一种Dylib引用删除方法及相关装置 |
CN109934016A (zh) * | 2019-03-07 | 2019-06-25 | 江苏通付盾信息安全技术有限公司 | 应用的签名校验方法、装置及电子设备 |
CN109933350A (zh) * | 2019-03-07 | 2019-06-25 | 江苏通付盾信息安全技术有限公司 | 在应用中嵌入代码的方法、装置及电子设备 |
CN110674474A (zh) * | 2019-09-19 | 2020-01-10 | 大唐高鸿信安(浙江)信息科技有限公司 | 一种应用程序的运行控制方法及装置 |
CN117762430A (zh) * | 2024-02-22 | 2024-03-26 | 腾讯科技(深圳)有限公司 | 基于应用程序的处理方法、装置、计算机设备和存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120159470A1 (en) * | 2010-01-27 | 2012-06-21 | Zte Corporation | Method and device for generating software installation packet |
CN103559591A (zh) * | 2013-11-20 | 2014-02-05 | 北京可信华泰信息技术有限公司 | 基于可信计算的软件管理***和管理方法 |
CN104679495A (zh) * | 2013-12-02 | 2015-06-03 | 贝壳网际(北京)安全技术有限公司 | 软件识别方法及装置 |
CN105068813A (zh) * | 2015-08-19 | 2015-11-18 | 北京奇虎科技有限公司 | 一种提供安卓包apk修改服务的方法和装置 |
-
2016
- 2016-04-19 CN CN201610243033.8A patent/CN107305495A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120159470A1 (en) * | 2010-01-27 | 2012-06-21 | Zte Corporation | Method and device for generating software installation packet |
CN103559591A (zh) * | 2013-11-20 | 2014-02-05 | 北京可信华泰信息技术有限公司 | 基于可信计算的软件管理***和管理方法 |
CN104679495A (zh) * | 2013-12-02 | 2015-06-03 | 贝壳网际(北京)安全技术有限公司 | 软件识别方法及装置 |
CN105068813A (zh) * | 2015-08-19 | 2015-11-18 | 北京奇虎科技有限公司 | 一种提供安卓包apk修改服务的方法和装置 |
Non-Patent Citations (1)
Title |
---|
学而时习之: "Android之Windows下生成动态库so并打包到APK中", 《HTTPS://WWW.CNBLOGS.COM/SPARKLEDAI/P/7605017.HTML》 * |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108121563A (zh) * | 2017-11-10 | 2018-06-05 | 广州阿里巴巴文学信息技术有限公司 | 应用功能定制方法、装置、计算设备以及存储介质 |
CN108121563B (zh) * | 2017-11-10 | 2021-02-05 | 阿里巴巴(中国)有限公司 | 应用功能定制方法、装置、计算设备以及存储介质 |
CN108845841A (zh) * | 2018-06-15 | 2018-11-20 | 广州多益网络股份有限公司 | 改变终端应用行为的方法、装置及终端 |
CN109614254A (zh) * | 2018-12-27 | 2019-04-12 | 迅雷计算机(深圳)有限公司 | 一种Dylib引用删除方法及相关装置 |
CN109934016A (zh) * | 2019-03-07 | 2019-06-25 | 江苏通付盾信息安全技术有限公司 | 应用的签名校验方法、装置及电子设备 |
CN109933350A (zh) * | 2019-03-07 | 2019-06-25 | 江苏通付盾信息安全技术有限公司 | 在应用中嵌入代码的方法、装置及电子设备 |
CN109934016B (zh) * | 2019-03-07 | 2021-11-26 | 江苏通付盾信息安全技术有限公司 | 应用的签名校验方法、装置及电子设备 |
CN110674474A (zh) * | 2019-09-19 | 2020-01-10 | 大唐高鸿信安(浙江)信息科技有限公司 | 一种应用程序的运行控制方法及装置 |
CN110674474B (zh) * | 2019-09-19 | 2021-07-20 | 大唐高鸿信安(浙江)信息科技有限公司 | 一种应用程序的运行控制方法及装置 |
CN117762430A (zh) * | 2024-02-22 | 2024-03-26 | 腾讯科技(深圳)有限公司 | 基于应用程序的处理方法、装置、计算机设备和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107305495A (zh) | 实现软件安装包功能修改的方法及终端 | |
CA1290067C (en) | System for generating program object modules | |
US7032210B2 (en) | Method and system for generating program source code of a computer application from an information model | |
TWI439931B (zh) | 用於增加三角差動效能之目的碼之產生 | |
CN109614165B (zh) | 一种com组件的多版本并行运行方法和装置 | |
CN106843842B (zh) | 一种应用程序配置文件的更新方法及装置 | |
US7506175B2 (en) | File language verification | |
CN111078223B (zh) | 一种应用程序的打包方法及装置 | |
CN106126290A (zh) | 应用程序优化方法、装置及*** | |
US8949821B2 (en) | Cap file for the personalization of a java application | |
CN109800005B (zh) | 一种客户端热更新方法及装置 | |
CN106775781B (zh) | 减小应用安装包的方法、装置及电子设备 | |
WO2021174860A1 (zh) | 一种基于特殊编码的多固件分布式板卡的批量升级方法 | |
CN100585561C (zh) | 在嵌入式***剪裁可重定位的elf文件的方法 | |
CN111209001A (zh) | 批量生成安卓各渠道apk的方法、***、设备和介质 | |
CN108536489A (zh) | 匹配资源环境的方法、装置和计算机可读存储介质 | |
CN114706564A (zh) | 软件包制作方法、装置、电子设备及存储介质 | |
US9934017B2 (en) | Method and a system for merging several binary executables | |
CN109840116A (zh) | 一种加载资源文件的方法和装置 | |
WO2021151347A1 (zh) | 基于iOS应用的加固方法、装置、设备及存储介质 | |
US20130042225A1 (en) | Object Linking Based On A Determined Linker Order | |
CN111880800B (zh) | 应用下载方法与应用下载*** | |
CN107402885A (zh) | 一种程序调试方法及装置 | |
CN108614714A (zh) | 一种动态库更新方法、装置及存储介质 | |
JP2005055951A (ja) | プログラム生成装置およびプログラム生成方法およびプログラムおよび記録媒体 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20171031 |