安装包分析,又称逆向分析,即拿到应用程序的apk文件时,使用一些第三方工具进行反编译、抓包、注入等手段,对应用程序逻辑、数据结构、攻击方式进行分析,常用的分析方法分为静态分析与动态分析
静态分析
在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护等指标的一种代码分析技术,在Android 平台上,静态分析就是分析apk安装包,主要为了了解代码结构,逻辑的流程,修改、插入、去除逻辑,替换修改资源等。
工具
资源逆向工具:AXML_Printer2 Android 设备的一种xml文件编码格式,可以将Axml转化为可读的xml文件的工具
dex2jar、jd_GUI
dex2jar是一个用来将android 的dex文件转化为java类文件的工具,即我们常说的将dex转化为jar
jd_GUI:可以使jar文件的代码、结构、字段都变为java文件,使用者可以方便查看
apkTool:反编译APK文件,得到classes.dex文件,同时也能获取到资源文件以及布局文件。
Android 逆向助手(只有windows端)
国人对常用的工具封装得到的,工具包括:apktool、jd_gui、dex2jar、jarsigner等;主要功能有反编译apk、重新打包apk、对apk进行签名、反编译dex、重新打包成dex等。
分析dex文件
Dalvik虚拟机是谷歌专门为Android平台设计的一套虚拟机,区别于标准的java虚拟机JVM的class文件格式,Dalvik VM拥有专属的DEX可执行文件格式和指令集代码,smali和baksmali则是针对dex执行文件格式的汇编器和反汇编器,反汇编后的dex文件会产生.smali后缀的代码,smali代码拥有特定的格式与语法,smali语言对Dalvik虚拟机字节码的一种解释。
Dex的生成过程:
java文件 --->> javac编译 ----->> .class文件 ------>>> dx编译 ------->>.dex文件
逆向分析离不开Smali语言,本篇文章简单介绍下Smali,会专门写一篇文章来详细介绍Smali语言
Smali是寄存器指令,而java是解释性语言,理论上两者不能作为比较,这里做对比是为了大家能够快速的入门学习,
java语法 | Smali语法 | 说明 |
private boolean is_Flag | .field private isFlag:z | 定义变量 |
Package | .class | 指定当前的类名 |
.super | 所继承的父类 | |
.local | 定义使用的局部变量 | |
.method | 方法 | |
.parameter | 方法参数 | |
.prologue | 方法的开始 | |
.line12 | 此方法位于.java中的第12行(可在混淆文件中去除,去除无影响) | |
super | invokesuper | 调用父类函数 |
const/high16 v0,0X7fo3 | 把0x7fo3赋值给v0 | |
invokedirect | 调用函数 | |
Return void | 函数返回void | |
.end method | 函数结束 | |
new instance | 创建实例 | |
inputobject | 对象赋值 | |
igetobject | 调用对象 | |
invokestatic | 调用静态函数 | |
if(vA==vB) | if-eq vA,vB | 如果vA等于vB |
if(vA!=vB) | if-ne vA,vB | 如果vA不等于vB |
if(vA<vB) | if-lt vA,vB | 如果vA小于vB |
if(vA>=vB) | if-ge vA,vB | 如果vA大于等于vB |
if(vA>vB) | if-gt vA,vB | 如果vA大于vB |
if(vA<=vB) | if-le vA,vB | 如果vA小于等于vB |
if(vA==0) | if-eqz vA | 如果vA等于0 |
if(vA!=0) | if-ne vA | 如果vA不等于0 |
if(vA<0) | if-lt vA | 如果vA小于0 |
if(vA>=0) | if-ge vA | 如果vA大于等于0 |
if(vA>0) | if-gt vA | 如果vA大于0 |
if(vA<=0) | if-le vA | 如果vA小于等于0 |
以上是简短的smali语法,下面我们实战演示下反编译,反编译apk需要的工具:
apktool:反编译APK文件,得到classes.dex文件,同时也能获取到资源文件以及布局文件。
dex2jar:将反编译后的classes.dex文件转化为.jar文件。
jd-gui:用于将.jar文件转换成java代码。
首先确认好软件都已经安装成功,我的是mac电脑,以下操作都是在mac端进行的
①:使用命令chmod +x 分别对apktool和apktool.jar文件进行提权
//先进入到/usr/local/bin文件夹下 cd /usr/local/bin
chmod +x apktool
chmod +x apktool.jar
②测试是否成功,在/user/local/bin目录下输入:apktool
说明配置成功,
③:把你需要反编译的apk文件也复制到 /usr/local/bin 文件夹下,确保apktool、apktool.jar以及apk文件都在/usr/local/bin目录下,终端输入命令 apktool d xxx.apk回车,等待执行完毕:将dex文件解码为smali
下面就是反编译之后的文件
选中的即为smali文件地址。
以上两张图即时smali语法与java语法的原始版本,读者可对比着看
待续~