一种基于C源代码的混淆的Android应用加固方法与流程

文档序号:12600201阅读:1097来源:国知局
一种基于C源代码的混淆的Android应用加固方法与流程

本发明涉及信息安全技术领域,尤其涉及一种基于C源代码的混淆的Android应用加固方法。



背景技术:

伴随着手机不断的智能化,手机的功能越来越强大,安全威胁也会随之增加,手机支付等付费业务开始普及,这些业务跟经济交易紧密相关,所以对于手机软件的安全性的要求就很高,一些隐秘信息的泄露或者身份的冒充都会带来巨大的经济损失。而对于商用软件开发者的权利也应该进行很好的保护,所以手机软件的安全性就越发重要。

Android作为新兴的操作系统,从07年上市以来就迅速发展,逐渐取代塞班系统,与苹果的IOS形成分庭抗礼之势,然而Android平台下软件保护技术研究尚处于起步阶段,很多传统软件保护技术在该平台下并不适用,代码的开源性又使得开发者中很容易掺杂恶意攻击者,应用软件被破解情况屡见不鲜,恶意吸费软件也是常有发生,这些都极大地损害了广大开发者和使用证的利益,也制约了Android操作系统的健康发展。

随着Android系统的发展,软件应用的增多,手机上出现的恶意行为也越来越多。手机病毒在Android平台上肆意横行的主要原因有:不同于苹果APP Store建立了一套简单清晰的APP收费模式,在国内的Android市场上,应用陷入了免费困境,免费看上去虽好,但是背后确隐藏了许多安全隐患,应用的合法性无法被判断,攻击者很有可能对应用进行了破解,在其中加入了一些获利的恶意行为,然后再通过应用商店论坛等放行进行扩散,而随着手机用户的信息越来越重要,支付、网游、联系人信息等更开始成为不法分子眼中的金钱。

目前,对于Android软件开发人员来说,需要设法防止开发出的软件被他人反编译而被破解,保证软件的核心代码不被他人剽窃,从而最大地保护Android软件开发工程师的利益,同时保证Android应用的安全。

现有的一些Android应用程序加固方法所采用的代码混淆技术大都基于Java源代码进行混淆,而Java代码本身又比较容易被反编译,使得软件保护效果并不太理想。



技术实现要素:

为了克服上述现有技术的不足,本发明提供一种基于C源代码的混淆的Android应用加固方法,利用C源码本身的不易被反编译的特性,首先将程序的重要部分用C语言编写,编译成.so动态链接库文件,然后利用Java语言中的JNI(Java Native Interface,Java本地接口调用)技术调用这个动态链接库;其次,对C源代码进行混淆,从而实现对Android应用的加固。

本发明提供的技术方案是:

一种基于C源代码的混淆的Android应用加固方法,对Android应用程序中的C源代码进行混淆,使得Android应用程序代码得到保护。所述加固方法包括用C语言编写程序关键代码和对C源代码进行混淆,具体包括如下步骤:

A.对C语言编写的重要代码进行混淆,采用控制流压缩技术,执行如下操作:

A1.读取源程序P;

A2.对P进行预处理,分析提取P的函数信息并保存;

A3.以函数为单位,分析提取P的代码块信息并保存;

A4.在保证P逻辑关系的前提下,随机确定部分代码块作为控制块信息并保存;

作为控制块的代码块是随机确定的,可能是条件或循环结构,会作为代码块信息保存,代码块以函数为单位,同时还保存代码块中函数的函数名和起始结束位置;保存的代码块信息用于A5中;

A5.判断控制块的类型,并采用相应的混淆算法,按照A4中确定的顺序对控制块进行混

淆,形成混淆后的程序O(P);

当控制块是if判断结构块时,对判断结构进行混淆,构造case分支。当控制块是while结构块时,提取while判断条件,构造包含if语句的case分支;

A6.将O(P)进行整理:对O(P)插入到指定的位置(A4中保存的函数的位置),并

输出混淆的C源代码;

B.采用NDK(NativeDevelopmentKit)编程的方式,把混淆的C源代码保存在.so动态链接库(.so库)中,然后在Java代码中采用JNI技术调用底层的.so库,执行如下操作:

B1.编写Java代码(java文件),声明本地文件中的函数;

本地文件即为B2中的.c文件,需要在java文件中先声明;

B2新建.c文件,即混淆后的C源代码;

B3.编写JNI入口函数JNI_OnLoad函数,用于加载混淆后的C源代码;

B4.编写项目配置文件Android.mk文件,用于配置项目信息;

B5.编译生成so库;

B6.编译打包应用,得到新的加固的Android应用。

上述基于C源代码的混淆的Android应用加固方法,进一步地,步骤A2中的预处理算法主要是通过对输入的源程序进行解析,为后续的控制流压缩做准备,提取重要的信息,保证控制流正常运行。其中主要包括对函数名、函数的起始地址以及函数的结束地址,为每个函数生成一个for(或者while)循环结构和switch结构,for结构是为了完成switch中各个基本块的循环执行,switch结构控制程序压扁。

上述基于C源代码的混淆的Android应用加固方法,进一步地,步骤A5的控制块压缩部分的算法(混淆算法)重要功能是分析提取代码控制块信息,根据控制块的类型,起始位置以及结束位置来调用不同的不透明谓词混淆方法。

上述基于C源代码的混淆的Android应用加固方法,进一步地,步骤B3中的入口函数是JNI_OnLoad()与JNI_OnUnLoad(),当Dalvik虚拟机执行到System.loadLibraryO函数时,会首先执行C文件中的入口函数,它会告诉Dalvik虚拟机使用哪一个JNI版本,如果动态链接库中没有入口函数,虚拟机会默认使用最老的JNI1.1版本。而且我们也需要在入口函数中进行一些初始化的操作。

与现有技术相比,本发明的有益效果是:

本发明提供一种基于C源代码的混淆的Android应用加固方法,利用C源码本身的不易被反编译的特性,首先将程序的重要部分用C语言编写,编译成.so动态链接库文件,然后利用Java语言中的JNI(Java Native Interface,Java本地接口调用)技术调用这个动态链接库;其次,对C源代码进行混淆,从而实现对Android应用的加固。

本发明方法采用NDK编程的方式,把重要代码保存在C动态链接库中,然后再对C源代码进行混淆,可以增强对软件的保护措施。除此之外,把重要代码写到so库中,还能增加代码的重用性,下次在其他应用中,可以直接引入现成的so库,免去了二次开发的麻烦。

附图说明

图1是本发明提供的C源代码混淆的Android应用加固方法的流程框图。

图2是NDK开发流程图;

首先采用NDK的方式编写C源代码,编译生成.so文件,然后Java代码通过JNI调用的方式调用.so文件中的C源代码,接着利用SDK编译整个项目,打包成.apk文件。

具体实施方式

下面结合附图,通过实施例进一步描述本发明,但不以任何方式限制本发明的范围。

本发明提供一种基于C源代码的混淆的Android应用加固方法,对Android应用程序中的C源代码进行混淆,使得Android应用程序代码得到保护。加固方法包括用C语言编写程序关键代码和对C源代码进行混淆;图1是本发明提供的C源代码混淆的Android应用加固方法的流程框图,具体包括如下步骤:

A.对C语言编写的重要代码进行混淆,采用控制流压缩技术,执行如下操作:

A1.读取源程序P;

A2.对P进行预处理,分析提取P的函数信息并保存;

A3.以函数为单位,分析提取P的代码块信息并保存;

对P以函数为单位进行预处理,分析提取P的函数的代码块信息并保存;

A4.在保证P逻辑关系的前提下,随机确定部分代码块作为控制块信息并保存;

作为控制块的代码块是随机确定的,可能是条件或循环结构,会作为代码块信息保存,代码块以函数为单位,同时还保存代码块中函数的函数名和起始结束位置;保存的代码块信息用于A5中;

A5.判断控制块的类型,并采用相应的混淆算法,按照A4中确定的顺序对控制块进行混

淆,形成混淆后的程序O(P);

当控制块是if判断结构块时,对判断结构进行混淆,构造case分支。当控制块是while结构块时,提取while判断条件,构造包含if语句的case分支;

A6.将O(P)进行整理:对O(P)插入到指定的位置(A4中保存的函数的位置),并

输出混淆的C源代码;

B.采用NDK(NativeDevelopmentKit)编程的方式,把混淆的C源代码保存在.so动态链接库(.so库)中,然后在Java代码中采用JNI技术调用底层的.so库,执行如下操作:

B1.编写Java代码(java文件),声明本地文件中的函数;

本地文件即为B2中的.c文件,需要在java文件中先声明;

B2新建.c文件,即混淆后的C源代码;

B3.编写JNI入口函数JNI_OnLoad函数,用于加载混淆后的C源代码;

B4.编写项目配置文件Android.mk文件,用于配置项目信息;

B5.编译生成so库;

B6.编译打包应用,得到新的加固的Android应用。

其中,对C语言编写的重要代码进行混淆采用控制流压缩技术。NDK开发流程中,控制流压缩算法的代码混淆方法核心主要分为预处理部分和控制块压缩部分,下面针对这两部分进行重点描述。

预处理算法的主要功能是对输入的源代码进行预处理。预处理算法中,Uniqueident_Random()方法用来为混淆后程序生成变量名;预处理的代码如下,其中,→之后是预处理算法的伪代码;“//”后边注释的部分是对预处理算法的具体描述;预处理生成的是源程序的函数信息。具体地,输入:源程序;对算法输入进行分析,保存函数信息在rune_parts数组;开始For循环,对func_parts中的保存的函数进行分析,包括:调用伪别名算法对派遣变量进行加密操作、循环执行控制块混淆控制算法等操作;输出:源程序的函数信息;

以下为控制块压缩部分的算法的代码,输入为混淆前程序的函数信息;分析提取part中的控制块;执行循环:根据不同的控制块类型调用不同谓词插入函数;输出为混淆后的程序代码;

图2是NDK开发流程图。具体地,NDK开发首先采用NDK的方式编写C源代码,编译生成.so文件,然后,Java代码通过JNI调用的方式调用.so文件中的C源代码,接着利用SDK编译整个项目,打包成.apk文件。

以下实施例首先将控制流图中的各个代码块全部放在一个switch语句中,然后再把这个switch语句封装到一个死循环里,变换后的代码和控制流将变成平行的执行流程,由此达到混淆的效果,从而实现Andriod应用加固。

原代码如下:

混淆后的代码如下:

需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1