一、环境安装
1.1、安装Java环境
1.2、安装SDK环境
1.3、安装NDK环境
二、APK
2.1、文件结构
2.2、打包流程
2.3、安装流程
应用安装涉及目录:
system/app ----->系统自带的应用程序,获得adb root权限才能删除。
data/app ------->用户程序安装的目录,安装时把apk文件复制到此目录。
data/data -------> 存放应用程序的数据
data/dalvik-cache ------>将apk中dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一) 。
安装过程:
复制apk安装包到data/app目录下,解压并扫描安装包,把dex文件保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。
三、虚拟机
1、Java虚拟机--->Java字节码 ---->基于栈架构。
2、dalvik虚拟机(jit机制)---->android5.0以下---->dalvik字节码---->基于寄存器架构。
3、art虚拟机(aot机制)---->android5.0以上
注意:
.dex ---->dexopt--->.odex dalvik加载执行的odex文件。
.dex --->dex2oat --->.oat art加载执行的是oat文件。
四、Java逆向知识
4.1、dex文件反汇编工具
.java ---> .class ---->.dex ---->smail。
在这个过程中会使用三种工具
使用dx.jar工具将.class文件打包成.dex文件
使用baksmail.jar工具将.dex文件反编译成.smail文件
使用smail.jar工具将.smail文件打包成.dex文件。
4.2、dalvik字节码
数据类型对应:
dalvik Java
V ------------->void
Z ------------->boolean
B ------------->byte
C ------------->char
S ------------->short
I ------------->int
J ------------->long
F------------->float
D------------->double
L------------->java类类型
[------------->数组类型
字段:
Lorg/cocos2dx/lua/AppActivity;->handler:Landroid/os/Handler;
包名 类名 变量名 类型
方法:
Lpackage/name/ObjectName;->MethodName(III)Z
Lpackage/name/ObjectName:表示的是当前这个方法所在的类。
L是Java类类型,package/name/是包名,ObjectName是类名MethodName这部分表示的方法名
(III)Z:表示的是方法的签名信息,由方法参数列表(III)和返回值(Z)构成。
(III)表示三个int型参数;Z表示返回值类型为boolean。
4.3、dalvik指令集
基础字节码:名称后缀/字节码后缀 目的寄存器 源寄存“-”这个符号在有的指令里面没有的名称后缀是wide,表示数据宽度为64位,字节码后缀是from16,表示源寄存器为16位。
如move-wide/from16 vAA,VBBBB
move为基础字节码,即opcode、wide为名称后缀,标识指令操作的数据宽度为64位、from16为字节码后缀,标识源为一个16位的寄存器引用变量、vAA为目的寄存器,它始终在源的前面,取值范围为v0~v255 vBBBB为源寄存器,取值范围为v0~v65535。
dalvik指令集中大多数指令用到了寄存器作为目的的操作数或源操作数,其中A/B/C/D/E/F/G/H代表一个4位数值,AA/BB/CC...../GG代表一个8位的数值,A