浅谈Android应用保护(一):Android应用逆向的基本方法

简介:

对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击。使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码、数据,修改其代码逻辑和机制等操作。这篇文章主要介绍一些基本的应用逆向和分析方法,演示Android应用的代码机密性和完整性是如何被破坏,进而被应用攻击者所用的。


一、Dalvik层源码逆向

在dalvik层代码的分析中,(一般情况下,对于未进行防护的应用)在Dalvik层,我们只关心classes.dex的逆向分析。


classes.dex是APK运行时的代码,是由源代码编译成的可以在dalvik上运行的代码。Dalvik虚拟机类似java虚拟机,所以可以用类似java的class文件的反编译方法,反编译classes.dex为java代码。对于未被保护的应用,可以用此方法还原出大部分代码。


整个过程中,涉及的代码形式如下:

· 1.dex文件,APK的可执行文件。

· 2.smali文件,Dalvik VM内部执行的代码。

· 3.jar文件和java文件,根据dex文件转换成的java代码文件.。




用到的工具介绍:

· 1.smali/baksmali :dex可执行文件向smali字节码文件互相转换的工具,转换的过程不丢失信息。

· 2.dex2jar:dex文件转化成java的jar文件的工具。因为Dalvik虚拟机和Java虚拟机的差异,转换无法做到一一对应,会有信息丢失和代码的错误。(该工具是整个源码逆向中非常有意义的一步 )。

· 3.jd/jd-gui:java的jar文件反编译工具。

· 4.APK改之理(ApkIDE):Windows平台下一个集成了上述工具的有GUI的平台。


最终生成的java源码形式如图。此时Dalvik层源码的逆向已经完成,可以对应用进行进一步的准源码级别的分析。



二、Dalvik层代码篡改

Dalvik层的代码篡改主要发生在smali文件上。反编译出的java代码虽然易读,但已经丢失了部分信息,同时可能存在若干错误,基本上没办法再编译回可执行文件。同时dex二进制文件不具备可读性。所以一般情况下,只能在smali中的代码上进行修改,重新打包生成APK。


代码层的篡改,可以修改应用的逻辑流程,插入恶意代码、绕过关键的安全流程(注册、验证、付款),打印敏感数据等。篡改代码、重打包技术一般应用在破解软件的注册验证机制(AD block破解注册,海卓破广告VIP,MIUI收费主题破解),修改游戏的规则(微信飞机大战破解),应用的敏感API调用的监控(APIMonitor,通过Android重打包加固APK拦截软件行为)。


Dalvik层代码篡改的使用的一个比较著名的例子是:APIMonitor。

APIMonitor的工作原理是,反编译apk文件,遍历smali代码,搜索配置文件中配置的需要监控的Api,如果找到一个Api的调用,则分析其参数,然后调用droidbox包空间下对应的类的静态函数。这些静态函数实现都是解析参数,打印输出log信息。处理完毕后,重新编译生成apk。


三、Dalvik层代码的Hook

samli代码的篡改需要重新打包,新的包的签名和文件校验都和原有的包不同,可以被应用内的完整性检查模块识别,进而限制进一步的操作。解决这个问题的一个方法是,可以通过把自定义代码注入到应用的进程空间,实时的代码hook,不修改代码,实现对应用的代码逻辑的修改。


可以实现上述功能的的框架工具是xposed,和cyida substrate。xposed应用相对广泛。xposed的原理可以参考之前分享的文档《Xposed原理及实现》。


Xposed的应用比较有名的两个例子分别是

1.Zjdroid,通过hook系统挂载dex文件的函数,自动化脱掉大部分android的加密壳。

2.Xprivicy,通过hook大部分隐私函数的调用,监控或者阻断应用对隐私API的调用。

Dalvik层代码的hook会在第三篇文章中详细介绍。


四、本地.so文件的分析

本地.so文件一般提供敏感函数的封装。对于未被保护的.so文件,可以通过IDA进行静态分析和动态挂载调试。so文件的分析会在第四篇文章中详细介绍。


五、浅谈Android应用保护系列文章

浅谈Android应用保护(零):出发点和背景

相关文章
|
26天前
|
Java API 开发工具
如何将python应用编译到android运行
【6月更文挑战第27天】本文介绍在Ubuntu 20上搭建Android开发环境,包括安装JRE/JDK,设置环境变量,添加i386架构,安装依赖和编译工具。并通过`p4a`命令行工具进行apk构建和清理。
37 6
如何将python应用编译到android运行
|
16天前
|
Java 调度 Android开发
深入解析Android应用开发中的响应式编程与RxJava应用
在现代Android应用开发中,响应式编程及其核心框架RxJava正逐渐成为开发者的首选。本文将深入探讨响应式编程的基本概念、RxJava的核心特性以及如何在Android应用中利用RxJava提升代码的可读性和性能。 【7月更文挑战第7天】
|
5天前
|
安全 Java Android开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
【7月更文挑战第18天】在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文将深入探讨这两个平台在开发过程中的主要差异,包括编程语言、用户界面设计、性能优化、安全性以及市场策略等方面。通过比较分析,旨在为开发者提供决策支持,帮助他们选择最适合自己项目需求的平台,同时考虑到用户体验和市场需求的变化,为未来的应用开发指明方向。
|
9天前
|
Android开发
Android面试题之View的invalidate方法和postInvalidate方法有什么区别
本文探讨了Android自定义View中`invalidate()`和`postInvalidate()`的区别。`invalidate()`在UI线程中刷新View,而`postInvalidate()`用于非UI线程,通过消息机制切换到UI线程执行`invalidate()`。源码分析显示,`postInvalidate()`最终调用`ViewRootImpl`的`dispatchInvalidateDelayed`,通过Handler发送消息到UI线程执行刷新。
18 1
|
13天前
|
开发者 Kotlin Android开发
Kotlin协程在Android开发中的应用
【7月更文挑战第10天】Kotlin协程简化了Android异步编程,提供轻量级并发。挂起函数让异步代码看起来同步,不阻塞线程,便于管理。在项目中,添加Kotlin和协程依赖,如`kotlinx.coroutines-core`和`kotlinx-coroutines-android`。使用`CoroutineScope`和`launch`处理耗时任务,如网络请求,避免主线程阻塞。挂起函数和调度器控制执行上下文,适应不同任务需求。
|
19天前
|
机器学习/深度学习 人工智能 文字识别
文本,文字扫描01,OCR文本识别技术展示,一个安卓App,一个简单的设计,文字识别可以应用于人工智能,机器学习,车牌识别,身份证识别,银行卡识别,PaddleOCR+SpringBoot+Andr
文本,文字扫描01,OCR文本识别技术展示,一个安卓App,一个简单的设计,文字识别可以应用于人工智能,机器学习,车牌识别,身份证识别,银行卡识别,PaddleOCR+SpringBoot+Andr
|
22天前
|
存储 Android开发
详细解读Android获取已安装应用信息(图标,名称,版本号,包)
详细解读Android获取已安装应用信息(图标,名称,版本号,包)
12 0
|
22天前
|
存储 Android开发
详细解读Android获取已安装应用信息(图标,名称,版本号,包)
详细解读Android获取已安装应用信息(图标,名称,版本号,包)
12 0
|
23天前
|
Android开发 开发者 UED
使用AlarmManager实现Android应用中的定时任务
使用AlarmManager实现Android应用中的定时任务
|
25天前
|
XML Android开发 数据格式
Android AppCompatActivity 方法详解
Android AppCompatActivity 方法详解
14 0