一种基于smali代码混淆的Android应用保护方法

文档序号:10594442阅读:601来源:国知局
一种基于smali代码混淆的Android应用保护方法
【专利摘要】本发明公开了一种基于smali代码混淆的Android应用保护方法,针对Android中间语言smali进行混淆保护,不需要修改Android源码,不仅可以抵抗静态分析,而且反汇编之后的代码不正确,从而增加动态分析的难度。
【专利说明】
一种基于sma I i代码混清的Andro i d应用保护方法
技术领域
[0001 ] 本发明属于Android应用程序保护安全领域,涉及一种基于smal i代码混淆的Andr ο i d应用保护方法。
【背景技术】
[0002]NetMarketShare数据网站刚刚公布了 2015年9月份智能手机操作系统的市场份额排名,Android继续保持领先,市场份额为82.8%。但是同时根据“天下无贼”信息诈骗联盟的报告指出:2015年下半年至今,仿冒支付类APP诈骗案件猖獗。该类APP伪装成支付软件,通过后台拦截验证码获取私密信息,“敲诈”、盗刷用户资金。开发商的知识产权和用户隐私都遭受严重的威胁,这一问题产生最主要的原因就是Android apk很容易通过逆向工程进行反编译,从而使其代码逻辑完全暴露给攻击者,使apk面临破解,软件逻辑修改,插入恶意代码,替换广告商ID等风险。
[0003]为了分析任何软件或者理解可执行文件,首先要做的就是逆向工作,针对逆向工程的保护比较有效的方法是代码混淆。代码混淆是一种用来隐藏程序意图的技术,可以增加代码阅读的难度,就是通过选择复杂、模糊但相等的语义去表示原程序,这样就隐藏了原程序的真实语义,软件的行为并没有被改变,使攻击者难以全面掌握app内部实现逻辑,从而增加逆向工程和破解的难度,防止知识产权被窃取。
[0004]目前对于Android应用混淆工作面临很大的挑战。已有的混淆方法主要有两个方面:一是信息的隐藏;它们隐藏meta信息,例如标识符和字符串或者对于控制流进行混淆。但是一个攻击者如果具有动态分析的能力,应用程序运行时所有的字节码还是在内存中的,很容易被dump下来,然后逆向还原,因此现有混淆方法不能抵抗动态分析。二是针对Java源码混淆,例如现存的混淆工具Apkprotect、Proguard等,还有现有文献中利用控制流平展和插入不透明谓词方法进行代码混淆,但一般Android应用程序开发商不太会给应用的源代码,只是给一个.apk文件,因此这种方法有很大的局限性,不适合所有的应用。

【发明内容】

[0005]针对上述现有技术中存在的问题或缺陷,本发明的目的在于,提供一种基于smali代码混淆的Android应用保护方法,能够抵抗静态和动态的分析。
[0006]一种基于smali代码混淆的Android应用保护方法,包括以下步骤:
[0007 ] 步骤I,反编译待保护的应用UnPro tec t.apk,得到sma I i文件,针对sma I i文件中的指令进行混淆,得到混淆后的smali文件,对混淆后的smali文件重新编译形成可执行文件classesl.dex;
[0008]步骤2,在可执行文件classesl.dex中,提取被混淆的指令所在方法中的所有字节码,并将所有字节码存储在存储结构newcode中,将可执行文件classesl.dex中被混淆的指令所在方法中的所有字节码用O填充,形成一个新的可执行文件classes2.dex ;
[0009]步骤3,利用动态加载技术加载可执行文件classes2.dex,从Android系统中的DexFi Ie系统类中获取可执行文件classes2.dex的加载地址,根据加载地址,解析可执行文件classes2.dex获取被混淆的指令所在方法的内存地址,然后将存储在存储结构newcode中的字节码填充到内存地址的空间中;形成一个保护后的应用Protected.apk。
[0010]具体地,所述步骤I中的smali文件中的指令,指的是smali文件中,将两个数值型变量存储在两个相邻的寄存器中的两条指令,以及关键函数调用指令。
[0011]具体地,所述步骤I中,针对smali文件中的指令进行混淆的方法包括:
[0012]将两个数值型变量存储在两个相邻的寄存器中的指令进行混淆的方法为:将存储在两个相邻的寄存器中的两个32位的数值型变量存储成一个64位的数值型变量;
[0013]对关键函数调用指令进行混淆的方法为:在关键函数调用指令和其下一条指令之间插入不透明谓词。
[0014]与现有技术相比,本发明具有以下技术效果:本发明的方法针对Android中间语言smal i进行混淆保护,不需要修改Andro id源码,不仅可以抵抗静态分析,而且反汇编之后的代码不正确,从而增加动态分析的难度。
[0015]下面结合附图和【具体实施方式】对本发明的方法做进一步详细地解释和说明。
【附图说明】
[0016]图1为本发明的方法流程图;
[0017]图2为Android虚拟机执行流程;
[0018]图3为经过混淆之后的可执行文件经过反汇编工具反汇编之后的代码和原来的Ja va源码的对比结果;
[0019]图4是存储结构newcode的示意图。
【具体实施方式】
[0020]遵从上述技术方案,参加图1,本发明的基于smali代码混淆的Android应用保护方法,包括以下步骤:
[0021 ] 步骤I,反编译待保护的应用UnProtect.apk,得到smali文件,针对smali文件中的指令进行混淆,得到混淆后的smali文件,对混淆后的smali文件重新编译形成可执行文件classesl.dex0
[0022]所述smali文件中的指令指的是:smali文件中,将两个数值型变量存储在两个相邻的寄存器中的两条指令,以及关键函数调用指令;
[0023]对上述将两个数值型变量存储在两个相邻的寄存器中的两条指令进行混淆的方法为:将存储在两个相邻的寄存器中的两个32位的数值型变量存储成一个64位的数值型变量;例如:
[0024]将const-1ntv0,0x2和const-1nt vl,0x3
[0025]存储成const-widev0,0x0000000300000002L
[0026]经过上述对数值型变量进行混淆后,当反汇编工具在反汇编时会将两个数值型变量反汇编成一个数值型变量,即出现错误的汇编结果。图3为经过混淆之后的可执行文件经过反汇编工具dexto jar和jeb反汇编之后的代码和原来的Java源码的对比结果。
[0027]对上述关键函数调用指令进行混淆的方法为:关键函数调用指令用来调用子函数,当子函数调用完成后,下一条执行的指令是将子函数的返回值存储到寄存器中,在关键函数调用指令和其下一条指令之间插入不透明谓词。当反汇编引擎进行反汇编时就有可能不会取得正确的返回值。
[0028]步骤2,在可执行文件classesl.dex中,提取被混淆的指令所在方法中的所有字节码,并将所有字节码存储在存储结构newcode中,存储结构newcode如图4所示,将可执行文件classes 1.dex中被混淆的指令所在方法中的所有字节码用O填充,将可执行文件newl.apk重新打包成新的可执行文件classes2.dex,以防止静态分析。
[0029]步骤3,利用动态加载技术加载可执行文件classes2.dex,从Android系统中的DexFi Ie系统类中获取可执行文件classes2.dex的加载地址,根据加载地址,解析可执行文件classed.dex获取被混淆的指令所在方法的内存地址,此内存地址即为存储字节码的地址,然后将存储在存储结构newcode中的字节码填充到内存地址的空间中;得到保护后的应用Protected.apk。
[0030]其中,利用动态加载技术加载可执行文件classes2.dex,需要先建立一个新的应用,当执行完步骤3后,此新的应用就形成一个保护后的应用Protected.apk。
[0031 ]本发明步骤2中得到的可执行文件文件c I a s s e s 2.d e X无法通过图2中的dvmVerifyCodeFlowO函数对于指令合法性的验证,因此本发明采用步骤3的加载过程得到的应用Protected, apk就能够通过dvmVer if yCodeFlow()函数对于指令合法性的验证。
[0032]本发明根据Android系统对于可执行文件加载和运行时的特点,提出一种基于smali代码混淆的Android应用保护方法,可以有效的抵抗静态分析和动态分析。即使攻击者在程序执行时动态dump到可执行文件,但是他们对可执行文件进行反汇编之后的代码也是错误的,这样就会影响攻击者对于程序逻辑的理解。
【主权项】
1.一种基于smali代码混淆的Android应用保护方法,其特征在于,包括以下步骤: 步骤I,反编译待保护的应用UnProtect.apk,得到smal i文件,针对smal i文件中的指令进行混淆,得到混淆后的smali文件,对混淆后的smali文件重新编译形成可执行文件classesl.dex; 步骤2,在可执行文件classesl.dex中,提取被混淆的指令所在方法中的所有字节码,并将所有字节码存储在存储结构newcode中,将可执行文件classes 1.dex中被混淆的指令所在方法中的所有字节码用O填充,形成一个新的可执行文件classes2.dex ; 步骤3,利用动态加载技术加载可执行文件classes2.dex,从Android系统中的DexFi Ie系统类中获取可执行文件classes2.dex的加载地址,根据加载地址,解析可执行文件classes2.dex获取被混淆的指令所在方法的内存地址,然后将存储在存储结构newcode中的字节码填充到内存地址的空间中;形成一个保护后的应用Protected.apk。2.如权利要求1所述的基于smali代码混淆的Android应用保护方法,其特征在于,所述步骤I中的smali文件中的指令,指的是smali文件中,将两个数值型变量存储在两个相邻的寄存器中的两条指令,以及关键函数调用指令。3.如权利要求2所述的基于smali代码混淆的Android应用保护方法,其特征在于,所述步骤I中,针对smaI i文件中的指令进行混淆的方法包括: 将两个数值型变量存储在两个相邻的寄存器中的指令进行混淆的方法为:将存储在两个相邻的寄存器中的两个32位的数值型变量存储成一个64位的数值型变量; 对关键函数调用指令进行混淆的方法为:在关键函数调用指令和其下一条指令之间插入不透明谓词。
【文档编号】G06F21/14GK105956425SQ201610279693
【公开日】2016年9月21日
【申请日】2016年4月28日
【发明人】房鼎益, 刘方圆, 汤战勇, 陈晓江, 赵贝贝, 李政桥, 龚晓庆, 刑天璋, 陈 峰
【申请人】西北大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1