多elf文件保护方法及系统的制作方法_2

文档序号:9844332阅读:来源:国知局
一般通过安卓应用市场下载、安装到手机上,也可以通过USB数据线等数据线接口或无线数据传输的方式从PC安装。安卓安装包其实是ZIP文件格式,但后缀名被修改成.apk,可以通过Unzip等工具解压看到其内部文件结构。
[0044]Android应用通常是用Java语言开发的,它用Android开发工具编译之后变成了二进制的字节码(byte code),这些字节码被打包成classes.dex文件,由Android平台的Dalvik虚拟机来解释执行。为了能够调用Android系统功能,Android系统提供了一套运行环境(Android Framework),Android应用调用系统各功能都是通过调用AndroidFramework的库来实现的。另一方面,Android系统也支持应用程序通过JNI或者nativeexecutable直接运行。此时应用执行的是直接在CPU上运行的二进制机器码,不需要经过虚拟机解释,可以直接调用Android库如libc、WebKit、SQLite、OpenGL/ES等来调用系统各功能。如果Android应用要通过JNI或者native executable运行,就需要将要执行的代码编译成ELF文件格式。ELF是Executable and Linkable Format的缩写,是Android/Linux操作系统中可执行程序、共享库的文件格式。
[0045]本申请中,Android平台中ELF文件主要是共享链接库文件,其扩展名为.so,因此也叫SO文件。SO文件的指令格式是ARM体系结构的ARM指令集或Thumb指令集。安卓的SO文件主要充当的角色是通过JNI与Java交互,所以主要是作为一个库存在(也有一些SO是可执行的),然后被Android Runtime加载,并能被Java层调用。SO文件一般存放在APK的lib目录的armeabi子文夹下。
[0046]图1示出了根据本发明一个实施例的一种多ELF文件的保护方法的流程示意图。如图1所示,该方法包括:
[0047]步骤S110,将多个SO文件并入一个壳程序文件中;
[0048]本步骤对待保护的多个SO文件进行统一加壳的过程,即将多个SO文件写入一个壳程序文件中的指定位置,壳程序文件会先于SO文件运行,取得优先权,保护SO文件不被非法修改或反编译。
[0049]加壳的全称是可执行程序资源的压缩和加密。加壳,其实就是给可执行文件加上个外衣。用户执行的只是这个外壳程序。当执行这个外壳程序的时候,它就会在内存中解压或者解密原程序,解压或解密后再把程序的执行权交还给真正的程序。所以,这些的工作只是在内存中执行的。
[0050]现有对SO文件的加壳方法一般是只针对单个SO文件加壳,即一个SO文件加壳一次,如果SO文件很多,就会进行多次加壳,势必造成最终安装包的体积很大。在本发明实施例中,通过将Iib下的所有SO文件统一并入同一个壳中,即写入一个壳程序文件中的指定位置。通过检测发现,对所有的SO文件合并加壳后其所占空间缩小量一般在30%左右,而且SO文件数量越多,文件越大,其所占空间的缩小量就越大。
[0051 ]步骤SI 20,对壳程序文件中的多个SO文件进行加保护处理;
[0052]主要对统一加壳后的SO文件进一步的加固。
[0053]步骤S130,接收至少一个SO文件的调用请求,确定所述调用请求所对应的待调用对象;
[0054]步骤S140,根据所确定的待调用对象,在所述壳程序文件处对所述至少一个SO文件进行调用。
[0055]由于SO文件进行了统一加壳处理,所以当第三方对其进行调用时,要由所加的壳程序根据调用请求进行相应的加载,即帮助完成所请求的SO文件的加载。
[0056]在本发明的一个实施例中,图1所示的方法中的壳程序文件中包含能够对加保护处理后的SO文件进行解密处理的代码。在加载运行SO文件时,壳程序文件会先于SO文件运行,取得优先权,对加保护处理后的SO文件进行解密处理,使得SO文件的源代码恢复为完整的、代码排序正常的、无加密的、可完全还原的代码,进而在解壳后可以正常的加载运行。
[0057]图1所示的方法,通过将多个SO文件并入一个壳程序文件中,隐藏了SO的文件名和里面的函数,既实现了目标动态库隐藏的目的,防止第三方恶意调用,同时也有效降低了目标软件大小。
[0058]在本发明的一个实施例中,图1所示方法的步骤110中将多个SO文件并入一个壳程序文件中包括:
[0059]将所述多个SO文件转换成二进制流,写入一个壳程序文件中,所述壳程序文件中至少包含所述多个SO文件的头文件信息。
[0060]在本发明的一个实施例中,图1所示方法的步骤SI20中对壳程序文件中的多个SO文件进行加保护处理可以是如下的一种或多种处理方式:
[0061 ]去掉多个SO文件的隐藏信息;
[0062]对多个SO文件进行分段加密处理;
[0063]对多个SO文件进行代码混淆处理;
[0064]对多个SO文件进行反调试处理。
[0065]在上述实施例中,去掉多个SO文件的隐藏信息,会导致SO文件信息缺失,即使有人对SO文件进行恶意解密或反编译,也无法得到完整的SO文件,很难做到静态工具分析;
[0066]在上述实施例中,对多个SO文件进行分段加密处理可以是:对多个SO文件的数据节和代码节分别进行加密,增加解密难度。
[0067]在上述实施例中,对多个SO文件进行代码混淆处理是不改变代码逻辑的情况下,在多个SO文件的代码中增加无用代码,或者对多个SO文件的代码进行重命名,使反编译后的源代码难以看懂,增加反编译后代码分析的难度。
[0068]在上述实施例中,对多个SO文件进行反调试是一个重要的保护功能,其反调试处理可以是:将可用于反调试的点插入到多个SO文件进行代码混淆后的代码中;代码混淆后,反调试的点就不容易找到,这样能给破解者进行调试的时候造成很多困扰,增加破解难度。
[0069]需要说明的是,对多个SO文件加保护不限于上述处理方式,对于本领域技术人员已知的任何对SO文件加保护处理方式都可以使用。
[0070]在本发明的一个实施例中,步骤130中接收至少一个SO文件的调用请求,确定所述调用请求所对应的待调用对象包括:
[0071]在壳程序文件外接收至少一个SO文件的调用请求,确定所述调用请求所对应的待调用对象;
[0072]所述根据所确定的待调用对象,在壳程序文件处对所述至少一个SO文件进行调用包括:
[0073]在壳程序文件处,接收所述待调用对象的确定结果,相应地对所述至少一个SO文件进行调用。
[0074]在本发明的一个实施例中,壳程序文件外接收至少一个SO文件的调用请求,确定所述调用请求所对应的待调用对象包括:
[0075]在系统库文件中建立钩子;
[0076]利用所述钩子在第三方应用和所述壳程序文件之间接收第三方应用的调用请求,解析所述调用请求所对应的待调用对象。
[0077]计算机安全技术中广泛采用Hook(钩子)技术对待监控的应用程序的各种函数进行挂钩拦截,以便实现对这些应用程序的事件行为的监控,对应不同事件行为调用不同的钩子函数进行处理,从而实现依据不同的行为做出相应的安全防护处理。
[0078]其中,Hook(钩子)是应用程序在Windows消息处理过程中设置的用来监控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。Hook的这个本领,使它能够将自身的代码“融入”被Hook住的程序的进程中,成为目标进程的一个部分。“钩子”涵盖了用于通过拦截在软件组件之间传递的函数调用、消息、或事件来改变或增加操作系统、应用程序、或其他软件组件的行为的技术。而处理这种被拦截的函数调用、事件或消息的代码就被称为钩子函数。钩子通常用于各种目标,包括对功能进行调试和对功能进行扩展。其示例可以包括在键盘或鼠标事件传递到应用程序之前拦截它们,或者拦截系统调用(system call)、或者系统函数行为、函数执行结果等,以监视或修改应用程序或其他组件的功能等等。
[0079]基于这一原理,本实施例采用钩子函数,拦截第三方对SO文件的调用函数,转而调用所加的壳程序,即由所加的外壳程序文件根据SO的文件名完成实际的SO文件的加载。
[0080]由于Android是基于Linux内核的开源系统,根据语言环境不同可以分为Java层、N
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1