搜索
您的当前位置:首页正文

安卓APK代码安全保护技术研究

来源:爱够旅游网
笪一 安卓APK代码安全保护技术研究 李胜广 。谭林 。周千里 。 卓件种最从安软 。搬 沈混,珠严上安感 鱼分娃开再 胜人数觉 ,城 的不行议蚪几方普代 全整越心来核 码向越,柳制宁前反手恶瓢意无目析挥发为 不被压着开 运协 的决 及码手仿安目性 。重,醌 膦。鞋 轿 知和 全到  嗜此 重发  方, 种案  护解  保体  安的包代逆  适得 艄  1公安部第一研究所 2北京市公安局 3.警务物联网应用技术公安部重点实验室 摘要 关键词: 友-:(App反编译反逆 代f;f5混淆漏洲捡测APKb 解压后,可以看到解压文件夹,包括多个文件和子文件夹。 一、手机App风险 其中主文件为dex文件,dex是DalvikVM executes的简称, 即Android Dalvik虚拟机的执行程序,并 ̄EJava ME的字节 手机各类恶性应用已成为恶意扣费、诈骗侵财的帮 凶,手机安全严重影响着互联网+生态链的良性发展,严重 码而是Dalvik字节码。Android在运行一个安装包时首先需 要先解压,然后再进行解释运行。 因为所有的Java文件最终会编译进APK文件中去,并 且作为托管代码,虚拟机可以识别,那么反编译工具就可以 仿虚拟机解释原理和机制,实现对dex主文件的反编译过 影响着国家社会安定。2016年9月6日,国务委员、公安部 部长郭声琨在上海调研反电信网络诈骗工作时强调,以更加 q内 州 扎实的措施有效防范、精准打击、坚决遏制电信网络诈骗犯 罪,切实维护人民群众财产安全。 统计机构Statista数据显示,截至201 6年第二季度,安 卓手机的市场占比已经达到了862%。手机恶意应用主要是 骗细。台 及详前平 安卓应用。据36O互联网安全中心报告” ,2016年第二季度 辁等誊 ‰酾姓 锪 滓描第对 .程。安卓APK反编译流程非常简单,比较常用的反编译工 具有:dex2jar、jd-gui、apktool、IDA、Androidfby、 jadx等等。 (一)源码反编译 36O互联网安全中心截获恶意非法应用主要包括恶意程序、 述二 辁了部 钓鱼网站、骚扰电话、垃圾短信、手机诈骗等。其中累计监 宝, 下面以dex2jar为例,说明安卓APKI ̄9反编译过程 ,1.要反编译的MyAPP.apk后缀名改为MyApp zip,并解 压。可以看到解压后的目录下主要有classes.dex、 resources arsc、AndroidManifest.xml等文件和assets、lib、 META—INF和res等目录。其中classesdex是iava文件编译 再通过dxT_具打包而成的 测到移动瑞用户感染恶意程序6180万人次,平均每天恶意 程序感染量达到679万人次,包括资费消耗占比高达 73.5%、恶意扣费侣8%、隐私窃取4.8%、流氓行为 1 6%和远程控制1 2%。另外共收到手机端诈骗案例1876 件.涉案金额达到85O 5万元,人均损失4534元 本文就以安卓手机应用为目标对象进行分析,全面阐 述安卓应用安装包(AndroidPackage,APK)的风险及对 2得到的classes,dex文件放在工具dex2jarI具的文件 夹内。并在命令行下定位到dex2jarbat所在目录,输入 dex2jar.bat classes.dex 、 策,并给出系统性的反逆向工程解决方案。 3.上述目录下会生成一个classes—dex2jar.jar的文件, 二、安卓APK反编译过程 APK文件是安卓应用的安卓包,即把应用源代码和相 然后打开工具jd—gui文件夹里的Jd—gui.exe,用该工具打开 之前生成的classes—dex2jarjar文件,便可以看到源码了, 效果如图1所示。 其他工具的反编译过程如上述过程类似,有些反编译 关库文件的工程进行编译并打包,形成一个安装程序文件, 格式为*.apk。APK文件其实是zip格式,通过UnZip/Winrar Police;'echnology 201 7年第1期55 信息安全 C)dontwarn缺省proguard会检查每一个引用是否正 确。但是第三方库里面往往有些不会用到的类,没有正确引 用。如果不配置的话,系统就会报错。 一dontwamandroid.support. d)一keepclassmembers指定的类成员被保留。 e) 留。 指定的类和类成员被保 3.在工程根目录下的project.properties文件中加上混淆 文件申明,如下: proguard.config=proguard——projcte,txt 4.打签名包测试 (二)花指令 花指令是指程序中有些指令在反编译的时候出错,让 破解者无法清楚正确地反编译出程序的源码。通常做法是在 源码过程中插入各种不会被执行的无效字节码,使逆向分析 工具进行字节码解析时崩溃。比如JD—GUI将iar里面的 class字节码文件转成java文件时。遇到函数中根本走不到 如果APK没有经过安全加固处理,安卓应用软件代码 反编译过程已经完成,代码和相关的资源文件都已经暴露给 攻击者,攻击者在此基础上则可进行深入协议分析或者关键 代码解析,并可以修改其中的代码,达到其盗版或者窃取的 目的。 的分支,就会提示函数错误,可以防止利用jd—gui去查看 APK源码。下列实例在反编译时,同样本文2 1节的方法打 开,会看到提示error错误。但需要提示的是,不是所有的 分支语句都可以让jd—gui提示错误。 void onMyFunc(int state){ 本节将列举对抗反编译的安全措施。 (一)代码混淆 switch() { CaSe: 代码混淆的基本原理是反编译出来的代码难以阅读, 从而达到防止被逆向破解的目的。通常是把原来的类名、方 法名等,用无意义的字符序列来替换,变成类似a、b、c这 样的无命名规则的字符,增加阅读难度。 代码混淆可以利用Android项目中的ProGuard工具, ProGuard包括压缩、优化、混淆和预检四个功能步骤,更多 ProGuard的用法可以参考参考文献[3]。代码混淆的步骤: 1.创建一个proguard—project.txt文件 break: l (三)签名验证 APK的唯一识别是根据包名+签名,包名信息是写死在 AndroidManifest.xml里面的。但是签名则是与APK绑定的。 一旦APK被反编译后签名会自动消失。APK签名就是标明安 装程序包是不是官方正版发行的标记。当某个APK无法覆盖 2.在proguard—projecttxt添加混淆的申明,申明某些 不要混淆的单元 a)申明外包lar包,使其不会被混淆 如:一l_braryjars libs/Mylibs jar 安装。可能就是签名不一致的缘故,此时APK可能已经被破 解并重新打包了。 签名验证的方法目前可以细分为3种: 1.Appl ̄我验证 b)因为有些类经过混淆会导致程序编译不通过,将不 需要混淆的部分申明进来 如系统组件和API的类: 一在App中如采用PackageParser等类获取签名信息, 利用其获取的证书签名进行自我验证。但这种保护方法保 护的意义并不大,因为反编译出源码后通过关键字搜索很 快就能够找到验证的代码块,稍微一修改这验证保护就完 全无效了。 keep public class extends android.app.Fragment keep public class extends android.app.Activity 56『 圈2017 ̄E第1期 2.服务器验证 在安卓App中获取签名信息,上传服务器在服务端进 行签名然后返回验证结果。但这种方法的弊端是需要网络支 撑,并且也需要用App中的Android方法获取的签名信息, 同样破解后全局搜索关键字然后伪造一个正确的签名信息就 可以完美破解了。 3.底层so(Shared Object,共享对象)库文件验证 通过把Context、 Activity、 PackageManager、 Packagelnfo[]个对象中的一个作为参数参入底层,在底层 获取签名信息并验证。因为获取和验证的方法都封闭在更安 全的so库里面(可以参见下一小节),能够起到一定意义 上的保护作用。 (四)so库文件保护 so文件即共享动态链接库。将核心代码使用C/C++编 写然后编译成为.so文件,并且so里面的函数要按JNI的标准 命名,在应用App中调用so里面封装好的函数即可。 这种保护方式使得利用工具进行反编译破解难度加 大,有效地保护核 代码。 编写so文件 可以利用NDK【native development Kit) 原生开发工具包,快速开发C、C++动态库,并能自动将 so文件 ̄!::ljava应用一起打包成apk。 编写so源码时,需要#include<jni.h>。ini h文件定义了 本地的数据类型,本地数据类型对应Iava类型前加上一个 J,如int一>jint、jstring一>java lang.String。本地数据类型是介 于java类型和C++类型的中间类型, 就是java和C++调用 之间的桥梁。 特别需要注意的JNI调用的两点规则: 1.f8va程序只能调用C语言接口,因此接口前要加 上:extern…C’关键字。这是因为NDK主要是配合C语言开 发,但是某些插件生成的是cpp文件,在默认情况下,会使 用C++的编译方式来进行编译,这样导致java调用时无法找 到对应的接口函数。 2函数定义规则:在编写函数时,函数名必须符合规 则,不然JNI调用时无法找到需要的函数。 (五)DEX文件加壳 APKI ̄加壳技术 和pc机下的exe文件的加壳原理一 样,即在程序外面再包裹上另外一段代码,保护里面的代码 不被非法修改或反编译,在程序运行的时候优先取得程序的 控制权。加壳后的APK可以有效阻止对程序的反汇编分析, 也常用来保护软件版权,防止被软件破解。 APK的加壳过程中牵扯到三种程序: 1加壳程序:加密源程序为解壳数据、组装解壳程序 和解壳数据; 2.解壳程序:解密解壳数据,并运行时通过 DexClassLoader动态加载; 3源程序:需要加壳处理的被保护代码.即普通的 APK。 解壳数据可以放在在解壳程序DEX文件头部或者尾 部,这样相对解析文件方便。如解壳数据位于解壳程序文件 尾部,合并后的DEX文件结构如下。 图2 DEX]JI1壳后的文件结构 加壳程序工作流程: 1.加密源程序APK文件为解壳数据; 2把解壳数据写入解壳程序Dex文件末尾,并在文件 尾部添加解壳数据的大小; 3.修改解壳程序DEX头中checksum、signature和 filesize头信息; 4.修改源程序AndroidMainfest xml文件并覆盖解壳程序 AndroidMainfest.xml文件。 保护源代码MvAPP.apk是通过对其进行原始文件数据 的加解密而完成的。如果采用安全级别高的对称加解密或者 非对称密码算法,则对其反编译看到源码是非常困难的。 四、系统APK反逆向解决方案 了解逆向方法之后,如果通过技术人员完成App保 护,要付出大量时间成本和技术成本。在实际工作中,主要 依赖相对成熟的安全保护产品或者工具,进行反逆向系统解 决,第三方加固工具主要包括下列常用这些产品 。 梆梆加固:http://Vwvw.bangcle.corn/ 爱加密:http://Www.ijiami.cn/ 360加固宝:http://jiagu 360 cn/protectjwelcome/ 阿里聚安全:http://jaq.alibaba com/ 腾讯云加固:http://jiagu.qcloud.com/ 下面就以梆梆加固为例,说明APK安全保护的三个步 骤:漏洞检测、APK ̄N固和重新签名等。 Police Technology 2017年第1期57 1二l 安全 (一)漏洞检测 首先通过梆梆加固 的开发者服务平台,对APK进行风 险漏洞的检测,平台给出风险漏洞数量和详细描述,具体包 括:(1】安全检测:对病毒、木马、恶意代码、敏感权限调 用、广告、恶意扣费等安全特征进行检测。以及自身风险、 漏洞进行定制化检测。(2)漏洞扫描:对应用程序进行静 态漏洞扫描,并在模拟器中对应用进行实时漏洞攻击检测。 (3)风险评估:对可能存在风险隐患的功能调用、系统组 件、接口等方面进行安全评估,及时发现潜在风险。(4) 解决建议:针对安全检测系统发现的各类安全问题,提供可 靠的安全解决建议。 图3 APK L险漏i刚佥测 《二)APK ̄n固 对发现漏洞的APK进行加固,梆梆加固平台的梆天系 列则提供了移动应用安全加固、移动应用源代码加固、安全 密钥白盒等功能模块。其中移动应用安全加固、移动应用源 代码加固最为基础,也最为重要。 移动应用安全加固技术包括但不局限于下列措施:(1) 防逆向( 一RE):抽取cIasses.dex中的所有代码,剥离敏 感函数功能,混淆关键逻辑代码,整体文件深度加密加壳,防 止通过ap Od、J田等静态工具来查看应用的Java层代码,防 止通过IDA等工具对s。里面的逻辑进行分析,保护na 代 码。(2)防篡改( —tamper):存档替换、病毒广告植 入、内购破解、功能屏蔽等恶意行为将无法实施。(3)防调 试( m—debug):避免钓鱼攻击、交易劫持、数据修改等调 试行为。(4)防窃取(Storage ̄lJon):防止针对应用 动、静态数据的捕获、劫持和篡改。 移动应用源代码加固包括如下系统性的安全保护措 施:(1)控制流平坦化:将C、C++等语言中的If、 while、for、do等控制语句转化为switch分支选择语句。 (2)插入各种花指令:使逆向分析工具进行字节码解析 时崩溃。(3)控制流变换:随机确定控制块的执行顺 序,达到模糊程序控制逻辑、隐藏程序控制流的目的。 (4)代码完整性校验:保证代码执行时的完整性。(5) 源代码混淆:不用担心使用网上开源工具不清楚混淆结果 是否有效的问题。 58蔓嚓圜2017年第1期 图4 APK系统加固 (三)重新签名 APK经过前两步后,还需对其进行重新签名,才能发 布使用。利用独立于开发环境之外的签名工具。对App文件 进行签名管理,可在应用发布流程上减少技术人员的投入。 签名工具如图5所示。 簟““ ¨¨§ s 谧 … “ ‘ 。 ^魁0:‘・ -d ・ J {Bs'・l~。…a u… h … “ n…} - r。_d 0c】-… 哪 ………● ;o i岫i #………● 、・ …p榭 洲j日“h ・州.由m■・ t o^・岫 1. t e~ … 一一一. 一—— 图5 APK)] ̄I固后重新签名 五、结束语 保护好APK不仅为了保护好自己辛苦付出的知识成 果,同时也是不去当恶意者攻击使坏的帮凶工具。开发者首 先要有安全保护意识,重视安卓App安全,尤其特殊行业、 或者涉及到关键协议的App更要严肃重视。在开发时就采用 技术手段进行自身保护,并且充分利用第三方安全服务平 台,进行APK的漏洞检测、安全加固等措施,还安卓应用一 片蓝天,还安卓APK一道干净绿色安全的承诺 l参考文献 【1】2016年第二季度中国手机安全状况报告36(1互联网安全中 ・心.2016.729.  12】盗版猖橛被反编译成为常态?谁偷了我的代码Http:// blog.csan.net/h ̄tni/atticle/derailv'45575169. I31包建强.App研发录:架构设计、cra!;l1分析和竞品技术分析. 机械工业出版社,2015.9. 『41 Android NDK编译本地文件以及引用第三方so文件Ht ̄p:// Ⅵ apkbus.corn/forum.php?mod=viewthmad&tid 241)21 1&}li .1l ight=NDK%E7%B( %E} A F[ 1 『51 Android APK加壳技术方案.Http://blog.csdnnet/forlong4()l / ̄dde/detafls/12( )5/ f61梆梆加固:http://www.bangclecorn/ 爱加密:http://wwwijm ̄i.cn/. [8]360加固宝:http://jiagu 360.cn/pmtect/welcome/ I91阿里聚安全:http://jaq.alib ̄ba.corn/. 【1(】】腾讯云加固:h叩://jia .qdoud cony" 

因篇幅问题不能全部显示,请点此查看更多更全内容

Top