安卓逆向学习---初始APKDalvik字节码以及Smali

出门莫恨无人随,书中车马多如簇。这篇文章主要讲述安卓逆向学习---初始APKDalvik字节码以及Smali相关的知识,希望能为你提供帮助。
参考链接:https://www.52pojie.cn/thread-395689-1-1.html
res目录下资源文件在编译时会自动生成索引文件(R.java ),
asset目录下的资源文件无需生成索引。
 
一般来说:使用C++游戏引擎的资源文件放在asset下
java开发中除音频和视频资源(放在raw或asset下),均放在res下。
 

  • Dalvik字节码是什么?
Dalvik是Google专门为android设计的一个虚拟机。
Dalvik VM是基于寄存器的,而JVM是基于栈的,Dalvik有专属的文件执行格式dex(Dalvik executable),jvm使用的是java字节码。
Dalvik VM你jvm速度更快,占用空间更少。
  • 什么是Smali?
Smali,baksmali分贝时指安卓系统里的java虚拟机(Dalvik)所使用的一种。dex格式文件的汇编器,反汇编器。
语法为一行宽松的Jasmin/dedeser语法,且实现了.dex格式的所用功能(注解,调试信息,线路信息等)。
 
对apk文件进行反汇编后,便会生成此类文件。其中在Dalvik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个寄存器表示。
 
  • Dalvik字节码有两种类型:原始类型,引用类型。

原始类型:
B --- byte
C --- char
D --- double
F --- float
I --- int
J --- long
S --- short
V --- void
Z --- boolean
[XXX --- array//数组表示方式:基本类型前加上“[”,eg:int型数组表示为:[I

LXXX/yyy --- object//对象表示以L开头,格式为LpackageName/objectName; (分号必须有)
//eg:String在Smali中为:LJava/lang.String; ,其中java/lang对应java.lang包,String就是定义在该包中的一个对象。

//内部类表示为:LpackName/objectName$subObjectName; 。即在内部类前面加“$”符号。

 
方法定义:Func-Name(para-Type1para-Type2para-Type3...)Return-Type//参数之间没有空格
eg:hello()v//void hello()
hello(III)Z//boolean hello(int,int,int)

hello(Z[I[ILjava/lang/String; J)Ljava/lang/String//String hello(boolean,int[],int[],String,long)

 
 
  • Smali基本语法
.field private isFlag:z  定义变量
.method方法
.parameter方法参数
.prologue  方法开始
.line 123此方法位于第123行
invoke-super调用父函数
const/high16 vO, 0x7fo3把0x7fo3赋值给v0
invoke-direct调用函数
return-void函数返回void
.end method函数结束
new-instance创建实例
iput-object对象赋值
iget-object调用对象
invoke-static调用静态函数
  • 条件跳转分支:
"if-eq vA, vB, :con_**"如果vA等于vB则跳转到:cond_ **
"if-ne vA, vB, :cond_**"如果vA不等于vB则跳转到:cond_ **
"if-It vA, vB, :cond_**"如果vA小于vB则跳转 到:cond_ **
"if-ge vA, vB, :cond_**"如果vA大于等于vB则跳转到:cond_ **
"if-gt vA, vB, :cond_**"如果vA大于vB则跳转到:cond_ **
"if-le vA, vB, :cond_ *"如果vA小于等于vB则跳转到:cond_ **
"if-eqz vA, :cond_**"如果vA等于0则跳转到:cond_ **
"if-nez vA, :cond_**"如果vA不等于0则跳转到:cond_ **
"if-Itz vA, :cond_**"如果vA小于0则跳转到:cond_**
"if-gez vA, :cond_**"如果vA大于等 于0则跳转到:cond_ **
"if-gtz vA, :cond_**"如果vA大于0则跳转到:cond_ **
"if-lez vA, :cond_**"如果vA小于 等于0则跳转到:cond **

【安卓逆向学习---初始APKDalvik字节码以及Smali】






    推荐阅读