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层实现的核心代码实在有限。

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


    /**
     * 检测动态调试
     */
    public void detectedDynamicDebug(){
        if (!BuildConfig.DEBUG){
            if (Debug.isDebuggerConnected()){
                //进程自杀
                int myPid = android.os.Process.myPid();
                android.os.Process.killProcess(myPid);

                //异常退出虚拟机
                System.exit(1);
            }
        }
    }

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

数据保护

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

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

资源保护

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

总结

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

资料


Android应用的安全风险及防范措施 代码混淆是一种技术,通过将代码转换为难以理解的形式,以 ersoVdneirF 代码注入攻击,攻击者可以将恶意代码插入应用的执行流程中,从而获取应用的控制权。Android 应用的安全风险包括代码注入、不安全的存储、未授权的访问、逆向工程和代码混淆等。开发者应该重视应用的安全性,并采取相应的防范措施,如输入验证和过滤、使用安全的 API、加密存储、权限管理以及逆向工程和代码混淆等。开发Android应用时,开发者需要重视应用的安全性,并采取相应的防范措施,以保护用户的数据和隐私。 阅读详情

相关推荐

Android 反动态调试

Android 检查动态调试 最近项目中,三方安全报告中一直存在动态调试检测的高危漏洞。经过多次探索研究,参考了网上不少示例,集大家所成,研究在Android studio 3.0以上,可以使用的示例代码。

动态分析Android App之动态调试

动态分析Android App之动态调试 这个系列一共有五篇左右,内容主要介绍如何动态分析和调试Android App,和网上其他教程相比,内容更充实,体系更健全,深入而浅出。闻道有先后,术业有专攻,希望能给刚入门Android逆向的同侪们些微帮助。 出于各种原因,文章有两个遗憾,一是只包含了Java层代码的动态分析和调试,Jni和Native层并没有涉及;二是对Hook框架的介绍和使用不是很充分...

lilac的博客 1万+

App动态调试这也太详细了

App动态调试这也太详细了

Android应用安全检测项目

Android应用安全检测项目 使用静态检测引擎对APK文件进行反编译,扫描反编译后的代码文件即可发现应用的安全漏洞。 一般有以下内容,比较有参考价值,部分是平时编码时有可能忽略的问题,在此整理供大家参考。 1. 基础信息 1.1 权限过度声明风险检测 检测应用中是否存在权限滥用情况。 权限是一种安全机制,主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组件访问。Android通过在AndroidManifest.xml中增加权限来控制限制性功能的使用和组件访问。权限滥用是指应用权限开

苛学加记事 8239

基于权限的Android应用风险评估方法

针对Android权限机制存在的问题以及传统的应用风险等级评估方法的不足,提出了一种基于权限的Android应用风险评估方法。首先,通过对应用程序进行逆向工程分析,提取出应用程序声明的系统权限、静态分析的权限以及自定义的权限,和通过动态检测获取应用程序执行使用到的权限

Android代码-一些android安全相关收集

android-security-awesome A collection of android security related resources. TOOLS ACADEMIC / RESEARCH / PUBLICATIONS / BOOKS EXPLOITS / VULNERABILITIES / BUGS TOOLS Online Analyzers AndroTotal Tracedroid Visual Threat Mobile Malware Sandbox Appknox - not free IBM Security AppScan Mobile Analyzer - not free NVISO ApkScan AVC UnDroid Virustotal - max 128MB Fraunhofer App-ray - not free AppCritique - Upload your Android APKs and receive comprehensive free security assessments. NowSecure Lab

android 防动态调试,Android应用安全与校验之反动态调试

是不是有很多初学者认为没有拿到源码就不可以调试Android应用了?不是这样子的。只要通过反编译拿到smali代码工程,再加上smalidea调试神器,分分钟就可以在Android Studio中调试应用。即便核心代码被放到了JNI层,我们也可以使用IDA Pro继续调试,而且实例开发中能放进JNI层实现的核心代码实在有限。为了对抗动态调试,可以考虑在源码中随意穿插相关的检测代码,在检测到动态调试...

weixin_39894255的博客 681

一个Android安全相关资源的集合-python

一个Android安全相关资源的集合 android-security-awesome 一个安卓安全相关资源的集合。 工具学术/研究/出版物/书籍漏洞利用/漏洞/错误工具在线分析器 AndroTotal Appknox - 非免费 AVC UnDroid Virustotal - 最大 128MB Fraunhofer App-ray - 非免费 AppCritique - 上传您的 Android APK 并接收全面的免费安全评估。 NowSecure Lab Automated - 用于移动应用安全测试 Android 和 iOS 移动应用的企业工具。 实验室自动化功能在云中的真实设备上进行动态和静态分析,可在几分钟内返回结果。 不是免费的 AMAaaS - 免费的 Android 恶意软件分析服务。 裸机服务具有针对 Android 应用程序的静态和动态分析功能。 MalwarePot 的产品。 App Detonator - 引爆 APK 二进制文件以提供源代码级别的详细信息,包括应用程序作者、签名、构建和清单信息。 3 分析/天免费配额。 BitBaan N

安全检测风险

允许用户备份系统应用和第三方应用的apk安装包和应用数据,以便在刷机或者数据丢失后恢复应用,用户即可通过adbbackup和adbrestore来进行对应用数据的备份和恢复。第三方应用开发者需要在应用的AndroidManifest.xml文件中配置allowBackup标志(默认为true)来设置应用数据是否能能够被备份或恢复。在app上的具体表现是比如游戏登陆时调用微信的Activity登陆组件,微信的Activity登陆组件就是可被导出的。URL地址,进行删除;....................

Errol's Blog 3202

【人工智能】人工智能基础概念、流派、发展史

人工智能初衷就是让计算机能够像人类一样具有自我思考、自我学习、自我决策的能力。依据百度百科上对人工智能定义:人工智能是研究、开发用于模拟、扩展和延伸人的智能的理论、方法、技术及应用系统的一门新的技术学科。人工智能是研究使计算机来模拟人的某些思维过程和智能行为的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。

WEL测试 1879

ISCE+Mintpy进行SBASInSAR处理(持续更新)

通过调用pairs_misregistration方法,利用safe_dict中的数据信息,对每对SLC数据进行配准误差的计算和分析,以确定数据之间的精确差异,为后续的时间序列处理提供基础。给定同一地区的两景SAR影像,经过配准之后,对应像元进行共轭相乘得到相位差,并形成干涉图,但是从干涉图中得到的相位差实际上是主值,即在(-π,π)呈周期性变化,为了还原其真实的相位差,必须在主值的基础上加或减整数倍的相位周期2π,把被卷叠的相位展开,才能顺利地反演出地面目标的高程和形变。

Cyy2511250589的博客 3732

Android 应用安全风险与防范

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

weixin_34194702的博客 184

详解GPU显存和batch size的关系

GPU显存、规格指标;神经网络训练,显存占用

orangerfun的博客 6211

Android应用安全风险与防范之加壳

加壳的原理是通过机密原应用的安装包中的dex文件,大致操作如下: 1.要进行加壳的原应用安装包、做壳的安装包; 2.对原应用安装包进行拆解获取各个部分,并且对dex文件进行算法加密; 3.将加密原dex和壳Apk中的dex进行组合,合并使之成为新的dex文件; 4.利用特制的打包工具合并生成加密后的Apk; 这种通过隐藏dex文件加壳的方式,最终是利用ClassLoader在内存中解密并

bwf_erg的博客 638

不经意传输(OT)协议 - Mike Rosulek教授课堂笔记

OT扩展协议-IKNP

qq_43569221的博客 1850

电影台词预测类型:NLP小样本多标签分类实战

电影类型预测本质上是短文本语义建模问题,核心在于从高度碎片化、低语义密度的台词(平均仅12.7词)中挖掘隐含的类型学编码规则。其技术难点在于:需应对省略主语、倒装、拟声词等非规范表达;处理Drama与Comedy等类型强共现的多标签耦合;并克服领域迁移障碍——维基文本预训练模型在台词上性能骤降0.11。解决方案聚焦RoBERTa微调、类型感知注意力机制与标签平滑策略,兼顾小样本鲁棒性与业务可解释性,广泛适用于影视元数据标注、智能推荐系统及NLP教学实践。

weixin_33309048的博客 287

Android应用安全风险与防范之代码混淆

Android开发除了部分功能采用C/C++编码之外,其余都是主要采用Java进行编码开发功能。Java应用很容易被反编译,Android也不例外。通过apktool等反编译工具就可以获取源代码。Google为了保护应用开发者的知识产权,为Androi提供了ProGuard混淆方案,以增加反编译后源码阅读的难度,但是对于一些技术能力强的Android开发工程师和反编译工程师来说,解读还原源码只是时

bwf_erg的博客 360

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整论文+代码+结果

2024国赛A题参考论文。2024国赛D题参考论文。2024国赛E题参考论文。2024国赛B题参考论文。2024国赛C题参考论文。

qq_52590045的博客 5351

Android开源风险,Android应用安全风险与防范之加壳

加壳的原理是通过机密原应用的安装包中的dex文件,大致操作如下:1.要进行加壳的原应用安装包、做壳的安装包;2.对原应用安装包进行拆解获取各个部分,并且对dex文件进行算法加密;3.将加密原dex和壳Apk中的dex进行组合,合并使之成为新的dex文件;4.利用特制的打包工具合并生成加密后的Apk;这种通过隐藏dex文件加壳的方式,最终是利用ClassLoader在内存中解密并进行动态加载运行。而...

weixin_29028595的博客 301

头歌 JAVA 桥接模式实验

这样,通过客户端代码配置不同的 FileConvertor 子类和 DataHandler 子类(如 OracleHandler 或 SQLServerHandle),即可实现从不同数据库读取数据并转换成不同格式的功能,而无需修改已有代码。

m0_74091276的博客 3189

万字长文带你由浅入深夯实ARM汇编基础——汇编指令及寻址方式最全梳理(附示例)!

见到汇编就害怕?读完这篇,扫除汇编拦路虎!!(示例丰富,可做手册,随手查阅!)

车载系统攻城狮 1万+
上一篇: Android应用瘦身,从18MB到12.5MB
下一篇: 利用Android源码,轻松实现汉字转拼音功能
D_clock爱吃葱花
博客等级 码龄14年 163粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值