Android应用安全风险与防范

Hello,大家好,我是Clock。最近一段时间在做Android应用安全方面的功课,本文进行简单梳理方便以后Review,有错误和遗漏之处还请大家指出。

代码混淆

Android开发除了部分功能采用C/C++编码外,其余主要都是采用Java进行编码开发功能。Java应用非常容易被反编译,Android自然也不例外。只要利用apktool等类似的反编译工具,就可以通过安装包获取源代码。Google为了保护开发者的知识产权,为Android提供了ProGuard混淆方案,以增加反编译后源码阅读,但对于Android开发老司机和逆向工程师来说,解读还原出源代码只是时间问题。

ProGuard是针对Java应用的保护,并不是专门针对Android应用的,Android虽然使用Java开发,但是毕竟不是跑在JVM上,所以安装包结构和普通的Java应用还是区别多多。如果你对免费的ProGuard放心不下,可考虑试试付费的混淆方案DexGuard,除了拥有ProGuard的功能外,还包含资源混淆,字符串加密,类加密和dex文件分割等。

虽然代码混淆是最为基础的保护措施,不过国内仍有不少应用还是裸奔的,其中还包括一些大厂应用(此处不表)。

签名校验

Android黑产里面,有一个叫做二次打包,也称为重打包。即通过反编译正版应用后,可以获得smali源码,往其中注入代码或者修改相应业务逻辑后,再利用新的签名进行重新打包,并发布到应用市场去,很多无良开发者就是通过这种方式去破解一些付费应用或者往其中注入广告代码来获利。简单梳理一下重打包的基本流程:

  1. 对正版应用用apktool类逆向工具进行解包;
  2. 在某处地方注入smali代码;
  3. 利用IDE生成签名文件,再通过jarsigner进行签名;
  4. 上传应用市场;

为了与二次打包做对抗,可以在应用内的关键功能入口增加校验签名的检测,如果发现应用签名非正版,则强制关闭应用或者限制用户使用。加签名校验代码时,可以考虑:

  1. 在JNI层中加校验代码,相比在Java层的代码,JNI层的逆向难度更大;
  2. 如果要在Java层加校验代码,不要在一个地方暴露一段长串字符串,对于逆向工程师是来说,这是非常明显的提示。可以考虑将字符串打散存放在各处,这样会增加破解分析的难度;

当然,不要以为放在JNI就高枕无忧,对于JNI层,同样可以进行代码注入,来暴力破解你签名校验的逻辑,只不过相比Java层的,JNI层所需成本更高,这样也就能拦截掉一部分逆向人员的歪主意。

加壳

加壳的原理是通过加密原应用的安装包中的dex文件,其主要操作方式大致如下:

  1. 准备要进行加壳的原应用安装包(以下简称原apk)、用于做壳的安装包(以下简称壳apk);
  2. 对原Apk进行拆解获取各个部分,并将dex文件进行算法加密(以下简称加密原dex);
  3. 将加密原dex和壳Apk中的dex进行组合,合并成为新的dex文件;
  4. 利用特制的打包工具合并生成加密后的apk;

这种通过隐藏dex文件的方式加壳方式,最终是利用ClassLoader在内存中解密并进行动态加载运行。而如果是修改dex文件的加壳方式,其主要是抽取DexCode中的字节码指令后用零去填充,或者修改方法属性等操作,其修复时机则是运行时在内存中做相应的修正工作。

通过加壳得到的安装包如果不进行脱壳操作,逆向人员就无法拿到真正的dex文件,也就无从分析。这里可以看看使用360加固的一个应用的结构在没脱壳前的安装包结构

只有寥寥几个类,而正真的安装包中的dex文件则被藏起来了,这进一步加大了逆向的难度。关于加壳,市面上已经有很多成熟企业加固方案可以使用,如梆梆安全、爱加密、360加固保等,如果不是专门研究这块的开发者去自行开发一套加壳方案,显然不太现实。

加壳也只是提高被逆向的门槛,对于功力不够的逆向开发者而言,只能就此作罢,而对于逆向老鸟来说,脱壳同样这是外包时间问题罢了。此外,对应用加壳还要留意平台兼容性问题,如此前某著名加固产品就出现过在ART虚拟机不兼容问题,以及将会影响项目使用某些热修复技术。

反动态调试

你是不是曾以为没有拿到源代码就不可以调试Android应用了?然而并不是,只要反编译后拿到smali代码工程,再加上smalidea调试神奇,分分钟在Android Studio调试应用给你看,具体操作并不复杂,可以参照我文末提供的资料。即使你把核心代码放到了JNI层,我也可以祭出神器IDA Pro继续调试给你看,更何况,实际开发中能放进JNI层实现的核心代码实在有限。

为了对抗动态调试,可以考虑在源码中随意穿插相关的检测代码,在检测到动态调试时,直接进程自杀,异常退出虚拟机,大致实现如下:


  1. /** 
  2.      * 检测动态调试 
  3.      */ 
  4.     public void detectedDynamicDebug(){ 
  5.         if (!BuildConfig.DEBUG){ 
  6.             if (Debug.isDebuggerConnected()){ 
  7.                 //进程自杀 
  8.                 int myPid = android.os.Process.myPid(); 
  9.                 android.os.Process.killProcess(myPid); 
  10.  
  11.                 //异常退出虚拟机 
  12.                 System.exit(1); 
  13.             } 
  14.         } 
  15.     }  

以上只是一个简单的例子,市面上很多加固产品做了更多的动态调试对抗措施。

数据保护

数据保护这个主要例举以下几点:

  • 不要在客户的存放登录密码(即使你加密了),最好采用token的形式;
  • 数据传输记得加密;
  • 重要数据存放内置存储中,不要存放在外置存储;
  • 加密存放在xml和数据库中的重要信息;

资源保护

资源保护同样可以提高逆向分析的难度,但个人觉得只对逆向小白有效,可以考虑引入试试,目前比较知名的方案就是微信和美团两家的了,具体参见:

  • 安装包立减1M–微信Android资源混淆打包工具
  • 美团Android资源混淆保护实践

总结

应用安全的攻防就是这么一个相爱相杀又相辅相成的过程,对于客户端能做到的安全防范也是有限的,更多的还是应该结合后台业务分析来实现相应的对抗机制,对于中小企业而言,没有专门的安全人员去研究对抗方案,选择市面上成熟的加固方案是一个不错的选择。而对于大企业来说,内部早已有了自己的安全中心,自然也有自己的一系列对抗方案,包括在后端生成每个用户的画像来判别用户类型等等。大致就是这么些了,文末附上一些不错的资料,希望本文能对你有所启发!

欢迎关注我的简书,以及:

知乎:https://www.zhihu.com/people/d_clock

知乎专栏(技术视界):https://zhuanlan.zhihu.com/coderclock

知乎专栏(阅读视界):https://zhuanlan.zhihu.com/readerclock

个人博客:http://blog.coderclock.com/

资料

  • 《Android软件安全与逆向分析》
  • Android反编译之二–Smali语法简介
  • Android反编译-smali语法
  • 浅析Android打包流程
  • Smalidea无源码调试apk
  • Android逆向分析学习路线?
  • DEX文件混淆加密
  • DEX文件格式分析
  • android-security-awesome
  • 360显微镜,扫描App安全漏洞
  • 如何从技术上全面分析一款android app? 

作者:Clock

来源:51CTO

时间: 2024-10-13 18:16:07

Android应用安全风险与防范的相关文章

Android编程内存溢出与防范方法浅析_Android

本文实例讲述了Android编程内存溢出与防范方法.分享给大家供大家参考,具体如下:  Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M.但是Android采用的是Java语言编写,所以在很大程度上,Android的内存机制等同于Java的内存机制,在刚开始开发的时候,内存的限制问题会给我们带来内存溢出等严重问题.在我们不使用一些内存的时候,我们要尽量在Android或者其他平台上避免在运行其他程序时,保存必要的状态,使得一些死进程所带来的内存问题,应该尽量在关闭程序

Android编程内存溢出与防范方法浅析

本文实例讲述了Android编程内存溢出与防范方法.分享给大家供大家参考,具体如下: Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M.但是Android采用的是Java语言编写,所以在很大程度上,Android的内存机制等同于Java的内存机制,在刚开始开发的时候,内存的限制问题会给我们带来内存溢出等严重问题.在我们不使用一些内存的时候,我们要尽量在Android或者其他平台上避免在运行其他程序时,保存必要的状态,使得一些死进程所带来的内存问题,应该尽量在关闭程序或

微软高管称Android存在法律风险

微软手机通信业务部门首席财务官蒂万卡·埃拉瓦拉(Tivanka Ellawala)当地时间周四表示,与Google的Android操作系统相关联的法律风险意味着它不应当被认为是一款"免费"软件. 埃拉瓦拉发表这番言论正值Android在美国智能手机软件市场的份额迅猛增长之际.在德意志银行技术会议上回答"Android的免费.开放源代码模式 是否会给微软等收取许可费的软件厂商带来问题?"的问题时,埃拉瓦拉指出,Google已经因Android被诉侵犯知识产权,&quo

Android开发技术周报 Issue#8

# Android开发技术周报 Issue#8 声明:所有内容收集整理自网络.如有侵权,请联系删除. 业界新闻 1. Android Studio 2.3 正式版发布 Android Studio 2.3 正式版发布了,该版本包含一些新特性,包括对 WebP 支持的更新:ConstraintLayout 库支持更新和布局编辑器的部件面板.提供一个新的 App Link 助手可以帮助你在应用中构建 URI 的统一视图.新的运行按钮提供更直观和可靠的立即运行体验.最后是 Android 模拟器的测试

Android系统的安全风险控制策略

没有一个软件系统是绝对安全的,总体而言,Android系统中的风险可概括为五大类.根据以下建议对每种风险做好防范工作. 第一类风险是滥用应用程序权限.关于这类风险有如下防范策略建议. 应用程序认证 认证是防范恶意程序的有效手段之一.在理想状态下,一个应用程序在认证之前必须经过完整的测试与代码审查,确认其权限使用的合理性,这自然对恶意软件起到了有力的防范作用.但是,认证的费用高昂,程序复杂,并不具备广泛的实用性. 选择使用应用程序权限 如果能够在安装阶段,确认某一应用程序仅使用必需的最小权限,也就

如何防范人工智能、大数据、区块链、云计算的技术风险?

近期京东集团发布了2017年第二季度业绩.除了京东集团的业绩情况,还值得注意的一点是,京东金融重组已于 2017年6月30日 完成交割,京东金融的财务数据将不再纳入京东集团的合并财务报表. 京东金融于2013年10月开始独立运营.经历一段时间技术储备和锤炼后,京东金融剑指更广阔的金融科技市场,以期向金融业输出自身技术,直接厮杀于这个巨大而竞争激烈的Techfin市场. 众所周知,人工智能.大数据.区块链.云计算这四项技术是Techfin市场中的顶梁柱.近日京东金融研究院发布了<2017金融科技报

大话无线客户端安全之数据存储安全——Android篇

1 前言        随着无线客户端的火热发展,大家往往将所关注的重点放到了业务本身上,而忽视了安全问题.但是随着近年来各种层出不穷的与客户端相关的攻击事件以及安全漏洞的曝出,客户端安全已经不容忽视,忽视了安全必将会受到安全的惩罚.        而在各种安全之中数据安全更是重中之重,毫不夸张的说数据安全可以说是无线客户端安全的灵魂.用户的重要数据一旦损失掉,将会对应用乃至企业造成巨大的负面影响.例如去年发生的CSDN的用户名密码泄露事件:和无线客户端相关的有Skype Android版的用户

一个五年 Android 开发者百度、阿里、聚美、映客的面试心经

花絮 也许会有人感叹某些人的运气比较好,但是他们不曾知道对方吃过多少苦,受过多少委屈.某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我. 先简单说说我最近的面试经历吧.面试的公司很多,其中有让我心血沸腾的经历,也有让我感到失望到无助的经历,我将这些体会都记录下来,细想之后很值得,面了这么多公司,要是最后什么也没有留下来,那就太浪费了.至少对于我来说有些东西在整理总结之后才能得到一个肯定的答案.希望这些能对即将换工作或者打算看看机会的

【区块链之技术进阶】Attention please!区块链技术的风险!

不知不觉咱们在[区块链之技术进阶]部分已经分享了七篇文章了,通过之前的七篇文章大家对于区块链技术的理解是不是上升了一个高度呢?这七篇文章,告诉我们区块链是互联网时代的通往第二纪元--信任纪元的革命,这场技术海啸必将彻底地颠覆未来金融的发展方向,大家也了解了区块链未来可以在那些方面创新,当然区块链可以用来记账,但是其作用却不局限于记账,读完前面的文章大家想必会有这样的认识吧.咱们也更加深入地从金融和技术层面理解区块链技术原理并且了解了区块链技术的共识算法.是吧,这样一回顾,咱们学到的东西可是真的不