Android 安全
android课程大纲
1.安卓背景介绍(安卓生态圈简介、安卓安全架构、常用概念和技术) 2. 安卓分析环境与工具准备 3.逻辑代码保护与逆向技术的对抗(编译与反编译、加壳与脱壳、原生代码混淆与解混淆、隐藏与取证、Hook与注入) 4.应用层漏洞分析(组件、传输、存储、加密、凭证安全) 5. 安卓ROOT攻击:未加锁、锁定设备root 6.题目解析(直接逆向技术题目、原生层混淆题目、加脱壳技术题目)
android 生态圈简况
- 基于linux内核的开源操作系统
- 大家都可以DIY
- 应用市场管理不严
- 厂商安全补丁推送不及时,覆盖率低
Android 的优点:
开放、分享、可定制化程度高
android的整体架构:

大致分四层:从底层往上
- linux kernel
- Libraries和Android Runtime:Libraries:即C/C++函数库部分,大多数都是开放源代码的函数库,
- android application framework (应用软件架构),Java应用程序开发人员主要是使用该层封装好的API进行快速开发。
- 应用层 application 该层是Java的应用程序层
android的结构可以看这篇博客
android的安全模型:
-
基于 Linux 的用户隔离
区分 UID 和 UserID -
应用权限
-
代码签名
-
应用权限申请 -->通过Manifest.xml
-
SELinux
- Security Enhancements for Android
- 强制访问控制
- 核心系统守护进程和用户应用隔离到不同的domain
-
系统更新
- 解锁、BootLoader、Recovery负责刷写一些模块
- recovery是一个单独小型的system,可以访问所有的设备
- 通常只允许签名验证通过的刷写
- 解锁:允许替换recovery和系统镜像,将会清除所有用户数据
分析环境和常用的工具
-
santoku
基于linux的android取证、逆向、开发的平台
2014年就停止更新了 -
Android Studio
android应用的开发
APK分析,性能分析 -
JEB
- Android逆向工具 支持无源码调试,提供ARM 、Mips、Intel x86/64反编译支持
*用法:
直接将apk脱进jeb中就行了,然后它就会将自动分析apk包,然后按Q可以将Smali语言转换成java代码
- Android逆向工具 支持无源码调试,提供ARM 、Mips、Intel x86/64反编译支持
-
jadx
开源的dex文件反编译工具 -
Smali、BakSmali|、APKTool
返汇编常用工具,dex文件和smali代码的相互转换,apk文件的解包和打包- apktool用法:
在命令行用 apktool d filename.apk -f
- apktool用法:
-
dex2jar-2.0
将dex文件转化jar文件
在命令行使用:
./d2j-dex2jar.bat classes.dex --force to overwrite
-
jd-gui
将jar转换成源代码
将dex2jar得到的jar拖进去就可以看到源码了 -
IDA Pro
支持Dalvik指令集的反汇编
多用于动态调试Native代码
安卓代码分析和对抗
编译:正向了解apk的构建流程
反编译逆向:
- APK文件结构
- 本质是一个压缩包
- 常见文件
- Manifest.xml:清单文件,该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,
- META-INF:META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全
- classes.dex:是java源码编译后生成的java字节码文件(非传统JVM解释执行的class字节码)。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样
- res目录:存放原生资源文件
- assets目录:存放原生资源文件 ,可以存放一些配置文件(比如webview本地资源、图片资源、音视频等等),不会经过编译,和原始工程里面的文件是一致的,这些文件的内容在程序运行过程中可以通过相关的API(android.content.res.AssetManager)获得
- lib目录:lib目录下的子目录存放的是一些与手机CPU架构对应的C/C++代码编译生成的so文件,一般用于JNI开发。
理解什么是dex文件:
- Android 可执行文件
- java代码编译而来
- 包含Dalvik指令集
理解是smali代码:
- 有字节码返汇编得到的可阅读代码
smali语法:
可以看博客
- 每个smali文件代表一个类
- 开头
- .class <权限>[修饰]<类名>
- .super 父类
- .source 源文件名
- field 字段的定义
- .method 方法的定义
- java经过编译后几乎保留了所有的语义信息
JNI
- Java 与Native(C/C++)沟通的桥梁
- JNI的注册:
- 静态注册(名字对应)---Demo
- 动态注册( RegisterNativeMethods )
- JNI_ONLoad 加载so文件时调用
- 在加载so文件时被执行
native关键字 java声明函数的一个关键字,用于申明调用native层的函数
- Demo hiddendata
--
加壳技术:
- 利用动态代码加载技术去隐藏原本的dex文件
- 动态加载过程隐秘,且复杂度高
- 增加完整性检查,反调试措施
加壳的基础思路:
- 将加载后的东西立即删除
- dex不落地加载
- 使加载过程更加隐蔽
- 自己实现函数逻辑加载,不用系统API
Android提供的动态调试的方法:
- DexClassLoader: apk/jar/dex, 可以从 SD 卡加载
- PathClassLoader: 只能加载已安装到系统中(/data/app)的文件
动态调试的条件:
-
Android:debugger = "truce"
-
Android os
- ro.debuggable = 1
- boot.img->default.prop
- 模拟器或者userdebug编译
- mprop、BDOpner(Xposed模块)
-
无源码动态调试(JAVA层)
- smalidea(推荐)
- 使用android studio的sdk调试 abd
- IDA pro
- JEB
-
Native代码调试
*IDA Pro 利用IDA Pro的远程调试
方法跟踪
- Android本身提供了method tracing
- DDMS
- CPU profile
这个方法跟踪只记录函数调用信息,不记录参数信息,
脱壳技术:
-
运行时机:
- dex文件加载
- 类加载
- 方法执行
-
针对内存加密壳的脱壳技术:
- 暴力内存搜索
- 关键函数断点
- DexHunter
- AppSpear
要认识dex文件格式,了解dex的文件头
dex文件一般来说在内存中是连续的
- 暴力内存搜索
- dex文件在内存中有特征
- DexHunter magic
dex的加载流程:
- 验证dex的有效性
- 生成 odex
- 解析odex并生成相应的内存结构
生成odex时:
- dvmOptimizeDexFile
- 执行/bin/dexopt进行dex优化-->dvmContinueOptimization
dvmDexFileOpenPartial:
- address --> dex的起始位置
- len----->dex的长度
- DexHunter 与AppSpear
*主动初始化所有类- dex文件内存重构技术
反混淆
- 花指令
*simplifu- 动态执行去除花指令
- 名称混淆
- 根据类型信息重命名
Demo 360 renameByType
- 根据类型信息重命名
Hook
- 根据需求不同
- Hook 一切 ( Xopsed, Frida )
- Hook 自己 ( VirtualXposed, Legend )
Android应用的四大组件
Android 应用四大组件
-
Activity
- 具有用户界面的单一屏幕
- UI 相关
-
Service
- 后台运行的组建
-
Content Provider
- 共享应用数据
-
Broadcast Receiver
- 响应广播通知
-
组件需要在 Manifest 中申明注册
- BroadcastReceiver 也可以动态注册
-
组件生命周期
- onCreate, onResume …
-
组件间通信
- Intent 为载体,底层由 Binder 实现
应用层安全
-
内存破坏漏洞
- 底层服务
- 蓝牙、V8、Binder …
-
应用逻辑漏洞
- 空指针异常
- 权限设置(组件权限、存储权限)
- 支付流程
-
网络通信
-
SSL、Web 安全等
- 本质是权限控制
- exported = “true”Intent Scheme
- 本质是权限控制
-
Intent Scheme URLs
- browser -> Intent -> Activity
- 加载任意网页
-
addJavascriptInterface
*js调用java代码
*设备root
- root ~= 为所欲为
- 工程机的 root
- adb 以 root 模式启动,随后 drop 权限
- adb root —— adbd 始终以 root 权限运行
- 包含 su 命令
- 普通机器的 root
- 主动 root —— eg.superSU
- 被动 root —— 漏洞一把梭
- superSU
- 直接刷入一个 su 文件?
- system 分区以 nosetuid 挂载
- zygote 被 drop 权限
- SELinux 下划分了安全域
- superSU 架构
- daemonsu <-> UNIX socket <-> untrusted App·
- 直接刷入一个 su 文件?
网友评论