android 安全知识总结
静态: dex so
资源逆向工具 AXMKPrinter2(Android binary XML):
java -jar AXMLPrinter2.jar xxx.xml output.xml
查看源码工具dex2jar(dex->jar)、jd-GUI(jar->java):
APK逆向工具APKTool(resources.arsc/xml资源文件/.dex文件):
apktool d input.apk -o output
Android逆向助手(APKTOOL/jd-gui/dex2jar/jarsigner):
反汇编工具IDA PRO:
APK文件:
zip压缩包
解释性语言smali语言
反编译前结构:
assets 声音、字体、网页······资源【无编译可以直接查看】
com 第三方库,不解释
lib 应用中使用到的库
armeabi .so文件,C/C++代码库文件【重要】
META-INF APK的签名文件【***.RSA、***.SF、***.MF3文件】
org 第三方库,如org.apache.http库
res 应用中使用到的资源目录,已编译无法直接阅读
anim 动画资源animation
color 颜色资源
drawable 可绘制的图片资源
drawable-hdpi 图片资源高清
drawable-land 图片资源横向
drawable-land-hdpi 图片资源横向高清
drawable-mdpi 图片资源中等清晰度
drawable-port 图片资源纵向
drawable-port-hdpi 图片资源纵向高清
layout 页面布局文件
layout-land 页面布局文件横向
layout-port 页面布局文件纵向
xml 应用属性配置文件
AndroidManifest.xml 应用的属性定义文件,已压缩无法直接阅读【重要】
classes.dex Java源码编译后的代码文件【重要】
resources.arsc 编译后的资源文件,如strings.xml文件【重要】
反编译后结构:
assets 声音、字体、网页······资源
lib 应用中使用到的库
armeabi .so文件,C/C++代码库文件【重要】【JNI部分】【无法阅读】
META-INF APK的签名文件【***.RSA、***.SF、***.MF3文件】
org 第三方库,如org.apache.http库
res 应用中使用到的资源目录,目录下的东西可以直接阅读
anim 动画资源animation【可以直接阅读】
color 颜色资源【可以直接阅读】
drawable 可绘制的图片资源【可以直接阅读】
drawable-hdpi 图片资源高清【可以直接阅读】
drawable-land 图片资源横向【可以直接阅读】
drawable-land-hdpi 图片资源横向高清【可以直接阅读】
drawable-mdpi 图片资源中等清晰度【可以直接阅读】
drawable-port 图片资源纵向【可以直接阅读】
drawable-port-hdpi 图片资源纵向高清【可以直接阅读】
layout 页面布局文件【可以直接阅读】【重要】
layout-land 页面布局文件横向【可以直接阅读】【重要】
layout-port 页面布局文件纵向【可以直接阅读】【重要】
values
strings.xml 应用中使用到的字符串常量【可以直接阅读】【重要】
dimens.xml 间隔(dip、sp)常量【可以直接阅读】
xml 应用属性配置文件【可以直接阅读】
AndroidManifest.xml 应用的属性定义文件,【可以直接阅读】【重要】
smali Java 代码反编译后生成的代码文件,【smali语法】【重要】
apktool.ymlapktool 反编译的配置文件,用于重新打包
学习Smali语言的语法与结构
逆向分析.so文件,.so文件是二进制文件
分析DEX文件:Dalvik Executable
smali:DEX执行文件格式的汇编器
baksmali:DEX执行文件格式的反汇编器
DEX文件生成过程:
JVM虚拟机 Dalvik虚拟机
.Java文件-->Javac编译-->.class文件-->dx编译-->.dex文件
DEX文件结构: Header、Table、Data
Header:存储的是所有区域片段的大小、偏移量
Table:存储的是各种结构化数据、引用数据以及数据的偏移量
Data:存储的是具体的数据以及代码逻辑
虚拟机指令smali:
smali:寄存器指令
Java: 解释性语言
Smali语法基础:
Java语法 Smali语法 说明
private boolean isFlag .field private isFlag:z 定义变量
Package .class 指定当前的类名
.super 所继承的父类
.local 定义使用局部变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 12 此方法位于.java中的第12行,可去除,不影响运行结果
super invoke-super 调用父函数
const/high16 v0,0x7fo3 把ox7fo3赋值给v0
invoke-direct 调用函数
return Return-void 函数返回void
.end method 函数结束
new new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
if(vA == vB) if-eq vA,vB 如果vA等于vB
先写java代码,再反编译获取smali指令
分析SO文件:
广告植入与去除:
挂广告:导入SDK、权限配置、广告组件配置、初始化、加载插屏广告
收费限制:逻辑反转
汉化:strings.xml
动态:DDMS、emulator、Andbug、IDA PRO
代码安全分析: APK文件
组件安全分析:四大组件
存储安全分析:数据、私有文件
通信安全分析:证书密码技术
TraceView:方法跟踪
加入调试函数: Debug.startMethodTracing()/Debug.stopMethodTracing()
dmtracedump
graphviz
IDA PRO: so dex
Hook技术:劫持函数调用
java层级的hook:java反射
native层级的hook:ELF文件
ptrace函数附加进程:动态地attach(跟踪一个目标进程)、detach(结束跟踪一个目标进程)、peektext(获取内存字节)、poketext(向内存写入地址)等
加载so库:dlopen,以指定模式打开指定的动态链接库文件
目标进程的虚拟地址空间解析与ELF文件解析:
通过读取/proc/<PID>/maps文件找到链接库的基地址
读取动态库,解析ELF文件,找到符号(需要对ELF文件格式的深入理解)
计算目标函数ude绝对地址
目标进程函数绝对地址=函数地址+动态库基地址
用ptrace函数attach上目标进程
发现装载共享库so函数
装载指定的.so
让目标进程的执行流程转到注入的代码执行
使用ptrace函数的detach释放目标进程
ptrace函数:
int ptrace(int requets, int pid, int addr, int data)
request: 请求ptrace执行的操作
pid:目标进程的ID
addr:目标进程的地址值
data:作用的数据
Android中so库文件: Got表Hook、Sym表Hook、inline Hook
java反射问题: 无法反射调用关键字为native的方法函数(JNI实现的函数)、基本类型的静态常量无法反射修改
zygote进程:Hook框架Xposed、Cydiasubstrate(app_process)
Hook工具:
Xposed框架:/system/bin/app_process java层级
Per App Setting(为每个应用设置单独的dpi或修改权限)
Cydia
XPrivacy(防止隐私泄露)
BootManager(开启自启动程序管理应用)
安装本地服务XposedInstaller
下载使用API库
Cydiasubstrate框架:java/native层级
安装Cydiasubstrate框架本地服务
下载使用Cydiasubstrate库
ADBI/DDI框架:java/native层级
命令行工具
虚拟文件系统:/proc目录
Android内核空间和用户空间之间进行通信,查看当前进程的一些状态信息
maps文件查看进程的虚拟地址空间如何使用
cat /proc/<PID>/maps
/data/*.dex //java层级
/data/*.so //native层级
dev/__properties__
https://www.qubes-os.org/screenshots/
应用加固:
最小化组件暴露:
android:exported="false" //不跨应用,私有
protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem" //签名权限
android:permission= //访问权限
Activity安全:
私有Activity:android:exported="false"
公共Activity:android:exported="true"
伙伴Activity:android:exported="false" GetSignature getPackageInfo //应用签名
内部Activity:android:exported="true" protectionLevel="signature" GetSignature getPackageInfo //应用签名
Broadcast Receiver安全:LocalBroadcastManager
私有Broadcast Receiver:android:exported="false"
公共Broadcast Receiver:android:exported="true"
内部Broadcast Receiver:android:exported="true" protectionLevel="signature"
Service安全:
私有Service:android:exported="false"
公共Service:android:exported="true"
合作Service:android:exported="true" GetSignature getPackageInfo //应用签名
内部Service:android:exported="true" protectionLevel="signature"
Provider安全:
私有Content Provider:android:exported="false"
公共Content Provider:android:exported="true"
合作Content Provider:android:exported="true" GetSignature getPackageInfo //应用签名
内部Content Provider:android:exported="true" protectionLevel="signature" GetSignature getPackageInfo //应用签名
部分Content Provider:android:exported="false"
防止逆向:
代码混淆:花指令
ProGuard:压缩、优化和混淆代码
DEX保护:
DEX优化与混淆:
dalvik-obfuscato
加壳与解壳:
APKProtect、android-unpacker
SO文件保护:
upx
防止jd-GUI查看代码:
这个工具的bug
防止二次打包:
java层签名验证:
PackageInfo;->Signatures
底层签名验证:
/content/pm/Signature
防止动态分析:
调试程序:android_server、gdbserver
模拟器:Build.MODE="sdk"/"google_sdk"
系统安全:
启动验证:device-mapper-verity(dm-verity)
build/make/target/product/verity.mk PRODUCT_SUPPORTS_VERITY := true
SELinux:
对象管理器(Object Manager, OM)
访问权限缓存(Access Vector Cache, AVC)
安全服务
安全策略
主体(Subject): 进程
目标(Object): 资源
MAC: 对访问的控制强制化
TE:对于进程只赋予最小的权限
domain:迁移、防止权限升级
RBAC:对于用户只赋予最小的权限
安全上下文:user、role、type、sensitivity
身份认证:user
角色:role
安全类型:type
安全等级:sensitivity
App进程:service_contexts
App数据文件: seapp_contexts
系统文件: file_contexts
系统属性: property_contexts
android 安全知识总结相关推荐
- Xamarin Android教程Android基本知识版本介绍与系统介绍
Xamarin Android教程Android基本知识版本介绍与系统介绍 Xamarin Android教程Android基本知识版本介绍与系统介绍,开发Andriod有时候不像iOS一样轻松,因为 ...
- Android进阶知识:绘制流程(上)
1.前言 之前写过一篇Android进阶知识:事件分发与滑动冲突,主要研究的是关于Android中View事件分发与响应的流程.关于View除了事件传递流程还有一个很重要的就是View的绘制流程.一个 ...
- Android一些知识总结
Android一些知识总结 近来看zp的android视频,按照他的视频中开发了几个小软件,学到了一些自己以前都没有学到的知识,所以在这儿总结一下,偶尔温习对自己有很大的帮助吧. 1.关于paddin ...
- Android小知识10则(上)(2018.8重编版)
Android小知识10则(下) 目录 前言 横竖屏锁定 不同分辨率的图标 将字符串写在资源文件中 为AlertDialog设置点击监听 ProgressDialog了解一下 最后 前言 Androi ...
- MTK 驱动(4)---MTK Android Driver知识大全
MTK Android Driver知识大全 一.Display 1.lcm 相关概念 1.1) MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口).DPI(也叫RGB接口).DSI. 在 ...
- Android小知识10则(下)
Android小知识10则(上) github传送门 注: 在目录中点击可以跳转到具体代码页 目录 Chronometer和CountDownTimer计时器 Chronometer的使用 Count ...
- Android基础知识:在UI线程中运行代码
本文翻译自:Android basics: running code in the UI thread In the viewpoint of running code in the UI threa ...
- 100天精通Andriod逆向——第2天:Android基础知识和jadx的使用
目录 一.Android基础知识介绍 1.1 Android 历史版本 1.2 apk 包文件结构 1.3 Android系统目录介绍 二.jadx的使用 2.1 jadx 的简介 2.2 jadx ...
- Android基础知识(二十):Notification、提醒式通知(横幅)踩坑与通知界面设置跳转
Android基础知识(二十):Notification.提醒式通知(横幅)踩坑与通知界面设置跳转 一.Notification通知与基本用法 通知Notification是Android系统中比较有 ...
- Android基础知识【项目实训-实现二级导航“今日活动”及读取数据库】【5】
[该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 ...
最新文章
- 7.1 函数的一般形式
- IP Sec ***
- SQL Server 相关create操作语句
- ACL2020 | 基于Knowledge Embedding的多跳知识图谱问答
- Register code
- .net core 填坑记之—格式转换问题
- sklearn.preprocessing之数据预处理
- maven学习七之用户密码修改和添加用户
- 1.2.PHP7.1 狐教程-环境(Win下 PHP开发环境 配置及安装)
- 高等数学(第七版)同济大学 习题2-5 个人解答
- LabVIEW编程LabVIEW开发1920 LCR仪表例程与相关资料
- CityEngine+Python自动化建模实现【系列文章之四】
- VC++计算正反坐标方向角
- 现在的我,不想做管理
- Matlab 打不开 无法运行 win10 系统 卡在启动界面没有反应 语言bug
- 支付宝集福攻略,作为程序员的你集福了么?
- twitter三方登录的实现
- 用Python自动生成Excel报表
- 6种常见电流检测电路设计方案
- 若某非空二叉树的先序序列和后序序列正好相反,或者正好相同,则二叉树形态是怎么样的?
热门文章
- 网件路由器设置电子邮件发送日志到QQ邮箱
- 滑雪是不是要去北海道?学会Python电脑就能玩滑雪小游戏
- 第5章 域内横向移动分析及防御
- 【Micro USB选择指南】手工焊接Micro USB接口器件型号选择
- 微信小程序Audio音频(有关歌曲和图片的路径)
- MySQL 视图、索引、外键关联策略
- 【IoT】产品设计之思维模型:四种知识结构
- 企业合并_OA替换 | K2 BPM 为你解决企业“变革”大烦恼
- 计算机设计大赛作品抄袭会怎么样,如何界定借鉴和抄袭?看这7位设计大咖怎么说!...
- Elasticsearch短语或近似匹配及召回率案例深入剖析-搜索系统线上实战