第1章:计算机系统与安卓架构基础
1.1 计算机体系结构基础
1.1.1 冯·诺依曼架构
计算机体系结构是理解安卓逆向工程的基石。现代计算机基于冯·诺依曼架构,该架构包含以下核心组件:
核心概念解析:
- 中央处理器(CPU):执行指令和数据处理
- 内存(Memory):存储程序和数据
- 存储器(Storage):永久保存数据
- 输入/输出设备:与外界交互
1.1.2 指令执行周期
CPU执行指令遵循固定的周期:
示例:简单加法指令执行过程
ADD R1, R2, R3 ; R1 = R2 + R3
执行步骤:
- 取指令:从内存地址0x1000读取指令
ADD R1, R2, R3 - 译码:识别为加法操作,操作数为R2和R3,结果存入R1
- 执行:ALU计算R2 + R3
- 写回:将结果写入寄存器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):进程内的执行单元,共享进程的内存空间。
示例: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.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是安卓的运行时环境,负责执行应用程序:
ART vs Dalvik对比:
| 特性 | Dalvik | ART |
|---|---|---|
| 编译方式 | JIT | AOT + 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" />
权限分类:
- 正常权限:不涉及用户隐私,自动授予
- 危险权限:涉及用户隐私,需要用户授权
- 签名权限:只有相同签名的应用才能获得
- 系统权限:只有系统应用才能获得
示例:运行时权限请求
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
签名验证过程:
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
可能遇到的问题:
-
问题:aapt命令未找到
解决:安装Android SDK Build Tools# 在Android SDK目录下 export PATH=$PATH:$ANDROID_HOME/build-tools/30.0.3 -
问题: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:主要改进包括:
| 方面 | Dalvik | ART |
|---|---|---|
| 编译时机 | 运行时JIT编译 | 安装时AOT编译 + 运行时JIT |
| 启动速度 | 较慢(需要编译) | 快(已编译为机器码) |
| 内存效率 | 较低 | 更高(改进的GC算法) |
| 调试支持 | 基础调试 | 增强的调试和性能分析 |
| 64位支持 | 有限 | 完整支持 |
Q3:安卓权限系统如何防止恶意应用?
A3:多层防护机制:
- 安装时权限检查:用户可以看到应用请求的权限
- 运行时权限:敏感权限需要用户实时授权
- 权限分组:相关权限归为一组,简化用户决策
- 权限撤销:用户可以随时撤销已授予的权限
- 应用沙箱:即使获得权限,也限制在沙箱内
Q4:如何理解安卓的分层架构设计?
A4:分层架构的优势:
- 模块化:每层职责明确,便于维护
- 可移植性:HAL层屏蔽硬件差异
- 可扩展性:可以独立升级某一层
- 安全性:层间访问控制,提高安全性
- 开发效率:上层开发者无需关心底层实现
1.8 本章小结
本章介绍了安卓逆向工程的基础知识,包括:
- 计算机体系结构:理解CPU、内存、指令执行等基本概念
- 操作系统原理:掌握进程、线程、虚拟内存等核心机制
- 安卓系统架构:了解安卓的分层设计和各层功能
- 应用程序结构:熟悉APK格式和四大组件
- 安全机制:理解沙箱、签名、权限等安全特性
这些基础知识为后续的逆向分析工作奠定了坚实的理论基础。在下一章中,我们将学习编程基础和开发工具链的使用。
学习检查清单:
- 理解冯·诺依曼架构的基本组成
- 掌握指令执行周期的四个阶段
- 了解内存层次结构的特点
- 熟悉安卓系统的分层架构
- 理解ART运行时的工作原理
- 掌握安卓四大组件的作用
- 了解安卓权限系统的机制
- 能够使用ADB进行基础的设备分析
延伸阅读:
- 《深入理解计算机系统》- Randal E. Bryant
- 《Android系统源代码情景分析》- 罗升阳
- 《Android安全攻防权威指南》- Joshua J. Drake

被折叠的 条评论
为什么被折叠?



