一种基于SO文件的APK加固方法及装置与流程

文档序号:11407926阅读:253来源:国知局
本申请涉及信息安全
技术领域
:,尤其涉及一种基于so文件的apk加固方法及装置。
背景技术
::随着安卓操作系统(android)的快速发展,在安卓电子设备上的第三方应用(application,app)也越来越多,比如安卓手机上的app数量逐年增加。但是由于安卓操作系统自身开源的特点,也产生了众多的软件逆向工具,通过这些软件逆向工具能够对app的安装文件,即apk(androidpackage,安卓压缩包)进行逆向分析,从而对app的开发者和使用者造成危害。因此,如何对apk进行加固从而防止逆向分析,是本申请实施例所需要解决的技术问题。技术实现要素:本申请实施例提供一种基于so文件的apk加固方法及装置,能够用于对apk进行加固,从而防止逆向分析。本申请实施例提供了一种基于so文件的apk加固方法,该方法包括:将apk中so文件加载至内存,其中所述so文件中包括用于确定目标函数代码的内存地址的寻址信息;监控所述目标函数的执行状态;当监控到所述目标函数执行结束时,从内存中清除所述寻址信息。优选地,所述so文件中还包括所述目标函数的代码;当监控到所述目标函数执行结束时,所述方法还包括:从内存中清除所述目标函数的代码。优选地,所述目标函数的代码具体为所述目标函数加密后的代码;所述so文件中还包括用于解密所述目标函数加密后的代码的解密密钥。优选地,在将apk中so文件加载至内存之前,所述方法还包括:将所述寻址信息保存于elf格式的so文件的dynsym或dynstrsection中;根据所述elf格式的so文件生成所述apk。优选地,所述寻址信息具体包括偏移地址信息。本申请实施例提供了一种基于so文件的apk加固装置,该装置包括:加载单元、监控单元以及清除单元,其中:所述加载单元,用于将apk中so文件加载至内存,其中所述so文件中包括用于确定目标函数代码的内存地址的寻址信息;所述监控单元,用于监控所述目标函数的执行状态;所述清除单元,用于当监控到所述目标函数执行结束时,从内存中清除所述寻址信息。优选地,所述so文件中还包括所述目标函数的代码;所述清除单元还用于从内存中清除所述目标函数的代码。优选地,所述目标函数的代码具体为所述目标函数加密后的代码;所述so文件中还包括用于解密所述目标函数加密后的代码的解密密钥。优选地,在所述加载单元之前,所述装置还包括生成单元,用于将所述寻址信息保存于elf格式的so文件的dynsym或dynstrsection中,根据所述elf格式的so文件生成所述apk。优选地,所述寻址信息具体包括偏移地址信息。本申请实施例采用的上述至少一个技术方案能够达到以下有益效果:采用本申请实施例所提供的基于so文件的apk加固方法,将apk中的so文件加载至内存,由于该so文件中包括用于确定目标函数代码的内存地址的寻址信息,并在目标函数执行结束之后,可以通过将该寻址信息从内存中清除,来防止非法逆向分析者获取目标函数的代码,从而增加了非法获取该目标函数的代码的难度,对apk进行了加固。附图说明此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:图1为本申请实施例提供的,基于so文件的apk加固方法的具体实现流程示意图;图2为本申请实施例提供的,apk安装方法的具体实现流程示意图;图3为本申请实施例提供的,基于so文件的apk加固装置的具体结构示意图。具体实施方式为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。以下结合附图,详细说明本申请各实施例提供的技术方案。在apk中通常会包括so(shareobject,共享对象)文件,由于so文件采用二进制,没有额外的解释编译过程,在运行时速度更快。因此在app开发过程中,通常会将apk中的部分核心代码放到so文件中,从而加快apk的安装速度。本申请通过apk中的so文件来对该apk进行加固。本申请实施例提供了一种基于so文件的apk加固方法。该方法的具体流程示意图如图1所示,包括下述步骤:步骤s11:将apk中的so文件加载至内存。这里的so文件位于所加固的apk中。apk中通常会包括classes.dex(dex文件)、so文件、androidmanifest.xml(xml文件)等,其中so文件采用c++/c语言编辑。在该so文件中包括用于确定目标函数代码的内存地址的寻址信息,这里的目标函数通常是需要进行保护的函数,比如正常运行该apk所需要的资源函数,或者apk核心功能模块的函数等;在实际应用中目标函数可以是一个或多个需要进行保护的函数。在执行目标函数的过程中,为了确保能够正确对目标函数的代码进行寻址,通常需要将相应的寻址信息存储在apk中。但apk中有诸如dex文件、so文件、xml文件等多个文件,其中,so文件之外的文件一般通过java语言编辑,而so文件通过c++/c语言编辑;因此如果将寻址信息保存在apk的so文件之外的文件中,非法逆向分析者能够通过逆向分析工具对apk的各个文件进行逆向分析,从而得到相应的smali代码,并对smali代码进行分析最终获取寻址信息,从而能够对目标函数的代码进行寻址和分析,影响apk的安全;而如果将寻址信息保存在apk的so文件中,逆向分析工具对c++/c语言所编辑的代码进行逆向分析的难度较大,并且最终也只能得到汇编语言的代码,而相对于smali代码,对汇编语言的代码进行分析的难度较大,因此并不易于so文件进行逆向分析来获取其中的寻址信息。在手机、平板电脑等电子设备上安装第三方应用时,用户可以通过触控对应的apk,使得电子设备的安卓操作系统接收到安装请求,运行安装该apk从而实现第三方应用的安装。在运行安装apk时,需要将apk中的classes.dex、so文件等至内存中。在实际应用中,将包括寻址信息的so文件加载至内存后,在apk的安装过程中,可以通过该寻址信息对目标函数的代码进行寻址,从而执行该目标函数。通常该寻址信息可以是偏移地址信息,该偏移地址信息可以用于确定目标函数代码在内存中的地址。步骤s12:监控所述目标函数的执行状态。通常目标函数的执行状态可以包括未执行、执行中以及执行结束等。安卓操作系统能够提供相应的api(applicationprogramminginterface,应用程序编程接口),可以编辑相应的监控程序,通过这些api对某个函数或者某些函数的执行状态进行监控。因此,可以编辑针对目标函数的监控程序,通过安卓操作系统提供的api来实现对目标函数执行状态的监控。另外,对目标函数的执行状态进行监控,可以是实时监控目标函数的执行状态,也可以是每隔一个时间周期(比如1分钟,也可以为其它)获取目标函数的执行状态,也可以是其它的监控方式。对于实时监控的方式通常能够及时获知目标函数的执行状态,但所消耗的计算资源较大;对于周期性获取目标函数的执行状态的监控方式,所消耗的计算资源相对较少,但实时性较差;因此在应用过程中,可以根据电子设备cpu的运算能力、对实时性的需求等选择具体的监控方式,这里就不再一一赘述。步骤s13:当监控到所述目标函数执行结束时,从内存中清除所述寻址信息。当目标函数执行结束之后,可以通过删除内存中的该寻址信息,来防止非法逆向分析者通过内存dump等方式获取该寻址信息。这样在apk的安装过程中,既能保证目标函数的正常执行,也由于寻址信息的清除,增加了非法逆向分析者获取寻址信息的难度,从而能够在apk的安装过程中对其进行加固。采用本申请实施例所提供的基于so文件的apk加固方法,将apk中的so文件加载至内存,由于该so文件中包括用于确定目标函数代码的内存地址的寻址信息,并在目标函数执行结束之后,可以通过将该寻址信息从内存中清除,来防止非法逆向分析者通过该寻址信息获取目标函数的代码,从而在apk的安装过程中,增加了非法逆向分析者获取目标函数的代码的难度,对apk进行了加固。通常为了进一步对apk进行加固,可以将目标函数的代码也保存在so文件中,此时,加载在内存中的so文件中包括目标函数的代码以及寻址信息。由于so文件采用c++/c语言进行编辑,不利于非法逆向分析者进行逆向分析,因此将目标函数的代码也保存在so文件中可以进一步加固apk。当然,将目标函数的代码保存在so文件中,当监控到目标函数执行结束时,还可以从内存中清除目标函数的代码。在用户触控apk的文件进行apk安装的过程中,安卓操作系统通常会先将apk中的classes.dex拷贝至系统文件夹/data/dalvik-cache的目录之下,然后在系统文件夹/data/data/的目录下创建app文件夹(可以以apk的名称命名该文件夹),并在该文件夹中存放从apk中解压出的相关数据,如数据库、xml文件、cache以及so文件等。在解压过程中,会先将so文件加载到内存,然后将内存中的so文件进行拷贝至app文件夹。但是在实际应用中,对于非法进行逆向分析者,也可以从内存中拷贝该so文件(称之为内存dump)的代码,从而进行逆向分析。因此,可以通过将apk部分核心代码中的函数分别作为目标函数,并将目标函数的代码保存在so文件中,通过对目标函数执行状态进行监控,当目标函数执行结束之后,将该目标函数的代码也从内存中清除,这样可以有效防止非法逆向分析者从内存中拷贝该目标函数的代码。特别是当需要保护的函数数量较多时,可以分别将这些函数作为目标函数,并在这些函数先后执行的过程中,依次从内存中将函数的代码进行清除,从而使得非法逆向分析者更加难以从内存中获取完整的so文件的代码,从而难以对apk进行逆向分析,实现了对apk的加固。通常为了进一步加固apk,在将apk中的so文件加载至内存之前,其中该so文件中包括目标函数的代码以及寻址信息,还可以将该so文件中的目标函数的代码,通过对称加密算法进行加密得到加密后的代码,在将该so文件加载至内存之后,在执行该目标函数时,需要通过该对称加密算法的逆算法结合解密密钥,对已加载在内存中的目标函数加密后的代码进行解密,从而获取目标函数加密前的代码,通过该加密前的代码来执行目标函数。这种先对目标函数的代码进行加密,并在需要执行该目标函数时,才进行解密并获取加密前的代码的方式,能够进一步防止非法逆向分析者的逆向分析,从而进一步加固apk。当然,为了便于目标函数的执行,通常可以将解密密钥也保存在so文件中,此时加载在内存中的so文件也包括解密密钥。另外,上述的对称加密算法可以是如下任意一种或多种对称加密算法:des(dataencryptionstandard)加密算法、3des(tripledes)加密算法、rc2加密算法、rc4加密算法、rc5加密算法或blowfish加密算法,当然,也可以是其它的对称加密算法。上述是对本申请实施例所提供的方法的具体说明,为了便于理解,下面可以结合apk的安装过程对该方法进一步说明。其中,apk的安装过程如图2所示,具体步骤如下:步骤s21:接收apk安装请求。该安装请求用于请求安卓操作系统运行并安装apk,从而最终安装于该apk相对应的app。比如,用户触控手机“qq”所对应的apk之后,手机上的安卓操作系统会接收到该apk的安装请求,运行该apk从而最终实现手机“qq”的安装。步骤s22:将apk中的so文件加载至内存,其中该so文件中包括目标函数已加密的代码、解密密钥以及寻址信息。需要说明的是,so文件通常为elf(executableandlinkingformat)格式的文件,该elf格式的so文件可以由以下4部分组成:分别是elf头(elfheader)、程序头表(programheadertable)、节(section)和节头表(sectionheadertable);其中,section是在elf文件里头,用以装载内容数据的最小容器。在elf格式的so文件里,每一个sections内都装载了性质属性都一样的内容,比方:textsection里装载了可执行代码;datasection里面装载了被初始化的数据;bsssection里面装载了未被初始化的数据;dynsym或者.dynsymsection里面装载了符号信息;.strtab或者.dynstrsection里面装载了字符串信息;其他还有为满足不同目的所设置的section,比方满足调试的目的、满足动态链接与加载的目的等等。因此根据需要可以分别将目标函数已加密的代码、解密密钥以及寻址信息保存在elf格式的so文件的不同字段,比如通常可以将寻址信息保存在elf格式的so文件的dynsym或dynstrsection中,并将解密密码保存在so文件datasection数据段中。将寻址信息保存在elf格式的so文件的dynsym或dynstrsection中,可以通过so文件中的寻址信息确定程序内部实现逻辑,当清除寻址信息时,可以隐藏代码逻辑关系,从而阻止程序被逆向分析。步骤s23:当接收到执行所述目标函数的指令时,获取so文件中的解密密钥,并通过解密密钥对内存中的已加密的代码进行解密。步骤s24:根据解密后的代码执行该目标函数,用于安装所述apk。在安装apk的过程中,函数之间通常会出现互相调用的情况,当某个函数需要调用目标函数时,可以发出执行目标函数的指令(对该目标函数的调用指令),从而执行该目标函数。安卓操作系统在接收到该指令之后,可以根据该指令从so文件中获取解密密钥,从而通过该解密密钥对已加密的代码进行解密得到解密后的代码,即目标函数加密前的原始代码。安卓操作系统在得到解密后的代码之后,可以根据该解密后的代码执行目标函数,从而进行相应的apk的安装。步骤s25:对目标函数的执行状态进行监控。步骤s26:当监控到目标函数执行结束时,从内存中清除该寻址信息。当然,也可以同时删除解密密钥以及目标函数加密后的代码,这样可以进一步防止通过内存dump等方式进行逆向分析。相应的,在步骤s23中提到的通过该解密密钥对已加密的代码进行解密可以是,通过该对称加密算法的逆算法以及该解密密钥,对已通过对该称加密算法进行加密的代码进行解密。通常可以先生成apk,然后对apk进行安装。因此在用户触控apk,从而使得电子设备的安卓操作系统接收安装请求之前,还可以包括如何生成apk的过程。该生成apk的过程可以包括,将用于确定目标函数代码的内存地址的寻址信息,保存于elf格式的so文件的dynsym或dynstrsection中,然后根据所述elf格式的so文件生成所述apk。通常根据so文件生成apk时,可以先该so文件通过androidndk进行处理,然后将生成apk所需要的全部文件(包括该so文件、dex文件等)进行组包生成apk。基于与本申请实施例所提供的基于so文件的apk加固方法相同的发明构思,本申请实施例还提供了一种基于so文件的apk加固装置。如图3所示,该装置30包括:加载单元301、监控单元302以及清除单元303,其中:所述加载单元301,用于将apk中so文件加载至内存,其中所述so文件中包括用于确定目标函数代码的内存地址的寻址信息;所述监控单元302,用于监控所述目标函数的执行状态;所述清除单元303,用于当监控到所述目标函数执行结束时,从内存中清除所述寻址信息。采用本申请实施例所提供的装置30,由于该装置30采用与本申请实施例速提供的,基于so文件的apk加固方法相同的发明构思,因此也能够解决现有技术中的问题,这里对此就不在一一赘述。另外,在实际应用中,加载单元301加载到内存中的so文件还包括目标函数的代码;所述清除单元303还可以用于从内存中清除所述目标函数的代码。其中目标函数的代码可以是目标函数加密后的代码,比如,将原代码通过对称加密算法进行加密后得到的代码,此时so文件中还可以包括用于解密该目标函数加密后的代码的解密密钥。在该装置30的加载单元301之前,该装置30还可以包括生成单元304,用于将寻址信息保存于elf格式的so文件的dynsym或dynstrsection中,根据所述elf格式的so文件生成所述apk。上述的寻址信息可以具体包括偏移地址信息。本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1