Android安全技术揭秘与防范
Android安全技术揭秘与防范
本书的结构
本书面向的读者
1 Android简介
1.1 Android的发展历史
1.2 Android系统进化史
1.2.1 Nexus系列
1.2.2 国产定制系统
1.2.2.1 国产ROM
1.2.2.2 手机桌面
1.2.3 Android的开放与安全
1.2.4 移动互联网的趋势
● Android将覆盖智能穿戴设备
● 手机将变为物联网的控制中心
● 传统行业在移动互联网上将有突破
● 移动开发将变得傻瓜化与复杂化
1.3 Android和iOS系统对比
1.3.1 系统架构对比
1.3.2 Android和iOS安全对比
1.3.2.1 Android系统安全性分析
1.3.2.2 iOS系统安全性分析
2 Android地下产业链分析
2.1 钱从哪里来
2.1.1 恶意吸费
2.1.2 广告、恶意推广
2.1.3 诱骗欺诈
2.1.4 隐私窃取
2.1.5 安装包分析
2.2 安全的发展趋势
2.2.1 系统级别的杀毒
2.2.2 应用市场的监管
2.2.3 智能硬件安全
3 理解Android系统
3.1 Android系统的层级架构
3.1.1 应用层
3.1.2 框架层
3.1.3 核心库与运行环境层
● C库
● 多媒体框架(MediaFramework)
● SGL
● SSL
● OpenGL ES 1.0
● 界面管理工具(Surface Management)
● SQLite
● WebKit
● FreeType
3.1.4 Linux内核层
● 显示驱动(Display Driver)
● Flash内存驱动(Flash Memory Driver)
● 照相机驱动(Camera Driver)
● 音频驱动(Audio Driver)
● WiFi驱动(Camera Driver)
● 键盘驱动(KeyBoard Driver)
● 蓝牙驱动(Bluetooth Driver)
● Power Management(能源管理)
3.1.5 Android系统的分区结构
● Boot Loader分区
● Boot分区
● Splash分区
● Radio分区
● Recovery分区
● System分区
● User Data分区
● Cache分区
3.2 启动过程
3.2.1 Boot Loader加载阶段
3.2.2 加载Kernel与initrd阶段
3.2.3 初始化设备服务阶段
3.2.4 加载系统服务阶段
3.2.5 虚拟机初始化阶段
3.2.6 启动完成阶段
3.3 系统关键进程与服务
3.3.1 系统第一个进程init详解
3.3.1.1 初始化脚本init.rc
3.3.1.2 属性服务
3.3.2 ADB进程
3.3.3 存储类守护进程Vold
● 创建链接
● 引导
● 事件处理
3.3.4 进程母体Zygote
3.3.5 服务管理器ServiceMananger
3.3.6 进程复制Android Fork
3.3.7 进程间通信Binder机制
3.3.8 匿名共享内存机制Ashmem
3.3.9 日志服务Logger
3.4 APK生成
3.4.1 编译过程
3.4.2 打包过程
3.4.3 签名优化过程
3.5 系统安全执行边界
3.5.1 沙箱隔离机制
3.5.2 权限授予机制
3.5.2.1 API权限
####### ● android:description
####### ● android🏷️
####### ● android:name
####### ● android:permissionGroup
####### ● android:protectionLevel
3.5.2.2 文件权限
3.5.2.3 IPC权限
3.5.3 数字签名机制
3.5.3.1 数字签名的优点
####### ● 程序升级
####### ● 模块化设计和开发
####### ● 共享数据和代码
3.5.3.2 如何签名
3.5.3.3 怎样验证签名
3.5.3.4 APK签名比对的应用场景
3.6 系统的安全结构
3.6.1 Android应用程序安全
3.6.2 主要的应用组件
3.6.2.1 Android项目清单文件AndroidManifest.xml
3.6.2.2 Intents
3.6.3 四大组件模型
3.6.3.1 Activity
3.6.3.2 Service
3.6.3.3 Content Provider
3.6.3.4 Broadcast Receiver
3.6.4 Android框架层
3.6.5 Dalvik虚拟机
3.7 Android 5.0(Lollipop)的安全架构
3.7.1 加强型内核SEAndroid
3.7.2 安全的锁屏
3.7.3 充分的加密
3.7.4 Android5.0安全总结
4 Root你的设备
4.1 获取Root权限原理
4.1.1 su源码分析
4.1.2 Root后手机对比
4.1.3 Root思路
4.1.4 Root漏洞
RageAgainstTheCage漏洞
4.1.5 已经发现的Root漏洞
4.1.6 SuperUser分析
4.1.7 Root安全
4.2 Root的分类
4.2.1 临时Root
4.2.2 永久Root
4.2.3 删除Root
4.2.4 免Root
4.3 Root之后
4.3.1 静默安装
● Android应用安装有4种方式
● 应用安装的流程及路径
● 安装过程
● 卸载过程
4.3.1.1 调用PackageInstaller中隐藏的API
4.3.1.2 使用pm命令安装
4.3.2 删除预装
4.3.3 键盘监控
4.3.4 短信拦截与静默发送
● 短信拦截
● 短信静默发送
4.3.5 电话监控
5 APK静态分析
5.1 什么是静态分析
5.2 常用分析利器
5.2.1 资源逆向工具AXMLPrinter 2
5.2.2 查看源码工具dex2jar、jd-GUI
5.2.3 APK逆向工具APKTool
5.2.4 Android逆向助手
5.2.5 反汇编工具IDA PRO
5.2.6 超级编辑器UltraEdit
5.3 认识APK文件
5.3.1 App的种类
5.3.1.1 原生App
5.3.1.2 网页App(Web App)
5.3.1.3 混合App(Hybrid App)
5.3.2 反编译前结构
5.3.3 反编译后结构
5.4 分析DEX文件
5.4.1 认识DEX
DEX文件结构
5.4.2 虚拟机指令Smali简介
5.4.3 Smali与Java对比
5.4.4 Smali语法基础
5.4.5 常用的Smali 注入代码
5.4.5.1 增加调试Log 信息
5.4.5.2 弹出AlertDialog消息框
5.5 分析SO文件
5.5.1 NDK开发流程
5.5.2 开始反汇编
5.5.2.1 什么是反汇编
5.5.2.2 开始反汇编
5.5.3 尝试修改SO文件逻辑
5.6 收集信息定位关键代码
5.6.1 AndroidManifest.xml突破
5.6.1.1 Applicatioin类
5.6.1.2 MainActivity类
5.6.1.3 特殊的Permission
5.6.2 特殊关键字突破
5.6.3 资源索引突破
5.7 开始篡改代码
5.7.1 尝试篡改逻辑
5.7.2 广告植入与去除
5.7.3 收费限制破解
5.7.4 应用程序汉化
5.7.5 篡改逻辑小结
6 ARM汇编速成
6.1 抽象层次
6.1.1 计算机体系结构
6.1.2 常见嵌入式处理器
6.1.2.1 嵌入式微处理器 MPU
6.1.2.2 嵌入式微控制器MCU
6.1.2.3 嵌入式DSP处理器
6.1.2.4 片上系统SOC
6.1.3 ndroid支持处理器情况
6.2 逆向工程
6.2.1 计算机层级
6.2.2 汇编语言
6.2.2.1 GCC编译过程
6.2.3 反汇编的理解
6.2.4 RM汇编语言模块的结构
6.2.5 简单的ARM程序
6.3 ARM体系结构
6.3.1 RM微处理器的工作状态
6.3.2 RM体系结构的存储器格式
● 大端格式
● 小端格式
6.3.3 指令长度及数据类型
6.3.4 处理器模式
6.3.5 RM状态下寄存器组织
6.3.5.1 未分组寄存器R0~R7
6.3.5.2 分组寄存器R8~R14
6.3.5.3 程序计数器PC(R15)
6.3.5.4 寄存器R16
6.3.6 Thumb状态下的寄存器组织
6.4 ARM微处理器的指令集概述
6.4.1. RM指令的助记符
6.4.2 程序状态寄存器
6.4.2.1 条件码标志
6.4.2.2 控制位
6.4.2.3 保留位
6.4.3 指令的条件域
6.4.4 RM指令的寻址方式
6.4.4.1 立即寻址
6.4.4.2 寄存器寻址
6.4.4.3 寄存器间接寻址
6.4.4.4 基址变址寻址
6.4.4.5 多寄存器寻址
6.4.4.6 相对寻址
6.4.4.7 堆栈寻址
6.5 Thumb指令及应用
6.5.1 Thumb指令集特点
6.5.2 RM与Thumb状态切换
6.5.3 Thumb指令集格式
6.5.4 Thmub指令的十六进制值计算
6.6 快速识别ARM汇编中的C/C++逻辑
6.6.1 识别if-else判断逻辑
6.6.2 识别while-do循环逻辑
6.6.3 识别for循环逻辑
6.6.4 识别switch-case分支逻辑
7 APK动态分析
7.1 应用体系架构
7.1.1 代码安全分析
7.1.2 组件安全分析
7.1.3 存储安全分析
7.1.4 通信安全分析
7.2 DDMS调试
7.2.1 使用Log进行逻辑跟踪
● 打开Log
● 读取Log
● 注入Log
7.2.2 不安全的本地存储
7.2.3 使用TraceView进行方法跟踪
7.3 网络抓包
7.3.1 抓包工具Fiddler简介
7.3.2 抓包的原理
7.3.3 如何在Android上进行抓包
7.3.4 设置断点修改请求
7.3.4.1 修改Request
7.3.4.2 AutoResponder修改Response
7.4 使用AndBug断点调试
7.4.1 配置AndBug环境
7.4.2 AndBug常用命令
7.4.3 AndBug调试步骤
7.4.4 开始断点调试
7.4.4.1 确定需要调试的类与方法
7.4.4.2 查找定位方法
7.4.4.3 设置断点
7.4.4.4 断点分析查看变量值
7.5 使用IDA Pro进行动态调试
7.5.1 使用IDA动态调试原生库so
7.5.1.1 在Android设备上运行android_server程序
7.5.1.2 使用adb forward命令进行端口转发
7.5.1.3 使用IDA Pro附上目标应用程序
7.5.1.4 计算查找对应的函数起始地址
7.5.2 使用IDA动态调试dex
7.6 调试WebViewApp
7.6.1 Chrome插件调试
7.6.2 WebView已知漏洞
7.6.3 HTML安全
7.6.4 网络钓鱼
7.6.5 SQL注入攻击
8动态注入技术
8.1 什么是Hook技术
8.1.1 Hook原理
8.1.1.1 Hook工作流程
8.1.1.2 ptrace函数
8.1.2 Hook的种类
8.1.2.1 Java层API Hook
8.1.2.2 Native层So库Hook
8.1.2.3 全局Hook
8.1.3 Hook的危害
8.2 常用的Hook工具
8.2.1 Xposed框架
● 安装本地服务XposedInstaller
● 下载使用API库
8.2.2 CydiaSubstrate框架
● 安装Cydiastrate框架Android本地服务
● 下载使用Cydiasubstrate库
8.2.3 ADBI/DDI框架
8.3 HookAndroid应用
8.3.1 尝试Hook系统API
8.3.2 Hook指定应用注入广告
8.3.3 App登录劫持
8.4 Hook原生应用程序
8.4.1 CydiaSubstrate框架针对Native层Hook的支持
8.4.2 通过JNI改变系统颜色
8.4.3 Hook后替换指定应用中的原生方法
8.4.4 使用Hook进行广告拦截
8.5 Hook检测/修复
8.5.1 Hook检测
8.5.2 Hook修复
8.5.3 Hook检测小结
9 应用加固与渗透测试
9.1 防止利用系统组件漏洞
9.1.1 Activity编码安全
9.1.1.1 私有Activity
9.1.1.2 公共Activity
9.1.1.3 伙伴Activity
9.1.1.4 内部Activity
9.1.2 Brocast Recevier编码安全
9.1.2.1 私有Brocast Receiver
9.1.2.2 公共Brocast Receiver
9.1.2.3 内部Brocast Receiver
9.1.3 Service编码安全
9.1.3.1 私有Service
9.1.3.2 公共Service
9.1.3.3 合作Service
9.1.3.4 内部Service
9.1.4 Provider编码安全
9.1.4.1 私有Content Provider
9.1.4.2 公共Content Provider
9.1.4.3 合作Content Provider
9.1.4.4 内部Content Provider
9.1.4.5 部分 Content Provider
9.2 防止逆向
9.2.1 代码混淆
9.2.1.1 ProGuard简介
####### ● 参数
####### ● 保留选项
####### ● 压缩
####### ● 优化
####### ● 混淆
9.2.1.2 使用ProGuard
9.2.1.3 混淆带来的问题
9.2.2 DEX保护
9.2.2.1 DEX优化与混淆处理
9.2.2.2 什么是加壳
9.2.3 SO文件保护
9.2.4 防止jd-GUI查看代码
9.2.5 防止二次打包
9.2.5.1 如何防止二次打包
9.2.5.2 常用的验证策略
9.3 防止动态分析
9.3.1 检测运行环境
9.3.2 防止进行动态注入
9.4 Android渗透测试
9.4.1 渗透测试步骤
● 被动测试阶段
● 主动测试阶段
9.4.2 渗透测试工具
9.4.2.1 安全评估框架drozer
9.4.2.2 瑞士军刀Busybox
9.4.2.3 集成化工具
9.4.3 应用程序渗透测试
10 系统安全措施
10.1 启动验证
10.2 磁盘加密
10.2.1 加密模式
10.2.2 密钥的生成
10.3 屏幕安全
● 滑动解锁
● 密码锁
● PIN锁
● 图形锁
10.3.1 图形同虚设的屏幕锁
10.3.2 密码锁
10.3.3 PIN锁
10.4 USB调试安全
10.4.1 ADB概况
10.4.2 为什么ADB需要安全
10.4.3 ADB安全
10.4.4 ADB的安全措施
10.4.5 ADB认证秘钥
10.5 增强型内核SELinux/SEAndroid
10.5.1 SELinux架构
10.5.2 传统的Linux的不足之处
● 存在特权用户root
● 对于文件的访问权的划分不够细
● SUID程序的权限升级
● DAC(Discretionarv Access Control)问题
10.5.3 SELinux的特点
● MAC(Mamdatory Access Control)对访问的控制强制化
● TE(TypeEnforcement)对于进程只赋予最小的权限
● domain迁移、防止权限升级
● RBAC(Role Base Access Control),对于用户只赋予最小的权限
10.5.4 SELinux的运行模式
● 主体(Subject)
● 目标(Object)
● 策略(Policy)
● 安全上下文(Security Context)
● 身份识别(Identify)
● 角色(Role)
● 安全类型(Type)
● 安全等级
10.5.5 SELinux的启动、关闭与观察
● Enforcing
● Permissive
● Disabled
11 内核攻击与防护
11.1 Rootkit是什么
11.1.1 Rootkit概述
11.1.1.1 进程调度
11.1.1.2 内存管理
11.1.1.3 虚拟文件系统(VFS)
11.1.1.4 网络
11.1.1.5 进程间通信(IPC)
11.1.2 Linux可加载的内核模块
11.1.3 剖析内核模块
11.1.4 了解内核模块对象
11.1.5 LKM的生命周期
11.1.6 系统调用机制
11.1.7 SWI中断
11.1.8 Linux系统调用规范
11.1.9 系统接口重定向
11.1.10 虚拟文件系统
11.2 Android电话系统
11.2.1 Android电话子系统体系结构
● Android/telephony
● com/Android/internal/telephony
● RIL 守护进程
● libril 库
● ril 实现库
● AT 命令通道
● 数据传输通道
11.2.2 Android电话子系统工作流程
11.2.3 内核级Rootkit攻击位置
11.3 开始攻击内核
● 隐蔽性高
● 占用资源少
● 简单易用
11.3.1 环境搭建
11.3.2 第一个自定义内核程序
11.3.3 隐藏潜伏模块
11.3.3.1 屏蔽lsmode
11.3.3.2 文件系统隐藏
11.3.3.3 网络连接的隐藏
11.3.4 操纵内核模块
11.3.4.1 AT 命令简介
11.3.4.2 AT 命令攻击
11.3.5 信息收集模块
11.4 内核级Rootkit检测
11.4.1 常用的 Rootkit 检测方法
11.4.2 Android Rootkit检测系统模型
11.4.3 LKM模块检测
11.4.4 电话子系统攻击检测
11.5 Rootkit的植入与启动
11.5.1 Rootkit的植入
11.5.2 Rootkit的启动
11.5.3 Rootkit小结
附录A ARM指令集
A.1 跳转指令
A.1.1 B指令
A.1.2 BL指令
A.1.3 BLX指令
A.1.4 BX指令
A.2 数据处理指令
A.2.1 MOV指令
A.2.2 MVN指令
A.2.3 CMP指令
A.2.4 CMN指令
A.2.5 TST指令
A.2.6 TEQ 指令
A.2.7 ADD 指令
A.2.8 ADC 指令
A.2.9 SUB指令
A.2.10 SBC 指令
A.2.11 RSB指令
A.2.12 RSC指令
A.2.13 AND指令
A.2.14 ORR指令
A.2.15 EOR指令
A.2.16 BIC指令
A.3 乘法指令与乘加指令
A.3.1 MUL指令
A.3.2 MLA指令
A.3.3 SMULL 指令
A.3.4 SMLAL 指令
A.3.5 UMULL指令
A.3.6 UMLAL 指令
A.4 程序状态寄存器访问指令
A.4.1 MRS指令
A.4.2 MSR指令
A.5 加载/存储指令
A.5.1 LDR 指令
A.5.2 LDRB 指令
A.5.3 LDRH 指令
A.5.4 STR 指令
A.5.5 STRB 指令
A.5.6 STRH 指令
A.6 批量数据加载/存储指令
LDM(或 STM)指令
A.7 数据交换指令
A.7.1 SWP指令
A.7.2 SWPB指令
A.8 移位指令(操作)
A.8.1 LSL(或ASL)操作
A.8.2 LSR操作
A.8.3 ASR操作
A.8.4 ROR 操作
A.8.5 RRX 操作
A.9 协处理器指令
A.9.1 CDP 指令
A.9.2 LDC指令
A.9.3 STC指令
A.9.4 MCR指令
A.9.5 MRC指令
A.10 异常产生指令
A.10.1 SWI指令
A.10.2 BKPT 指令
附录B ARM伪指令集
B.1 符号定义伪指令
B.1.1 GBLA、GBLL和GBLS指令
B.1.2 LCLA、LCLL和LCLS指令
B.1.3 SETA、SETL和SETS指令
B.1.4 RLIST指令
B.2 数据定义伪指令
B.2.1 DCB指令
B.2.2 DCW、DCWU指令
B.2.3 DCD、DCDU指令
B.2.4 DCFD、DCFDU指令
B.2.5 DCFS、DCFSU指令
B.2.6 DCQ、DCQU指令
B.2.7 SPACE指令
B.2.8 MAP指令
B.2.9 FILED指令
B.3 汇编控制伪指令
B.3.1 IF、ELSE、ENDIF指令
B.3.2 WHILE、WEND指令
B.3.3 MACRO、MEND指令
B.3.4 MEXIT指令
B.4 其他常用的伪指令
B.4.1 AREA指令
B.4.2 ALIGN指令
B.4.3 CODE16、CODE32指令
B.4.4 END指令
B.4.5 EQU指令
B.4.6 EXPORT、GLOBAL指令
B.4.7 IMPORT指令
B.4.8 EXTERN指令
B.4.9 GET、INCLUDE指令
B.4.10 INCBIN指令
B.4.11 RN指令
B.4.12 ROUT指令
看完了
思维导图
防止博客图床图片失效,防止图片源站外链:
http://www.processon.com/chart_image/5e5aa2dfe4b0cc44b5b46aaf.png)
思维导图在线编辑链接: