一种基于Proguard软件的移动互联网App代码混淆测评方法与流程

文档序号:11407992阅读:273来源:国知局
一种基于Proguard软件的移动互联网App代码混淆测评方法与流程

本发明涉及移动互联网app代码混淆测评领域,特别是涉及一种基于proguard软件的移动互联网app代码混淆测评方法。



背景技术:

随着移动互联网和移动智能终端的普及和快速发展,移动应用程序的数量呈爆发式增长,其中android平台智能终端及其应用占据市场主导地位。然而,面对日益增长的应用市场,app被盗版后加入恶意代码的情况越来越严重,部分破坏者利用这些恶意程序收集用户隐私、篡改数据,给用户带来巨大的经济利益损失及安全威胁。对开发者来说,盗版app不仅影响正版app的下载量,破坏其口碑,还会带来一定的经济损失。针对移动应用程序的代码保护及知识产权保护亟待加强。

根据国家互联网应急中心(简称cncert)发布的《2015年我国互联网网络安全态势综述》报告显示,目前我国移动互联网环境有所恶化,2015年捕获的新增移动互联网恶意程序样本近148万个,较2014年增长了55.3%,主要针对安卓平台。从威胁类型来说,排名前三位的恶意行为分别是恶意扣费类、流氓行为和远程控制类,占比分别为23.6%、22.2%和15.1%。同时,经过连续三年的整治,国内主流应用商店积极落实安全责任,不断完善安全监督、安全审核、社会监督举报、恶意程序下架等制度,使安全情况有所好转,大量移动恶意程序的传播渠道转移到网盘或广告平台等网站。

android应用程序的开发语言是java。由于java源代码经编译后生成的是一种中间代码,它保留了程序大量的信息,反编译后得到的代码基本可以重构程序,使得android应用程序在知识产权保护上面临极大的风险。代码保护技术可以防止应用程序被盗版,保护其知识产权,因此针对android智能终端应用程序的代码保护技术研究就显得更加紧迫和重要。

一般来说,移动智能终端应用程序面对的主要是程序分析及恶意篡改两种窃取知识产权的方式。

程序分析,是指对程序进行分析并从中获取重要信息,包括程序的主要算法和数据结构等。这种方式通过恶意的程序分析方法来得到正版程序中的重要信息,并将其应用到相应的产品中,以实现相同的功能。

恶意篡改是指对应用程序的重要信息进行篡改,侵害用户或开发者的经济利益或声誉,常见的方式有对程序中的加密或付费模块进行恶意篡改。从本质上来说,这种侵犯应用程序知识产权的方式与程序分析的方式是一样的,它们都是以对程序的深度分析作为基础。

为了防止恶意主机对移动应用有目的的篡改,代码混淆技术被提出,其基本做法是使用代码混淆技术对软件的代码进行混淆变换,使混淆变换后的代码的分析难度增加,从而在一定程度上阻止对软件的篡改。代码混淆技术实际上是一种用于对移动代码保护和软件知识产权进行保护的安全技术。在实际应用中,对软件提供绝对的安全保护是不可能,也是没有必要的,只要能使攻击者的攻击付出较高的代价,就可以认为混淆技术达到了安全保护的作用。因此,代码混淆技术就成为容易实现的保护安卓app有效保护技术。



技术实现要素:

为了解决上述存在的问题,本发明提供一种基于proguard软件的移动互联网app代码混淆测评方法,可以防止恶意主机对移动app有目的的篡改,使用代码混淆软件对移动app的源代码进行混淆变换,使混淆变换后的代码的分析难度增加,从而在一定程度上阻止对移动app的篡改。按照本发明公开的测评方法可以开展相关混淆工作分析,有效地评估经过proguard软件混淆后的代码安全防护效果,为达此目的,本发明提供一种基于proguard软件的移动互联网app代码混淆测评方法,具体测评方法步骤如下:

1)在集成了proguard的android的编译环境中,启用proguard让它跟随ant或eclipse编译时一起运行,在<project_root>/default.properties文件中设置proguard.config属性,路径可以是绝对路径或是工程根目录的相对路径,若把proguard.cfg文件放在默认的位置即工程的根目录,可以这样指定它的位置:proguard.config=proguard.cfg;或者把该文件移到任何位置,然后指定绝对路径:proguard.config=/path/to/proguard.cfg;

2)当在release模式下编译程序时,不管是用antrelease还是用eclipse的导出向导,编译系统都会自动检查proguard.config属性是否设置,若已经设置,proguard就会在打包成.apk文件之前,自动处理应用程序的字节码;

3)proguard开始对源代码文件文件中的java代码进行压缩、优化、混淆、预检;

4)proguard运行结束后,会生成一个名为proguard的文件夹,其中有以下文件:dump.txt描述.apk文件中所有类文件间的内部结构;mapping.txt列出了原始的类,方法和字段名与混淆后代码间的映射,当从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码;seeds.txt列出了未被混淆的类和成员;usage.txt列出了从apk文件中删除的代码;

5)分别挑选其中合适的方法来统计各项属性指标值,分析各项属性指标值及其变化,对proguard的代码混淆工作进行评价;

6)基于各项属性指标值统计无法对混淆工具整体混淆效果做出合理评价的结论,还需从混淆工具的功能点出发对代码混淆工具的工作有效性进行评价。

作为本发明进一步改进,步骤五各项属性指标值包括指令执行率、控制流复杂度、指令序列相似度、控制流图相似度。

作为本发明进一步改进,步骤六混淆工具的功能包括标识符重命名、类再封装、过度重载。

本发明公开了一种基于proguard软件的移动互联网app代码混淆测评方法:为了防止恶意主机对移动app有目的的篡改,使用代码混淆软件对移动app的源代码进行混淆变换,使混淆变换后的代码的分析难度增加,从而在一定程度上阻止对移动app的篡改。按照本发明公开的测评方法可以开展相关混淆工作分析,有效地评估经过proguard软件混淆后的代码安全防护效果,其有益效果如下:

1)本发明方法可以开展对经过proguard软件混淆过的移动app代码开展有效性评价;

2)本发明方法可以结合各项属性指标值统计,以及混淆工具的功能点出发对代码混淆工具的工作进行全面评估。

附图说明

图1为hello.apk类结构图;

图2为hello_proguard.apk类结构图;

图3为hello.apk与hello_proguard.apk类结构对比图;、

图4为proguard过度重载效果图。

具体实施方式

下面结合附图与具体实施方式对本发明作进一步详细描述:

本发明提供一种基于proguard软件的移动互联网app代码混淆测评方法,可以防止恶意主机对移动app有目的的篡改,使用代码混淆软件对移动app的源代码进行混淆变换,使混淆变换后的代码的分析难度增加,从而在一定程度上阻止对移动app的篡改。按照本发明公开的测评方法可以开展相关混淆工作分析,有效地评估经过proguard软件混淆后的代码安全防护效果。

作为本发明一种具体实施例,本发明提供一种基于proguard软件的移动互联网app代码混淆测评方法,以源代码文件hello.apk以及经过proguard混淆后的测试文件hello_proguard.apk为例,本发明的具体实施步骤如下:

1)在集成了proguard的android的编译环境中,启用proguard让它跟随ant或eclipse编译时一起运行,在<project_root>/default.properties文件中设置proguard.config属性。路径可以是绝对路径或是工程根目录的相对路径。若把proguard.cfg文件放在默认的位置(工程的根目录),可以这样指定它的位置:proguard.config=proguard.cfg;或者把该文件移到任何位置,然后指定绝对路径:proguard.config=/path/to/proguard.cfg;

2)当在release模式下编译程序时,不管是用antrelease还是用eclipse的导出向导,编译系统都会自动检查proguard.config属性是否设置。若已经设置,proguard就会在打包成.apk文件之前,自动处理应用程序的字节码;

3)proguard开始对hello.apk文件中的java代码进行压缩、优化、混淆、预检;

4)proguard运行结束后,会生成一个名为proguard的文件夹,其中有以下文件:dump.txt描述.apk文件中所有类文件间的内部结构;mapping.txt列出了原始的类,方法和字段名与混淆后代码间的映射,当从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码;seeds.txt列出了未被混淆的类和成员;usage.txt列出了从apk文件中删除的代码。

5)分别挑选其中合适的方法来统计各项属性指标值,如指令执行率、控制流复杂度、指令序列相似度、控制流图相似度等,分析各项属性指标值及其变化,对proguard的代码混淆工作进行评价。

6)基于各项属性指标值统计无法对混淆工具整体混淆效果做出合理评价的结论,还需从混淆工具的功能点出发对代码混淆工具的工作有效性进行评价,proguard在应用于安卓时在代码混淆方面主要有以下功能:标识符重命名、类再封装、过度重载。

本发明评测指标实验如下:

表1是本发明公开的一种基于proguard软件的移动互联网app代码混淆测评方法的属性指标值实验结果。

(1)指令执行率;

对于程序属性指令i,可引入指令执行率刻画其特征。指令执行率(ie):实际执行的汇编指令条数占所有反汇编后生成的汇编指令条数的比重。is表示反汇编后产生的所有指令,即静态分析可获得的所有指令;id表示在动态分析过程中实际执行的指令条数。于是有

ie=id/is(1);

经过对hello.apk反汇编,统计mainactivity类中onclick(view)方法,其中指令数共55条,被执行的指令数为44,由公式(1)可知,混淆前的被执行指令数id=44,总指令数is=55,于是有

ieprior=id/is=44/55=0.80;

故求得混淆前的onclick(view)方法的指令执行率为0.80。

使用proguard对hello项目进行混淆后,查看项目中生成的mapping.txt文件,发现mainactivity类中onclick(view)方法与混淆后项目中cl类onclick(view)对应。再对hello_proguard.apk反汇编,统计到cl类中onclick(view)方法中指令数共52条,其中被执行的指令条数为42,仍由公式(1)可知,混淆后的被执行指令数id=42,总指令数is=52,于是有;

ielater=id/is=44/55=0.81;

故求得其指令执行率为0.81。

(2)控制流复杂度;

控制流循环复杂度记为v(g),计算公式如下:

v(g)=e-n+2(2);

其中,e表示控制流图中边的数量,n表示控制流图中节点的数量。

使用idapro分别对hello.apk和hello_proguard.apk进行反汇编,得到混淆前工程中mainactivity类中onclick(view)方法以及混淆后工程中cl类中onclick(view)方法的控制流图。

经过统计,混淆前控制流图中边的数目为10,节点的数目为8,由公式(2)可知混淆前的边数e=10、节点数目n=8,于是有;

v(g)prior=e-n+2=10-8+2=4;

故可知onclick(view)方法混淆前控制流复杂度为4。混淆后控制流图边的数目为10,节点的数目为为8,由公式(2)可知混淆后的边数e=10、节点数目n=8,于是有;

v(g)later=e-n+2=10-8+2=4;

故可知onclick(view)方法混淆后控制流复杂度仍为4。

(3)指令序列相似度;

指令序列在程序中为一种常见的结构,采用编辑距离比较两个长度不相等的序列,算法的基本思想是将一个串转换成另一个串最少需要进行的操作来表示两者之间的相似度。设两个序列p和q之间的编辑距离为distance(p,q),其为使用插入、删除以及替换等操作将p转换成q所需最少步骤。p和q之间的相似度可以定义为:

sim(p,q)=1-distance(p,q)/max(p|,|q|)(3);

分别对hello.apk和hello_proguard.apk进行反汇编,得到其中mainactivity类中onclick(view)方法及混淆后cl类中onclick(view)方法的指令序列。记mainactivity类中onclick(view)方法的指令序列为p,记混淆后cl类中onclick(view)方法的指令序列为q,经过统计,若要将变成q变得与p完全一样,需要对q使用删除0步、增加7步、替换10步,故可知两个序列p和q之间的编辑距离为distance(p,q)=17,由公式(3)可知p和q之间的相似度sim(p,q)=1-distance(p,q)/max(|p|,|q|)=1-17/55=0.69。

(4)控制流图相似度;

控制流图通常为程序逆向分析的重点对象,通过比较程序代码控制流图的差异性可以定位混淆算法变换代码的位置,而混淆前后代码相似度可以采用图相似度比较方法来计算。令g、g1和g2都是图。如果g1和g2中分别存在一个子图与g同构,则称g为g1和g2的公共子图。若不存在比g节点数目更多的公共子图,则称g为最大公共子图,将其记为g=mcs(g1,g2)。g1和g2的相似度计算为:

sim(g1,g2)=|mcs(g1,g2)|/max(|g1|,|g2|)(4);

由控制流复杂度实验可知,混淆前mainactivity类中onclick(view)方法的控制流图(记为g1)与混淆后cl类中onclick(view)方法的控制流图(记为g2)完全同构,故公共子图g=mcs(g1,g2)=g1=g2,由公式(4)可知g1与g2的相似度;

sim(g1,g2)=|mcs(g1,g2)|/max(|g1|,|g2|)=1。

(5)指标分析;

根据上述几项实验,得到各评价属性指标值及变化如表1所示。

由表可以看出经过proguard混淆的程序指令执行率几乎不变、控制流复杂度没有发生变化、指令序列有一定变化、指令序列相似度降低。

指令序列相似度的降低反映了proguard可以使得混淆后的程序指令发生变化,一定程度上可以起到隐藏原先程序功能的作用;而指令执行率的变化微乎其微,推测由proguard本身压缩、优化功能的作用引起;而与控制流混淆有关难的控制流复杂度却没有丝毫变化,反映proguard确实不具备控制流混淆的能力。综合几项属性指标的变化,几乎没有明显有力的变化,其中变化稍微明显的指令序列相似度也只能在一定程度上反映proguard隐蔽性能力,所以这些属性指标难以准确地反映proguard代码混淆工作的有效性。

究其原因,主要是因为proguard的代码混淆功能针对外形混淆,而上述属性指标并不能绝对有效地反映外形混淆的效果,例如控制流复杂度是针对控制流混淆、不同算法在指令执行率上有可能有全然相反的效果,故上述属性指标难以反映proguard代码混淆工作有效性。另外,如今对代码混淆评估工作的科学性、合理性还有待考究,各项属性指标在针对同一类型问题的不同算法进行评估时效果明显,但对某个特定的混淆工具整体进行评估的科学性还缺乏有力地证明。

本发明功能点实验如下:

图1-4是功能点实验结果图,其中,图1为hello.apk类结构图,图2为hello_proguard.apk类结构图,图3为hello.apk与hello_proguard.apk类结构对比图,图4为proguard过度重载效果图。

从以上属性值计算分析看出当前提出的代码混淆有效性评估指标无法对混淆工具整体混淆效果做出合理评价的结论,故以下试图从混淆工具的功能点出发对代码混淆工具的工作有效性进行评价。proguard在应用于安卓时在代码混淆方面主要有以下功能:标识符重命名、类再封装、过度重载。标识符重命名是指用任意的名字,例如"a"、"b",对项目中有意义的类和方法进行重命名工作;类再封装是指将项目中处于多级目录下的类全部移动到单级目录下,重新封装类的结构;过度重载是指重复使用相同名字来命名不同函数的多个方法。

(1)标识符重命名;

仍以hello.apk和经过proguard混淆后的hello_proguard.apk为例,分别对其进行反编译,直接观察其源代码,对混淆工作进行评价。

hello.apk经过反编译得到类结构图如图1所示,hello_proguard.apk经过反编译得到的类结构图如图2所示。

经过对比两幅图,分析proguard的应用效果,可见proguard有效地对类名、方法名以及变量名进行了重命名,有效地实现了标识符重命名功能。

由混淆后的图片还可以轻易地看出proguard对标识符重命名采用了hash改名和重载归纳。图中类、域以及方法的名字均被修改成了毫不相关的名字,例如类com.example.hello.mainactivity$1的名字被修改成cl,这属于hash改名方法;我们还可以发现混淆后的工程,在a类中存在方法a():boolean、a(fragmentactivity):void和a(stringandroidfiledescriptorandroidprintwriterandroidstring[]):void,这三个方法同名但参数和返回类型不全相同,同名但调用不冲突,将程序中的名字尽可能用相同的来代替这属于重载归纳方法。

(2)类再封装;

对比混淆前后工程类的结构图,对比效果如图3所示。从对比图可以明显观察到混淆前项目com.example.hello包下的person类和com.jw.model包下的date类均被移动单级目录下,打乱了原工程类的结构,避免了攻击者对类结构进行分析,理解开发者编程思路,并进一步获取项目信息,实现了类的再封装。

(3)过度重载;

观察hello_proguard.apk项目中不同方法的结构,如图4所示。可以明显地发现hello_proguard.apk源码中a类和b类中均有名为a的变量以及名为a的方法,即在不同的类中方法和变量被重复使用相同的名字重命名。在不同类中重复使用无意义的名字进行重命名工作,这进一步加大了攻击者阅读代码的难度,实现了过度重载功能。

以上所述,仅是本发明的较佳实施例而已,并非是对本发明作任何其他形式的限制,而依据本发明的技术实质所作的任何修改或等同变化,仍属于本发明所要求保护的范围。

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