第1章:Android应用基础

各位同学,欢迎来到移动安全逆向工程的第一课。今天咱们聊聊Android的根基——系统架构、APK文件结构,还有安全模型。这些内容看似基础,但说实话,我见过太多逆向工程师在这上面栽跟头。我自己刚入行那会儿,也踩过不少坑。

1.1 Android系统架构:五层结构

Android系统不是铁板一块,它分五层。每层各司其职,又相互依赖。你想想看,一个App从点击图标到显示界面,中间经历了多少层?

核心要点:Android系统架构自下而上分为五层——Linux内核层、硬件抽象层、运行时层、框架层、应用层。每一层都为上层提供抽象服务。

应用层 (Application Layer) 系统应用 · 第三方应用 · Launcher 框架层 (Framework Layer) Activity Manager · Window Manager · Content Providers 运行时层 (Android Runtime) ART · Core Libraries · Dalvik (旧版) 硬件抽象层 (HAL) Camera HAL · Audio HAL · Sensors HAL Linux内核层 (Linux Kernel) 进程管理 · 内存管理 · 驱动 · 网络栈 第5层 第4层 第3层 第2层 第1层

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