多ELF文件保护方法及系统技术领域
本发明涉及数据安全领域,具体而言,本发明涉及一种多ELF文件保护
方法及系统。
背景技术
安卓(Android)是一种基于Linux的自由及开放源代码的操作系统,主
要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟
领导及开发。安卓平台发展迅速,已经逐渐成为了移动终端的最普及的操作
系统,尤其是安卓平台已经深入到了各个领域,包括金融设备这种对安全性
要求更高的产品。与其他终端操作系统相比,开放式的安卓系统为应用开发
者提供了更多的功能接口,这些功能接口在提高了系统的可扩展性,但同时
也为恶意软件提供了便利。针对安卓系统的木马等恶意软件可以通过伪装的
方式保存在安卓安装包中,骗取用户安装并授予一定的权限,之后通过滥用
权限在后台执行一些特定行为,包括窃取用户隐私、骗取资费等行为;不仅
如此,对于一些正常的安卓系统应用,也存在通过非法拷贝、逆向工程、反
编译、调试、破解、二次打包、内存截取等手段来威胁安卓系统的安全,不
仅危害了使用者,也给正常应用开发者造成严重的损害。
基于以上问题,现有技术中出现了多种安卓应用的安全加固方法。目前,
对ELF文件(Android平台主要是共享链接库文件,其扩展名为.so,因此也
叫SO文件)的保护,主要通过加壳来进行保护。加壳的程序可以有效阻止对
程序的反汇编分析,以保护软件版权,防止被软件破解。但现在对SO文件的
保护方案,主要针对单个的SO文件进行保护,即对每一个SO文件都加壳一
次。这样就会有很多被加壳的SO文件,比如银行的应用软件lib下会有很多
的SO文件,对其进行保护就会生成很多加壳的SO文件。由于SO文件的数量
较多,势必造成最终应用包的体积较大,很占空间;此外,所有的SO文件没
有任何隐藏,第三方可以很容易实现对其调用,存在安全隐患。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分
地解决上述问题的多ELF文件保护方法和相应的系统。
依据本发明的一个方面,提供了一种多ELF文件的保护方法,该方法包
括:
将多个ELF文件并入一个壳程序文件中;
对所述壳程序文件中的多个ELF文件进行加保护处理;
接收至少一个ELF文件的调用请求,确定所述调用请求所对应的待调用
对象;
根据所确定的待调用对象,在所述壳程序文件处对所述至少一个ELF文
件进行调用。
进一步地,所述将待保护的多个ELF文件并入一个壳程序文件中包括:
将所述多个ELF文件转换成二进制流,写入一个壳程序文件中,所述壳
程序文件中至少包含所述多个ELF文件的头文件信息。
进一步地,所述对所述壳程序文件中的多个ELF文件进行加保护处理包
括:去掉所述多个ELF文件的隐藏信息、对所述多个ELF文件进行分段加密
处理、对所述多个ELF文件进行代码混淆处理、对所述多个ELF文件进行反
调试处理中的至少一种。
进一步地,所述接收至少一个ELF文件的调用请求,确定所述调用请求
所对应的待调用对象包括:
在所述壳程序文件外接收至少一个ELF文件的调用请求,确定所述调用
请求所对应的待调用对象;
所述根据所确定的待调用对象,在所述壳程序文件处对所述至少一个ELF
文件进行调用包括:
在所述壳程序文件处,接收所述待调用对象的确定结果,相应地对所述
至少一个ELF文件进行调用。
更进一步地,在所述壳程序文件外接收至少一个ELF文件的调用请求,
确定所述调用请求所对应的待调用对象包括:
在系统库文件中建立钩子;
利用所述钩子在第三方应用和所述壳程序文件之间接收第三方应用的调
用请求,解析所述调用请求所对应的待调用对象。
根据本发明的另一个方面,提供了一种多ELF文件的保护系统,该系统
包括:
合并写入单元,用于将多个ELF文件并入一个壳程序文件中;
请求对象确定单元,用于接收至少一个ELF文件的调用请求,确定所述
调用请求所对应的待调用对象;
调用单元,用于根据所确定的待调用对象,在所述壳程序文件处对所述
至少一个ELF文件进行调用。
进一步地,所述合并写入单元,用于将所述多个ELF文件转换成二进制
流,写入一个壳程序文件中,所述壳程序文件中至少包含所述多个ELF文件
的头文件信息;
进一步地,所述保护处理单元用于去掉所述多个ELF文件的隐藏信息;
和/或,用于对所述多个ELF文件进行分段加密处理;和/或,用于对所述多
个ELF文件进行代码混淆处理;和/或,用于对所述多个ELF文件进行反调试
处理;
进一步地,所述请求对象确定单元用于在所述壳程序文件外接收至少一
个ELF文件的调用请求,确定所述调用请求所对应的待调用对象;
所述调用单元用于在所述壳程序文件处,接收所述待调用对象的确定结
果,相应地对所述至少一个ELF文件进行调用。
更进一步地,所述请求对象确定单元为系统库文件中建立的钩子,利用
所述钩子在第三方应用和所述壳程序文件之间接收第三方应用的调用请求,
解析所述调用请求所对应的待调用对象。
相比现有技术,本发明的方案具有以下优点:
本发明提供的多ELF文件的保护方法和系统,通过将多个Android动态
链接库(*.so)文件统一加壳保护,这样既实现了目标动态库隐藏的目的,
防止第三方恶意调用,同时也有效降低了目标软件大小。
显然,上述有关本发明优点的描述是概括性的,更多的优点描述将体现
在后续的实施例揭示中,以及,本领域技术人员也可以本发明所揭示的内容
合理地发现本发明的其他诸多优点。
本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的
描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述
中将变得明显和容易理解,其中:
图1为本发明一种多ELF文件保护方法实施例的流程示意图。
图2为现有技术中SO文件正常的加载流程示意图;
图3为现有技术中使用常用的加固方法后的SO文件的加载流程示意图;
图4为基于本发明一种多ELF文件保护方法实施例的SO文件的加载流程
示意图。
图5为本发明一种多ELF文件保护系统实施例的原理示意图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中
自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的
元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而
不能解释为对本发明的限制。
本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式
“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解
的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步
骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、
整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被
“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或
者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无
线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列
出项的全部或任一单元和全部组合。
本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包
括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般
理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该
被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一
样被特定定义,否则不会用理想化或过于正式的含义来解释。
需要指出的是,本发明的技术方案,理念上与操作系统的选型无关,对
于windows、android、IOS等操作系统均适用。但为说明的便利,以下将主
要以Android为例进行说明。
在安卓系统上,一个可以安装、运行的应用,需要打包成安卓安装包,
即APK(Androidapplicationpackagefile)文件格式。(APK文件一般通
过安卓应用市场下载、安装到手机上,也可以通过USB数据线等数据线接口
或无线数据传输的方式从PC安装。安卓安装包其实是ZIP文件格式,但后缀
名被修改成.apk,可以通过Unzip等工具解压看到其内部文件结构。
Android应用通常是用Java语言开发的,它用Android开发工具编译之
后变成了二进制的字节码(bytecode),这些字节码被打包成classes.dex
文件,由Android平台的Dalvik虚拟机来解释执行。为了能够调用Android
系统功能,Android系统提供了一套运行环境(AndroidFramework),Android
应用调用系统各功能都是通过调用AndroidFramework的库来实现的。另一
方面,Android系统也支持应用程序通过JNI或者nativeexecutable直接
运行。此时应用执行的是直接在CPU上运行的二进制机器码,不需要经过虚
拟机解释,可以直接调用Android库如libc、WebKit、SQLite、OpenGL/ES
等来调用系统各功能。如果Android应用要通过JNI或者nativeexecutable
运行,就需要将要执行的代码编译成ELF文件格式。ELF是
ExecutableandLinkableFormat的缩写,是Android/Linux操作系统
中可执行程序、共享库的文件格式。
本申请中,Android平台中ELF文件主要是共享链接库文件,其扩展名
为.so,因此也叫SO文件。SO文件的指令格式是ARM体系结构的ARM指令集
或Thumb指令集。安卓的SO文件主要充当的角色是通过JNI与Java交互,
所以主要是作为一个库存在(也有一些SO是可执行的),然后被Android
Runtime加载,并能被Java层调用。SO文件一般存放在APK的lib目录的
armeabi子文夹下。
图1示出了根据本发明一个实施例的一种多ELF文件的保护方法的流程
示意图。如图1所示,该方法包括:
步骤S110,将多个SO文件并入一个壳程序文件中;
本步骤对待保护的多个SO文件进行统一加壳的过程,即将多个SO文件
写入一个壳程序文件中的指定位置,壳程序文件会先于SO文件运行,取得优
先权,保护SO文件不被非法修改或反编译。
加壳的全称是可执行程序资源的压缩和加密。加壳,其实就是给可执行
文件加上个外衣。用户执行的只是这个外壳程序。当执行这个外壳程序的时
候,它就会在内存中解压或者解密原程序,解压或解密后再把程序的执行权
交还给真正的程序。所以,这些的工作只是在内存中执行的。
现有对SO文件的加壳方法一般是只针对单个SO文件加壳,即一个SO文
件加壳一次,如果SO文件很多,就会进行多次加壳,势必造成最终安装包的
体积很大。在本发明实施例中,通过将lib下的所有SO文件统一并入同一个
壳中,即写入一个壳程序文件中的指定位置。通过检测发现,对所有的SO文
件合并加壳后其所占空间缩小量一般在30%左右,而且SO文件数量越多,文
件越大,其所占空间的缩小量就越大。
步骤S120,对壳程序文件中的多个SO文件进行加保护处理;
主要对统一加壳后的SO文件进一步的加固。
步骤S130,接收至少一个SO文件的调用请求,确定所述调用请求所对
应的待调用对象;
步骤S140,根据所确定的待调用对象,在所述壳程序文件处对所述至少
一个SO文件进行调用。
由于SO文件进行了统一加壳处理,所以当第三方对其进行调用时,要由
所加的壳程序根据调用请求进行相应的加载,即帮助完成所请求的SO文件的
加载。
在本发明的一个实施例中,图1所示的方法中的壳程序文件中包含能够
对加保护处理后的SO文件进行解密处理的代码。在加载运行SO文件时,壳
程序文件会先于SO文件运行,取得优先权,对加保护处理后的SO文件进行
解密处理,使得SO文件的源代码恢复为完整的、代码排序正常的、无加密的、
可完全还原的代码,进而在解壳后可以正常的加载运行。
图1所示的方法,通过将多个SO文件并入一个壳程序文件中,隐藏了
SO的文件名和里面的函数,既实现了目标动态库隐藏的目的,防止第三方恶
意调用,同时也有效降低了目标软件大小。
在本发明的一个实施例中,图1所示方法的步骤110中将多个SO文件并
入一个壳程序文件中包括:
将所述多个SO文件转换成二进制流,写入一个壳程序文件中,所述壳程
序文件中至少包含所述多个SO文件的头文件信息。
在本发明的一个实施例中,图1所示方法的步骤S120中对壳程序文件中
的多个SO文件进行加保护处理可以是如下的一种或多种处理方式:
去掉多个SO文件的隐藏信息;
对多个SO文件进行分段加密处理;
对多个SO文件进行代码混淆处理;
对多个SO文件进行反调试处理。
在上述实施例中,去掉多个SO文件的隐藏信息,会导致SO文件信息缺
失,即使有人对SO文件进行恶意解密或反编译,也无法得到完整的SO文件,
很难做到静态工具分析;
在上述实施例中,对多个SO文件进行分段加密处理可以是:对多个SO
文件的数据节和代码节分别进行加密,增加解密难度。
在上述实施例中,对多个SO文件进行代码混淆处理是不改变代码逻辑的
情况下,在多个SO文件的代码中增加无用代码,或者对多个SO文件的代码
进行重命名,使反编译后的源代码难以看懂,增加反编译后代码分析的难度。
在上述实施例中,对多个SO文件进行反调试是一个重要的保护功能,
其反调试处理可以是:将可用于反调试的点插入到多个SO文件进行代码混淆
后的代码中;代码混淆后,反调试的点就不容易找到,这样能给破解者进行
调试的时候造成很多困扰,增加破解难度。
需要说明的是,对多个SO文件加保护不限于上述处理方式,对于本领域
技术人员已知的任何对SO文件加保护处理方式都可以使用。
在本发明的一个实施例中,步骤130中接收至少一个SO文件的调用请求,
确定所述调用请求所对应的待调用对象包括:
在壳程序文件外接收至少一个SO文件的调用请求,确定所述调用请求所
对应的待调用对象;
所述根据所确定的待调用对象,在壳程序文件处对所述至少一个SO文件
进行调用包括:
在壳程序文件处,接收所述待调用对象的确定结果,相应地对所述至少
一个SO文件进行调用。
在本发明的一个实施例中,壳程序文件外接收至少一个SO文件的调用请
求,确定所述调用请求所对应的待调用对象包括:
在系统库文件中建立钩子;
利用所述钩子在第三方应用和所述壳程序文件之间接收第三方应用的调
用请求,解析所述调用请求所对应的待调用对象。
计算机安全技术中广泛采用Hook(钩子)技术对待监控的应用程序的各种
函数进行挂钩拦截,以便实现对这些应用程序的事件行为的监控,对应不同
事件行为调用不同的钩子函数进行处理,从而实现依据不同的行为做出相应
的安全防护处理。
其中,Hook(钩子)是应用程序在Windows消息处理过程中设置的用来监
控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。如
果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不
起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系
统进行监控。Hook的这个本领,使它能够将自身的代码“融入”被Hook住
的程序的进程中,成为目标进程的一个部分。“钩子”涵盖了用于通过拦截
在软件组件之间传递的函数调用、消息、或事件来改变或增加操作系统、应
用程序、或其他软件组件的行为的技术。而处理这种被拦截的函数调用、事
件或消息的代码就被称为钩子函数。钩子通常用于各种目标,包括对功能进
行调试和对功能进行扩展。其示例可以包括在键盘或鼠标事件传递到应用程
序之前拦截它们,或者拦截系统调用(systemcall)、或者系统函数行为、
函数执行结果等,以监视或修改应用程序或其他组件的功能等等。
基于这一原理,本实施例采用钩子函数,拦截第三方对SO文件的调用函
数,转而调用所加的壳程序,即由所加的外壳程序文件根据SO的文件名完成
实际的SO文件的加载。
由于Android是基于Linux内核的开源系统,根据语言环境不同可以
分为Java层、NativeC层、LinuxKernel层。如图2所示,正常情况下,
第三方调用SO文件,必须通过Java层的LoadLibrary函数根据SO文件名进
行相应的SO文件的加载。具体来说,LoadLibrary会调用libdvm.so里面的
dlopen函数来最终加载SO文件。
现有技术中对SO文件的保护,一般都是针对每个SO文件分别进行加壳。
如图3所示,当第三方调用SO文件时,通过Java层的LoadLibrary函数通
过SO文件名来加载SO文件,由于每个SO文件都进行了加壳保护,所以具体
实现时首先要进入外壳,然后外壳对SO文件进行加载。
在本发明的实施例中,通过对多个SO文件统一进行加壳,通过对系统库
函数(libdvm.so)做了一个Hook(钩子),这样当Java层即APK调用SO时,
会拦截dlopen函数,由所加的壳自己完成加载SO的工作。如图4所示,当
java层调用SO的时候先进入外壳,不管加载哪个SO文件,都是进入统一的
外壳,然后外壳根据SO的名字对相应的SO进行加载。
图5示出了根据本发明一个实施例的一种多ELF文件的保护系统的原理
示意图。如图5所示,系统500包括:
合并写入单元510,用于将多个SO文件并入一个壳程序文件中;
本单元执行对多个SO文件进行统一加壳的过程,即将多个SO文件一并
写入壳程序文件中的指定位置,壳程序文件会先于SO文件运行,取得优先权,
保护SO文件不被非法修改或反编译。
保护处理单元520,用于对壳程序文件中的多个SO文件进行加保护处理。
本单元对加壳后的多个SO文件进一步加固。
请求对象确定单元530,用于接收至少一个SO文件的调用请求,确定所
述调用请求所对应的待调用对象;
调用单元540,用于根据所确定的待调用对象,在所述壳程序文件处对
所述至少一个SO文件进行调用。
本单元主要实现当第三方对SO文件进行调用时,要由所加的壳程序根据
调用请求进行相应的加载,即由所加的壳程序文件帮助完成所请求的SO文件
的加载。
在本发明的一个实施例中,图5所示的合并写入单元510,用于将多个
SO文件转换成二进制流,写入一个壳程序文件中,所述壳程序文件中至少包
含多个SO文件的头文件信息。
在本发明的一个实施例中,图5所示的保护处理单元520用于去掉多个
SO文件的隐藏信息;和/或,用于对多个SO文件进行分段加密处理;和/或,
用于对多个SO文件进行代码混淆处理;和/或,用于对多个SO文件进行反调
试处理。
在上述实施例中,去掉多个SO文件的隐藏信息,会导致SO文件信息缺
失,即使有人对SO文件进行恶意解密或反编译,也无法得到完整的SO文件,
很难做到静态工具分析;
在上述实施例中,对多个SO文件进行分段加密处理可以是:对多个SO
文件的数据节和代码节分别进行加密,增加解密难度。
在上述实施例中,对多个SO文件进行代码混淆处理是不改变代码逻辑的
情况下,在多个SO文件的代码中增加无用代码,或者对多个SO文件的代码
进行重命名,使反编译后的源代码难以看懂,增加反编译后代码分析的难度。
在上述实施例中,对多个SO文件进行反调试是一个重要的保护功能,
图5所示系统的保护处理单元520的反调试处理可以是:将可用于反调试的
点插入到多个SO文件进行代码混淆后的代码中;代码混淆后,反调试的点就
不容易找到,这样能给破解者进行调试的时候造成很多困扰,增加破解难度。
在本发明的一个实施例中,图5所示请求对象确定单元530用于在所述
壳程序文件外接收至少一个SO文件的调用请求,确定所述调用请求所对应的
待调用对象;
所述调用单元540用于在所述壳程序文件处,接收所述待调用对象的确
定结果,相应地对所述至少一个SO文件进行调用。
在本发明的一个实施例中,图5所示的请求对象确定单元为系统库文件
中建立的钩子,利用所述钩子在第三方应用和所述壳程序文件之间接收第三
方应用的调用请求,解析所述调用请求所对应的待调用对象。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普
通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润
饰,这些改进和润饰也应视为本发明的保护范围。