第1章:Android应用基础
各位同学,欢迎来到移动安全逆向工程的第一课。今天咱们聊聊Android的根基——系统架构、APK文件结构,还有安全模型。这些内容看似基础,但说实话,我见过太多逆向工程师在这上面栽跟头。我自己刚入行那会儿,也踩过不少坑。
1.1 Android系统架构:五层结构
Android系统不是铁板一块,它分五层。每层各司其职,又相互依赖。你想想看,一个App从点击图标到显示界面,中间经历了多少层?
核心要点:Android系统架构自下而上分为五层——Linux内核层、硬件抽象层、运行时层、框架层、应用层。每一层都为上层提供抽象服务。
1.1.1 Linux内核层
这是Android的根基。说白了,Android就是跑在Linux内核上的。进程管理、内存管理、网络栈、驱动——这些底层活儿全交给内核。我记得有一次逆向一个恶意App,它试图通过内核漏洞提权,结果因为内核版本太老,漏洞早就被补了。嗯,这就是内核层的重要性。
1.1.2 硬件抽象层(HAL)
HAL这层,说白了就是给硬件驱动套了个壳。厂商的硬件实现千奇百怪,但HAL提供统一接口。我曾在项目中遇到过一个问题:某款手机的摄像头在App里死活打不开,最后发现是HAL层的实现有bug。你想想看,没有HAL,每个App都得自己适配所有硬件,那得多崩溃?
1.1.3 运行时层
Android 5.0之前是Dalvik虚拟机,之后换成了ART。ART最大的改进就是预编译——安装时就把字节码编译成本地机器码,运行速度提升明显。我个人习惯在逆向时先看App的minSdkVersion,如果低于21,那它可能还兼容Dalvik,dex优化方式会不一样。
1.1.4 框架层
这一层是开发者最常接触的。ActivityManager、WindowManager、ContentProvider……这些系统服务都在这层。逆向分析时,我们经常hook这些服务来拦截系统调用。我建议初学者先搞懂ActivityManager的工作流程,因为大部分App的入口都跟它有关。
1.1.5 应用层
最上面这层,就是咱们平时装的App。系统应用和第三方应用都在这。逆向分析的目标也主要在这层——APK文件。
1.2 APK文件结构详解
APK本质上就是个ZIP压缩包。你可以用任何解压工具打开它。但里面每个文件都有特定用途。咱们一个一个看。
小技巧:我习惯用 unzip -l app.apk 先看看APK里有哪些文件,心里有个数再动手。
1.2.1 AndroidManifest.xml
这是App的「身份证」。里面声明了包名、组件、权限、版本号等信息。逆向时,我第一件事就是看这个文件。为什么?因为它告诉你App能干什么——比如它申请了哪些权限,暴露了哪些组件。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<application ...>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
注意:APK里的AndroidManifest.xml是二进制格式,不能直接用文本编辑器看。需要用 apktool d 反编译,或者用 AXMLPrinter2 工具解析。
1.2.2 classes.dex
这是App的「大脑」。所有Java/Kotlin代码编译后都放在这个文件里。DEX是Dalvik Executable的缩写,里面是字节码。逆向分析的核心工作就是分析这个文件。
我曾经遇到一个App,它的classes.dex被加固了——真正的dex被加密藏在资源文件里。运行时才解密加载。嗯,这种时候就得先脱壳,才能看到真正的代码。
1.2.3 resources.arsc
这个文件存的是资源索引表。字符串、布局、颜色、图片的ID都映射在这里。逆向时,如果你想修改App的界面文字,就得改这个文件。我建议用 apktool 反编译后,在 res/values/strings.xml 里找目标字符串。
1.2.4 签名文件
APK必须签名才能安装。签名文件在 META-INF/ 目录下,通常有三个文件:
| 文件名 | 作用 |
|---|---|
| MANIFEST.MF | 列出所有文件的SHA-1哈希值 |
| CERT.SF | 对MANIFEST.MF的签名 |
| CERT.RSA | 包含公钥和签名证书 |
签名的作用是保证APK的完整性和来源可信。如果你修改了APK里的任何文件,签名就会失效,安装时会报错。这时候就得重新签名。我刚开始做逆向时,经常忘记重新签名,结果安装失败,折腾半天才发现问题。
1.3 Android安全模型
Android的安全机制不是单一防线,而是多层防护。咱们重点说三个:沙箱、权限、签名。
1.3.1 沙箱机制
每个App运行在独立的进程中,有自己的UID。App之间默认不能互相访问数据。这就是沙箱。你想想看,如果没有沙箱,一个恶意App就能随便读取你的银行App数据,那还得了?
但沙箱不是绝对的。通过 sharedUserId 或者root权限,可以打破沙箱。逆向分析时,我们经常需要root设备来访问其他App的数据目录。
关键点:沙箱基于UID隔离。每个App的UID在安装时分配,不同UID的进程不能互相访问文件和数据。
1.3.2 权限模型
Android的权限分四类:
- 普通权限:安装时自动授予,如INTERNET
- 危险权限:运行时需用户确认,如READ_CONTACTS
- 签名权限:只有相同签名的App才能使用
- 系统权限:只有系统App才能使用
我建议逆向时重点关注危险权限。如果一个计算器App申请了读取联系人权限,那肯定有问题。我曾经分析过一个恶意App,它申请了20多个权限,但实际功能就是个手电筒——明显是权限滥用。
1.3.3 应用签名
签名不仅用于验证APK完整性,还用于建立信任关系。同一个开发者签名的App可以共享数据、使用相同的 sharedUserId。签名也决定了App能否升级——只有相同签名的版本才能覆盖安装。
逆向修改App后,必须重新签名。但注意:重新签名后的App与原版签名不同,无法覆盖安装原版。你得先卸载原版再安装修改版。嗯,这个坑我踩过不止一次。
实用命令:查看APK签名信息可以用 keytool -printcert -jarfile app.apk。我经常用这个命令来确认App的签名指纹。
好了,这一章的内容就到这里。Android系统架构、APK结构、安全模型——这三块是逆向工程的基石。后面咱们会深入每个细节,从反编译到动态调试,一步步来。
公众号:蓝海资料掘金营,微信deep3321