Android安全与逆向分析
Android安全的重要性已无需多言,自从2017年各大主流加固采取vm化代码,加之各厂商的协议越来越底层和采用证书,更越发重视服务器的风险控制安全保障,对安卓软件和安卓系统的渗透测试已成为火热课题。
安卓逆向目录:
1.环境搭建
2.APK文件结构
3.APK打包流程
4.APK安装流程
5.APK反编译与回编译
6.编程语言 Java C/C++
7.虚拟机
8.Dalvik字节码
9.smali文件
10.快速定位关键代码
常用工具:
JDK/SDK/NDK
eclpise集成开发环境/Android Studio
AndroidKiller/jeb/jadx / GDA/Androidk逆向助手
IDA/GDB
apkhelper/getsign/APK上上签
模拟器(雷电、海马玩等)
MT管理器/RE文件管理器
工具安装注意事项:
1.jdk安装路径中不能有中文
2.ndk的配置路径中不能有中文和空格,可以把它放在根目录
3.安装包文件不全,运行会出错
4.没有配置环境变量可以按住shift+右键=>”在此处打开命令窗口”选项
5.ndk安装正确的提示
D:\android-ndk-r10e>ndk-build
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
D:\android-ndk-r10e\build/core/build-local.mk:143: *** Android NDK: Aborting. Stop.
APK文件:
APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。
APK文件目录:
assets 不经过 aapt 编译的资源文件
lib .so文件
META-INF 文件摘要,摘要加密和签名证书文件目录
CERT.RSA 公钥和加密算法描述
CERT.SF 加密文件,它是使用私钥对摘要明文加密后得到的密文信息,只有使用私钥配对的公钥才能解密该文件
MANIFEST.MF 程序清单文件,它包含包中所有文件的摘要明文
res 资源文件目录,二进制格式
drawable 图片
layout 布局
menu 菜单
resources.arsc 经过 aapt 编译过的资源文件
classes.dex 可执行文件
AndroidManifest.xml 配置文件
APK打包流程:
打包资源(res/assets/AndroidManifest.xml/Android基础类库)文件,生成R.java和resources.ap_文件
处理AIDL文件,生成对应的.java文件
编译Java文件,生成对应的.class文件
把.class文件转化成Davik VM支持的.dex文件
.java=>.class=>.dex
打包生成未签名的.apk文件
对未签名.apk文件进行签名
对签名后的.apk文件进行对齐处理
APK安装流程:
1.安装方式
系统程序安装
通过Android市场安装
ADB安装
手机自带安装
2.安装过程
复制APK安装包到/data/app目录下,解压并扫描安装包,把dex文 件(Dalvik字节码)保存到/data/dalvik-cache目录,并/data/data目录 下创建对应的应用数据目录。
3.安装后文件所在目录
/system/app
系统自带的应用程序,获得adb root权限才能删除
/data/app
用户程序安装的目录,安装时把apk文件复制到此目录
/data/data
存放应用程序的数据
/data/dalvik-cache
将apk中的dex文件安装到dalvik-cache目录下
4.卸载过程
删除安装过程中在上述三个目录下创建的文件及目录。
APK反编译与回编译:
先查壳,再反编译看验证
.dex=>.smali 反编译工具apktool
.dex=>.jar=>.class dex2jar
Apktool工具实际上只反编译以下三个文件:
AndroidManifest.xml classes.dex resources.arsc
去除广告和弹窗,撇开不存在于smali的这种情况,容易的就是可以在XML中寻到Activity,难的就是寻不到,发生这种情况时,就要分析代码,程序逻辑,抓住关键信息,界面和函数。
注意:
当字符串等关键信息搜不到时,可以从三个方向考虑:1.字符串在so层;2.字符串被加密了3.结合了服务器,服务器返回,本地显示。
编程语言:
Java代码=>smali汇编
C/C++=>ARM汇编
虚拟机:
1.java虚拟机
java字节码
基于栈架构
2.dalvik虚拟机(jit机制)
Android 5.0以下
dalvik字节码
dalvik可执行文件体积更小
基于寄存器架构
3.art虚拟机(aot机制)
Android 5.0版本及以上
注意:
.dex =>dexopt=>.odex dalvik加载执行的odex文件
.dex=>dex2oat=>.oat art加载执行的是oat文件
Dalvik字节码:
1.了解dalvik寄存器
dalvik中的寄存器都是32位
2.寄存器之v命名法与p命名法
参数寄存器
局部变量寄存器
3.dex文件反汇编工具
smali.jar\ddx.jar
4.类型
smali==>Java
V void
Z boolean
B byte
S short
C char
I int
J long
F float
D double
L java类类型
[ 数组类型
5.字段
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
6.方法
Lpackage/name/ObjectName;->MethodName(III)Z
smali文件:
无论是普通类、抽象类、接口类或者内部类,在反编译出的代码中,它 们都以单独的smali 文件来存放。每个 smali 文件都由若干条语句组成, 所有的语句都遵循着一套语法规范。
1.描述类的信息
.class < 访问权限> [ 修饰关键字] < 类名>
.super < 父类名>
.source <源文件名>
2. 静态字段
# static fields
.field < 访问权限> static [ 修饰关键字] < 字段名>:< 字段类型>
3.实例字段
# instance fields
.field < 访问权限> [ 修饰关键字] < 字段名>:< 字段类型>
4.直接方法
# direct methods
.method <访问权限> [ 修饰关键字] < 方法原型>
<.locals> “.locals ”指定了使用的局部变量的个数
[.parameter] “.parameter”指定了方法的参数
[.prologue] “.prologue ”指定了代码的开始处
[.line] “.line ”指定了该处指令在源代码中的行号
<代码体>
.end method
5. 虚方法的声明与直接方法相同,只是起始处的注释为“virtual methods”。
6.接口
# interfaces
.implements < 接口名>“.implements ”是接口关键字,后面的接口
名是 DexClassDef 结构中 interfacesOff 字段指定的内容。
7.注解
# annotations
.annotation [ 注解属性] < 注解类名>
[ 注解字段 = 值]
.end annotation
注解的作用范围可以是类、方法或字段。如果注解的作用范围是类, “.annotation ”指令会直接定义在 smali 文件中,如果是方法或字段,“.annotation ”指令则会包含在方法或字段定义中。
快速定位关键代码:
1.分析流程
搜索特征字符串
搜索关键api
通过方法名来判断方法的功能
2.快速定位关键代码
反编译APK程序
AndroidManifest.xml=>包名/系统版本/组件
程序的主activity
每个Android程序有且只有一个主Activity
分析程序的执行流程
需重点关注的application
application执行时间
授权验证
3.定位关键代码的技巧
信息反馈法(资源id/字符串)
特征函数法(api函数)
顺序查看法(分析程序执行流程/病毒分析)
代码注入法(动态调式/插入log/查看logcat/分析加解密)
栈跟踪法(动态调式/函数调用流程)
Method Profiling(方法剖析=>动态调式/热点分析//函数调用流程)