0基础安卓逆向原理与实践:第1章:计算机系统与安卓架构基础

第1章:计算机系统与安卓架构基础

1.1 计算机体系结构基础

1.1.1 冯·诺依曼架构

计算机体系结构是理解安卓逆向工程的基石。现代计算机基于冯·诺依曼架构,该架构包含以下核心组件:

CPU
算术逻辑单元ALU
控制单元CU
寄存器组
输入设备
中央处理器CPU
输出设备
内存Memory
存储器Storage

核心概念解析:

  1. 中央处理器(CPU):执行指令和数据处理
  2. 内存(Memory):存储程序和数据
  3. 存储器(Storage):永久保存数据
  4. 输入/输出设备:与外界交互

1.1.2 指令执行周期

CPU执行指令遵循固定的周期:

取指令Fetch
译码Decode
执行Execute
写回Write Back

示例:简单加法指令执行过程

ADD R1, R2, R3  ; R1 = R2 + R3

执行步骤:

  1. 取指令:从内存地址0x1000读取指令ADD R1, R2, R3
  2. 译码:识别为加法操作,操作数为R2和R3,结果存入R1
  3. 执行:ALU计算R2 + R3
  4. 写回:将结果写入寄存器R1

问题与思考:

  • 为什么需要寄存器?
  • 内存访问为什么比寄存器访问慢?

答案:
寄存器位于CPU内部,访问速度最快(1个时钟周期),而内存访问需要通过总线,延迟较高(数十个时钟周期)。

1.1.3 内存层次结构

现代计算机采用多层次内存结构来平衡速度和容量:

pyramid
    title 内存层次结构
    "寄存器" : 1
    "L1缓存" : 10
    "L2缓存" : 100
    "L3缓存" : 1000
    "主内存" : 10000
    "硬盘存储" : 100000

各层特点:

层次容量速度成本
寄存器KB级最快最高
L1缓存32-64KB很快很高
L2缓存256KB-1MB
L3缓存8-32MB较快较高
主内存GB级中等中等
硬盘TB级

1.2 操作系统原理

1.2.1 操作系统的作用

操作系统是硬件和应用程序之间的桥梁,主要功能包括:

mindmap
  root((操作系统))
    进程管理
      进程调度
      进程通信
      进程同步
    内存管理
      虚拟内存
      内存分配
      内存保护
    文件系统
      文件操作
      目录管理
      权限控制
    设备管理
      驱动程序
      I/O调度
      设备抽象

1.2.2 进程与线程

进程(Process):程序的执行实例,拥有独立的内存空间。

线程(Thread):进程内的执行单元,共享进程的内存空间。

进程2
进程1
线程3
线程4
内存空间2
线程1
线程2
内存空间1

示例:Android应用进程结构

// Android应用主进程
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 主线程(UI线程)
        runOnUiThread(() -> {
            // UI操作
        });
        
        // 创建工作线程
        new Thread(() -> {
            // 后台任务
        }).start();
    }
}

1.2.3 虚拟内存机制

虚拟内存为每个进程提供独立的地址空间,通过页表将虚拟地址映射到物理地址。

物理内存
页表
虚拟内存
物理地址1
物理地址2
物理地址3
地址映射表
虚拟地址1
虚拟地址2
虚拟地址3

虚拟内存的优势:

  1. 内存保护:进程间内存隔离
  2. 内存扩展:支持比物理内存更大的地址空间
  3. 内存共享:多个进程可以共享同一物理页面

1.3 安卓系统架构

1.3.1 安卓系统层次结构

安卓系统采用分层架构设计,从底层到顶层包含以下层次:

graph TB
    subgraph Layer4[应用层 Applications]
        APP1[系统应用]
        APP2[第三方应用]
    end
    
    subgraph Layer3[应用框架层 Application Framework]
        AM[Activity Manager]
        WM[Window Manager]
        CM[Content Manager]
        VM[View System]
    end
    
    subgraph Layer2[系统运行库层 Libraries & Runtime]
        ART[Android Runtime]
        LIB[Native Libraries]
    end
    
    subgraph Layer1[硬件抽象层 HAL]
        HAL1[Camera HAL]
        HAL2[Audio HAL]
        HAL3[Sensor HAL]
    end
    
    subgraph Layer0[Linux内核层 Linux Kernel]
        DRIVER[设备驱动]
        MM[内存管理]
        PM[进程管理]
    end
    
    Layer4 --> Layer3
    Layer3 --> Layer2
    Layer2 --> Layer1
    Layer1 --> Layer0

1.3.2 Linux内核层

安卓基于Linux内核,提供核心系统服务:

主要功能模块:

// Linux内核主要子系统
struct kernel_subsystems {
    struct process_manager pm;      // 进程管理
    struct memory_manager mm;       // 内存管理
    struct file_system fs;          // 文件系统
    struct network_stack net;       // 网络协议栈
    struct device_drivers drivers;  // 设备驱动
    struct security_module security; // 安全模块
};

示例:查看安卓设备内核信息

# 通过adb查看内核版本
adb shell cat /proc/version

# 输出示例:
# Linux version 4.14.180-g18e4cea94a9e 
# (android-build@abfarm-01) (gcc version 4.9.x 20150123) 
# #1 SMP PREEMPT Mon Jul 15 14:03:54 UTC 2019

1.3.3 硬件抽象层(HAL)

HAL为上层提供统一的硬件接口,屏蔽硬件差异:

// HAL接口示例:相机模块
typedef struct camera_module {
    struct hw_module_t common;
    
    int (*get_number_of_cameras)(void);
    int (*get_camera_info)(int camera_id, struct camera_info *info);
    int (*set_callbacks)(const camera_module_callbacks_t *callbacks);
    void (*get_vendor_tag_ops)(vendor_tag_ops_t* ops);
    int (*open_legacy)(const struct hw_module_t* module, const char* id,
                       uint32_t halVersion, struct hw_device_t** device);
    int (*set_torch_mode)(const char* camera_id, bool enabled);
    int (*init)();
} camera_module_t;

1.3.4 系统运行库层

Android Runtime (ART)

ART是安卓的运行时环境,负责执行应用程序:

Android Runtime
DEX字节码
AOT编译器
JIT编译器
垃圾回收器
虚拟机
Java源码
javac编译
.class文件
dx工具
本地机器码

ART vs Dalvik对比:

特性DalvikART
编译方式JITAOT + JIT
安装时间较慢
运行速度较慢
内存占用较少较多
电池续航较差更好
Native Libraries

系统运行库提供核心功能支持:

// 主要Native库示例
#include <libc.h>          // C标准库
#include <libm.h>          // 数学库
#include <libssl.h>        // SSL/TLS库
#include <libsqlite.h>     // SQLite数据库
#include <libwebkit.h>     // WebKit浏览器引擎
#include <libmedia.h>      // 媒体框架
#include <libgl.h>         // OpenGL ES图形库

1.3.5 应用框架层

应用框架层为应用开发提供高级API:

// 主要框架组件
public class AndroidFramework {
    // Activity管理器
    ActivityManager activityManager;
    
    // 窗口管理器
    WindowManager windowManager;
    
    // 内容提供者管理器
    ContentResolver contentResolver;
    
    // 包管理器
    PackageManager packageManager;
    
    // 资源管理器
    Resources resources;
    
    // 位置管理器
    LocationManager locationManager;
    
    // 通知管理器
    NotificationManager notificationManager;
}

示例:Activity生命周期

public class ExampleActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Lifecycle", "onCreate called");
        // 初始化UI
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        Log.d("Lifecycle", "onStart called");
        // Activity变为可见
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        Log.d("Lifecycle", "onResume called");
        // Activity获得焦点
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        Log.d("Lifecycle", "onPause called");
        // Activity失去焦点
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        Log.d("Lifecycle", "onStop called");
        // Activity不可见
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Lifecycle", "onDestroy called");
        // Activity被销毁
    }
}

1.4 安卓应用程序结构

1.4.1 APK文件结构

APK(Android Package)是安卓应用的安装包格式:

MyApp.apk
├── AndroidManifest.xml     # 应用清单文件
├── classes.dex            # Dalvik字节码
├── resources.arsc         # 编译后的资源
├── res/                   # 资源目录
│   ├── drawable/         # 图片资源
│   ├── layout/           # 布局文件
│   ├── values/           # 值资源
│   └── ...
├── assets/               # 原始资源文件
├── lib/                  # Native库
│   ├── arm64-v8a/       # 64位ARM架构
│   ├── armeabi-v7a/     # 32位ARM架构
│   └── x86/             # x86架构
├── META-INF/            # 签名信息
│   ├── CERT.RSA         # 证书
│   ├── CERT.SF          # 签名文件
│   └── MANIFEST.MF      # 清单文件
└── ...

1.4.2 应用组件

安卓应用由四大组件构成:

mindmap
  root((安卓四大组件))
    Activity
      用户界面
      生命周期管理
      Intent通信
    Service
      后台服务
      长期运行任务
      跨进程通信
    BroadcastReceiver
      系统广播
      应用间通信
      事件响应
    ContentProvider
      数据共享
      跨应用访问
      统一接口

示例:组件声明

<!-- AndroidManifest.xml -->
<application>
    <!-- Activity声明 -->
    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    <!-- Service声明 -->
    <service
        android:name=".MyService"
        android:enabled="true"
        android:exported="false" />
    
    <!-- BroadcastReceiver声明 -->
    <receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    
    <!-- ContentProvider声明 -->
    <provider
        android:name=".MyProvider"
        android:authorities="com.example.myprovider"
        android:enabled="true"
        android:exported="false" />
</application>

1.4.3 应用权限系统

安卓采用基于权限的安全模型:

<!-- 权限声明示例 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

权限分类:

  1. 正常权限:不涉及用户隐私,自动授予
  2. 危险权限:涉及用户隐私,需要用户授权
  3. 签名权限:只有相同签名的应用才能获得
  4. 系统权限:只有系统应用才能获得

示例:运行时权限请求

public class PermissionExample extends AppCompatActivity {
    private static final int CAMERA_PERMISSION_REQUEST = 1001;
    
    private void requestCameraPermission() {
        if (ContextCompat.checkSelfPermission(this, 
                Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            
            // 请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA},
                    CAMERA_PERMISSION_REQUEST);
        } else {
            // 权限已授予,执行相机操作
            openCamera();
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                         String[] permissions,
                                         int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        
        if (requestCode == CAMERA_PERMISSION_REQUEST) {
            if (grantResults.length > 0 && 
                grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限被授予
                openCamera();
            } else {
                // 权限被拒绝
                showPermissionDeniedMessage();
            }
        }
    }
}

1.5 安卓安全机制

1.5.1 应用沙箱

每个安卓应用运行在独立的沙箱环境中:

graph TB
    subgraph Sandbox1[应用沙箱1]
        APP1[应用1]
        UID1[UID: 10001]
        DATA1[私有数据目录]
    end
    
    subgraph Sandbox2[应用沙箱2]
        APP2[应用2]
        UID2[UID: 10002]
        DATA2[私有数据目录]
    end
    
    subgraph Kernel[Linux内核]
        PERM[权限检查]
        IPC[进程间通信]
    end
    
    Sandbox1 --> Kernel
    Sandbox2 --> Kernel

沙箱特性:

  • 每个应用分配唯一的用户ID(UID)
  • 应用只能访问自己的私有数据
  • 跨应用通信需要通过系统API
  • 文件权限基于Linux用户权限模型

1.5.2 代码签名

所有安卓应用必须进行数字签名:

# 生成密钥库
keytool -genkey -v -keystore my-release-key.keystore \
        -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

# 签名APK
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \
          -keystore my-release-key.keystore my_application.apk alias_name

# 验证签名
jarsigner -verify -verbose -certs my_application.apk

签名验证过程:

APK文件PackageManager证书验证器安装器请求安装验证签名检查证书有效性验证文件完整性验证结果执行安装安装完成拒绝安装alt[验证成功][验证失败]APK文件PackageManager证书验证器安装器

1.5.3 SELinux安全增强

安卓集成了SELinux(Security-Enhanced Linux)提供强制访问控制:

# 查看SELinux状态
adb shell getenforce
# 输出:Enforcing

# 查看进程SELinux上下文
adb shell ps -Z
# 输出示例:
# u:r:system_server:s0    system    1234  1  ... system_server
# u:r:untrusted_app:s0:c123,c456,c789,c1011  u0_a123  5678  ... com.example.app

SELinux策略示例:

# 允许untrusted_app域访问app_data_file类型的文件
allow untrusted_app app_data_file:file { read write open };

# 禁止untrusted_app域访问system_file类型的文件
neverallow untrusted_app system_file:file write;

1.6 实践练习

练习1:分析设备架构信息

目标:通过ADB命令了解安卓设备的硬件和系统信息。

步骤

# 1. 连接设备
adb devices

# 2. 查看CPU架构
adb shell cat /proc/cpuinfo

# 3. 查看内存信息
adb shell cat /proc/meminfo

# 4. 查看系统版本
adb shell getprop ro.build.version.release

# 5. 查看设备型号
adb shell getprop ro.product.model

# 6. 查看安装的应用列表
adb shell pm list packages

预期输出分析

  • CPU信息显示处理器型号、核心数、频率等
  • 内存信息显示总内存、可用内存、缓存等
  • 系统属性显示安卓版本、设备信息等

练习2:APK基础分析

目标:使用工具分析APK文件结构。

准备工作

# 下载示例APK(可以使用任何合法的APK文件)
# 这里以系统计算器为例
adb shell pm path com.android.calculator2
# 输出:package:/system/app/Calculator/Calculator.apk

# 拉取APK文件
adb pull /system/app/Calculator/Calculator.apk ./calculator.apk

分析步骤

# 1. 查看APK文件信息
file calculator.apk
# 输出:calculator.apk: Zip archive data, at least v2.0 to extract

# 2. 解压APK查看结构
unzip -l calculator.apk | head -20

# 3. 使用aapt工具分析
aapt dump badging calculator.apk

# 4. 查看AndroidManifest.xml
aapt dump xmltree calculator.apk AndroidManifest.xml

可能遇到的问题

  1. 问题:aapt命令未找到
    解决:安装Android SDK Build Tools

    # 在Android SDK目录下
    export PATH=$PATH:$ANDROID_HOME/build-tools/30.0.3
    
  2. 问题:APK文件损坏
    解决:重新下载或使用其他APK文件

练习3:进程和内存分析

目标:观察安卓应用的进程和内存使用情况。

# 1. 启动目标应用
adb shell am start -n com.android.calculator2/.Calculator

# 2. 查看应用进程
adb shell ps | grep calculator

# 3. 查看内存使用
adb shell dumpsys meminfo com.android.calculator2

# 4. 查看应用详细信息
adb shell dumpsys package com.android.calculator2

输出分析

  • 进程信息包含PID、PPID、用户ID等
  • 内存信息显示堆内存、栈内存、共享内存等使用情况
  • 包信息显示权限、组件、签名等详细信息

1.7 常见问题与解答

Q1:为什么安卓使用Linux内核而不是其他操作系统内核?

A1:Linux内核具有以下优势:

  • 开源免费:降低开发成本
  • 成熟稳定:经过长期验证的内核
  • 硬件支持广泛:支持多种CPU架构
  • 安全机制完善:用户权限、进程隔离等
  • 社区支持强大:持续的更新和维护

Q2:ART相比Dalvik有哪些具体改进?

A2:主要改进包括:

方面DalvikART
编译时机运行时JIT编译安装时AOT编译 + 运行时JIT
启动速度较慢(需要编译)快(已编译为机器码)
内存效率较低更高(改进的GC算法)
调试支持基础调试增强的调试和性能分析
64位支持有限完整支持

Q3:安卓权限系统如何防止恶意应用?

A3:多层防护机制:

  1. 安装时权限检查:用户可以看到应用请求的权限
  2. 运行时权限:敏感权限需要用户实时授权
  3. 权限分组:相关权限归为一组,简化用户决策
  4. 权限撤销:用户可以随时撤销已授予的权限
  5. 应用沙箱:即使获得权限,也限制在沙箱内

Q4:如何理解安卓的分层架构设计?

A4:分层架构的优势:

  • 模块化:每层职责明确,便于维护
  • 可移植性:HAL层屏蔽硬件差异
  • 可扩展性:可以独立升级某一层
  • 安全性:层间访问控制,提高安全性
  • 开发效率:上层开发者无需关心底层实现

1.8 本章小结

本章介绍了安卓逆向工程的基础知识,包括:

  1. 计算机体系结构:理解CPU、内存、指令执行等基本概念
  2. 操作系统原理:掌握进程、线程、虚拟内存等核心机制
  3. 安卓系统架构:了解安卓的分层设计和各层功能
  4. 应用程序结构:熟悉APK格式和四大组件
  5. 安全机制:理解沙箱、签名、权限等安全特性

这些基础知识为后续的逆向分析工作奠定了坚实的理论基础。在下一章中,我们将学习编程基础和开发工具链的使用。

学习检查清单

  • 理解冯·诺依曼架构的基本组成
  • 掌握指令执行周期的四个阶段
  • 了解内存层次结构的特点
  • 熟悉安卓系统的分层架构
  • 理解ART运行时的工作原理
  • 掌握安卓四大组件的作用
  • 了解安卓权限系统的机制
  • 能够使用ADB进行基础的设备分析

延伸阅读

  • 《深入理解计算机系统》- Randal E. Bryant
  • 《Android系统源代码情景分析》- 罗升阳
  • 《Android安全攻防权威指南》- Joshua J. Drake
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值